array of DataType 은 델파이만의 자료형입니다. string형처럼 자체적으로 메모리 관리를 하기 때문에, 다른 언어로 만들어진 DLL에서 사용하는 것은 좋지 않습니다.
배열의 크기가 명확하다면 아래와 같이 크기를 지정해서 사용하세요.
TResultArr = array[0..100] of TResultData;
그렇지 않다면 아래와 같이 선언해서 메모리 할당받으신 후에 사용하세요.
PResultArr = ^TResultArr ;
TResultArr = array[0..0] of TResultData;
앨리스 님이 쓰신 글 :
: 답변 감사드립니다. (__)
:
: 저도 일단 입력으로 넣는 배열이 메모리에 없어 생기는 문제로 생각하여
:
: 처음에 Count 만큼 가변배열을 만들어 입력했다가, Count 보다 많이 만들어 입력했다가, 전역에 고정 배열을
:
: Count 보다 많은 값으로 선언하여 입력했다가 등등을 확인해 보았습니다. 그런데도 에러가 계속 나네요. (....)
:
: 구조체에 들어가는 PChar 역시 StrAlloc 로 잡아도 보고 Alloclmem 으로 잡아도 보고 등등 해서 nil 이 없도록
:
: 신경을 썼는데도 계속 에러가 발생해서, 제가 DLL 을 포팅하는 방법이 잘못되었나 생각이 들어 질문글을 올려보게 되었습니다.
:
:
: 길이 님이 쓰신 글 :
: : Access Violation 오류는 거의 생성되있지않은공간을 이용하려고할때 발생합니다.
: :
: : 쉬운 예는
: : 배열의 크기를 3으로 생성해놓고, 4번5번째 배열을 사용하는경우 발생하죠...
: : 또 리스트박스에 항목이 1개만 추가도있는데 2번 항목을 어떠한 작업을 진행할경우 발생합니다.
: :
: : 혹시 모르니 참고만 하시길.............
: :
: : 앨리스 님이 쓰신 글 :
: : :
: : : 프로젝트를 진행하면서 DLL 파일을 하나 써야할 일이 생겼습니다.
: : :
: : : struct ResultData
: : : {
: : : Double No;
: : : char* name;
: : : char* value;
: : : char* min
: : : cahr* max;
: : : };
: : :
: : :
: : :
: : : int Upload(int Id, char* sessionName, int DataSize , struct ResultData* ResultDataArray, char* ErrCode);
: : :
: : : 대략 이런형식의 함수인데요. 결과값을 구조체에 넣어 배열형태로 DLL에 넣어야 하여,
: : :
: : : TResultData = Record
: : :
: : : No : Double;
: : : Name : PChar;
: : : Value : Pchar;
: : : min : Pchar;
: : : max : Pchar;
: : :
: : : end;
: : :
: : : TResultArr = Array of TResultData;
: : :
: : : function upload(ID:Integer;sessionName:Pchar;DataSize:Integer;var ResultData:TResultArr; var ErrCode:PChar);
: : :
: : : 이런식으로 포팅하여 실행해보았는데요.
: : :
: : : Access Violation 이 나면서 집에 들어가지 못하게 된 상황이 발생하였습니다. (...)
: : :
: : : 구조체로 입력하는 부분이 없는 다른 함수들은 잘 실행이 되는데, 구조체로 값을 입력해야 하는
: : :
: : : 저 함수만 실행하면 에러가 박박박 뜨네요. ;ㅁ;
: : :
: : : TResultArr 를 ^TResultArr 하여 PResultArr 로 만들어 넣어도 보고, 포인터 변수로 넣어도 보고
: : :
: : : ResultData를 포인터로 바꿔도 넣어보고 등등 별짓을 다 해봤는데, 몽땅 에러가 나구요 (...)
: : :
: : : function upload(ID:Integer;sessionName:Pchar;DataSize:Integer;var ResultData:TResultData; var ErrCode:PChar);
: : :
: : : 로 그냥 구조체 하나만 넣었을때는 에러가 없지만, 그렇게는 쓸수가 없는 함수여서...
: : :
: : : C로 된 구조체에선 그냥 ResultData* 로 선언한것을 Allocmem 하고 각 배열에서 다시 각 필드를 allocmem
: : :
: : : 하여 그냥 넣게 되어있는데, 왜 델파이에선 똑같이 한다고 해봐도 다 에러가 나는 걸까요 ;ㅁ;
: : :
: : : 출장와서 셔츠하나를 4일째 입고 있으려니, 몸이 간질간질해서 내일은 꼭 집에 가고 싶네요 ;ㅁ;
: : :
: : : 아시는 분들의 도움을 부탁드립니다. ㅠ_ㅠ
: : :
|