|
제가 필요에 의해 BCB 프로젝트에 델파이 소스 유닛을 몇몇 추가해서 사용하고 있습니다.
사용하다 모르는 부분이 좀 있어서요.
예를 들면...
델파이 DataModule에 다음과 같이 코딩해놨습니다.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
const
MaxCount = 1024;
type
TMyInfo = packed record
A: String;
B: Integer;
C: String;
D: String;
end;
TDMComm = class(TDataModule)
private
FMyInfos: array[0..Pred(MaxCount)] of TMyInfo;
function GetMyInfo(Index: Integer): TMyInfo;
procedure SetMyInfo(Index: Integer; NewInfo: TMyInfo);
public
property MyInfos[Index: Integer]: TMyInfo read GetMyInfo write SetMyInfo;
end;
function TDMComm.GetMyInfo(Index: Integer): TMyInfo;
begin
//범위체크 코드...
Result := FMyInfos[Index];
end;
procedure TDMComm.SetMyInfo(Index: Integer; NewInfo: TMyInfo);
begin
//범위체크 코드...
FMyInfos[Index] := NewInfo;
end;
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
그담에 C++ 코드에서 TDMComm::MyInfos property에 접근하죠.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
void __fastcall TFormMain::Button1Click(TObject* Sender)
{
TMyInfo MI;
for (int i = 0; i < MaxCount; ++i)
{
MI = DMComm->MyInfos[i];
//MI 내용 변경 작업.
DMComm->MyInfos[i] = MI;
}
}
void __fastcall TFormMain::Button2Click(TObject* Sender)
{
TMyInfo MI;
AnsiString Str;
for (int i = 0; i < MaxCount; ++i)
{
MI = DMComm->MyInfos[i];
// Str = MI.A + "\t" + IntToStr(MI.B) + "\t" +
// MI.C + "\t" + MI.D;
// Memo1->Lines->Add(Str);
}
}
이렇게 하면 먼저 Button1 클릭시는 문제가 없는데
Button2 클릭시 for 문 진입해서 첫 MI = DMComm->MyInfos[i]; 에서 곧바로 오류가 발생(엑세스 바이얼레이션)하더군요.
이것저것 테스트 해보다 보니 어떤 순간엔 (Call Stack 에서 확인한)_CopyRecord 에서 문제가 생기는 경우도 있고...
델파이랑 C++간에 구조체를 서로 주고 받는 과정에서 무언가 차이가 있는건지 궁금하네요.
p.s. 구조체 선언시 packed record 로도 해보고 그냥 record 로도 해봤는데 차이가 없는거 같습니다.;;
|