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
[12295] Re:Re:Re:Re:구조체 리스트를 리턴 값으로 받을 수 있는지. 마무리 정리 합니다.
kylix [] 2235 읽음    2008-11-25 12:48
참고적으로 함수의 리턴값을 약간 바꾸시면 좀더 쉽게 포인터를 안쓰고 배열처럼 사용할 수가 있습니다.
원본 포인터를 보존하기 위한 StartList변수도 필요없고, 위치를 바꾸기 위해서 Inc를 이용해서 포인터 연산을 할 필요도 없습니다.
단 하나의 단점은 0번 인덱스 이외의 위치를 참조할 때는 반드시 변수를 써서 참조해야 된다는 점 밖에는... 나머지는 배열처럼 처리하시면 됩니다.

type
  TArrayList = array[0..0] of GList;
  PArrayList = ^TArrayList;

function GetList: PArrayList;

...

var
  List: PArrayList;
begin
  List := GetList();
  for Loop := 0 to nCnt - 1 do
  begin
     // List에 대한 내용 처리.
    List[Loop].somefield := somevalue;
  end;
end;


박귀정 님이 쓰신 글 :
: 여기 저기 참고하여 무엇이 문제인지 찾았습니다.
: 그래서 정리하는 의미에서 몇자 적어봅니다.
:
: // 구조체에 대한 record 생성 부분은 생략 합니다. GList라는 record를 생성함.
:
: PGList = ^GList; // record에 대한 포인터 선언
:
: var
:    List, StartList : PGList;
:  begin
:    List := GetGList();
:    StartList = List; // List 포인터를 증가하면서 데이터 처리를 해야 함으로 시작주소를 저장해 놓음.
:
:     for Loop := 0 to nCnt-1 do   // nCnt에 대한 것은 다른 함수를 통해 넘겨 받음.
:     begin
:        // List에 대한 내용 처리.
:       Inc(List);  // 포인터에 대한 증가 C에서는 List++;
:     end;
:     List = StartList; // 원래의 주소 값으로 바꿔줌.
:  end;
:
:  델파이를 처음하다보니 증가에 대한것을 잘 이해를 못했고
:  C에서 처럼 배열은 포인터다라는 생각을 가지고 있다 보니 해결이 안 되었던것 같습니다.
:  그리고 record 를 생성하면서 packed를 사용하다 보니 보내는 쪽과 데이터크기가 맞지 않았습니다.
:
:  구조체 데이터를 넘겨받을 때 데이터가 이상한 것은
:   1. 구조체와 record 간의 데이터 타입 변환이 잘 되었는지 확인.
:   2. packed를 양쪽 모두 사용하던지 모두 사용 안하던지 확인.
:
: 그러면 전혀 문제없이 사용이 가능할 것으로 봅니다.
:
: 조금 이나마 도움이 되었으면 합니다.
:
: 박귀정 님이 쓰신 글 :
: : 답변에 감사드립니다.
: :
: : 그러면 그냥 레코드 포인터만 선언해서 넘기면 된다는 말씀이신지...
: : 레코드 포인터만 넘기면 된다면은
: : 결과로 받은 List를 List[0] , List[1] 형태로해서 개수 만큼 사용하면 되는 건가요.
: : 함수 선언은
: : Function GetGList() : List; stdcall; external 'BugAPI.dll';
: : 이렇게 하면되나요?
: :
: : kylix 님이 쓰신 글 :
: : : var
: : :   List: ^GList;
: : : begin
: : :   List := GetGList;
: : : end;
: : :
: : : 박귀정 님이 쓰신 글 :
: : : : VC++ DLL에서 생성한 struct data list를 델파이에서 record 포인터로 받을 수 있는지요?
: : : :
: : : : 예를들면
: : : : typedef struct _GList
: : : : {
: : : :     UINT1    status;   
: : : :     UINT4      wpx;
: : : :                 UINT4      wpy;
: : : : }GList;
: : : :
: : : : === dll 함수 ===
: : : : GList * PASCAL GetGList() ;
: : : :
: : : : 위와같은 구조체에서 100개의 데이터를 dll에서 메모리 할당해서 델파이로 넘긴다고 한다면
: : : : 그냥 record 포인터로만 받으면 되는지... 받을 수 있다면 어떻게 하면 되는지 알려주십시오.

+ -

관련 글 리스트
12290 구조체 리스트를 리턴 값으로 받을 수 있는지. 박귀정 2109 2008/11/19
12291     Re:구조체 리스트를 리턴 값으로 받을 수 있는지. kylix 1995 2008/11/20
12292         Re:Re:구조체 리스트를 리턴 값으로 받을 수 있는지. 박귀정 1885 2008/11/20
12293             Re:Re:Re:구조체 리스트를 리턴 값으로 받을 수 있는지. 마무리 정리 합니다. 박귀정 1933 2008/11/24
12295                 Re:Re:Re:Re:구조체 리스트를 리턴 값으로 받을 수 있는지. 마무리 정리 합니다. kylix 2235 2008/11/25
12294                 Re:Re:Re:Re:구조체 리스트를 리턴 값으로 받을 수 있는지. 마무리 정리 합니다. (관련 소스좀 올려 멀더 2654 2008/11/25
12296                     Re:Re:Re:Re:Re:구조체 리스트를 리턴 값으로 받을 수 있는지. 관련 자료 입니다. 박귀정 2908 2008/11/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.