Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[15170] Re:Re:Re: 네. 그부분은 확인해보았습니다.
앨리스 [babelfish] 2086 읽음    2014-05-22 11:36
답변 감사드립니다. (__)

답변 주신대로 , TResultArr = Array of TResultData; 부분을

  TResultArr = array[0..0] of TResultData;
  PResultArr = ^TResultArr ;

로 바꾸고,

function upload(ID:Integer;sessionName:Pchar;DataSize:Integer;var ResultData:PResultArr; var ErrCode:PChar);

로 선언하였습니다.

변수는 별도로 Array of TResultData 로 가변배열을 잡아, SetLength 한후 함수를 콜할땐 @ResultData 하여 포인터를

넘기도록 해보았는데요. 여전히 에러가 나네요 (...)

  TResultArr = array[0..0] of TResultData;
  PResultArr = ^TResultArr ;

로 메모리 할당을 받으라는 내용이 있었는데, 어떤식으로 할당을 받는걸 말씀하시는지를 여쭐수 있을까요.


kylix 님이 쓰신 글 :
: 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일째 입고 있으려니, 몸이 간질간질해서 내일은 꼭 집에 가고 싶네요 ;ㅁ;
: : : :
: : : : 아시는 분들의 도움을 부탁드립니다. ㅠ_ㅠ
: : : :

+ -

관련 글 리스트
15166 Char* 를 멤버로 갖는 구조체를 입력해야하는 DLL을 호출하다 집에 못들어감 (...) 앨리스 2326 2014/05/22
15167     Re:Char* 를 멤버로 갖는 구조체를 입력해야하는 DLL을 호출하다 집에 못들어감 (...) 길이 2264 2014/05/22
15168         Re: 네. 그부분은 확인해보았습니다. 앨리스 2033 2014/05/22
15169             Re:Re: 네. 그부분은 확인해보았습니다. kylix 1994 2014/05/22
15170                 Re:Re:Re: 네. 그부분은 확인해보았습니다. 앨리스 2086 2014/05/22
15171                     Re:Re:Re:Re: 네. 그부분은 확인해보았습니다. kylix 2181 2014/05/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.