私は最近、Delphiプロジェクトの作業を開始し、非常に奇妙なコードを発見しました。デルファイでレコードのポインタをcharの配列に割り当てる - もう一度やりますか?
// Type declarations
type
TDataSet = record
VolumeLevel : char;
DeviceMasks : char;
DeviceList: array [1..MAX] of array [1..8] of char;
DisplayList: array [1..MAX] of array [1..8] of char;
end;
type
TSerialPacket = record
Preamble: array[1..4] of byte;
PacketType: byte;
PacketLen: byte;
Data: array of char;
Checksum: byte;
end;
...
// Private fields
Packet : TSerialPacket;
DataSet : TDataSet;
...
// Actual procedure
SetLength(Packet.Data, sizeof(DataSet));
Packet.Data := @DataSet;
私はDelphiを使用していないので、このコードは私には分かりません。コンパイラはこれが問題ないと思い、コードを実行することができます。私はデバッガでそれを走らせましたが、Packet.Dataの値は変わっていないようです。誰がこれが何をしているか教えてもらえますかchar型の配列にカスタムレコードのポインタを代入するのは非常に奇妙なようです。
また、何らかの理由でSetLengthがエラーを発生させます。 "プロジェクトFoo.exeが例外クラスEAccessViolationを 'モジュール' Foo.exe 'のアドレス00403860のアクセス違反で発生させました。アドレス00000000の読み取り"。 WorkingとCrashingの両方の実行中にPacket.Dataの値は()であり、dataofのsizeofは260です。正確に何が変更されているのかを特定することはできませんでした。私が知る限り、SetLengthはPacket.DataやDataSet以外の変数に依存してはいけません。
(Iは、Windows 7上のDelphi XEを使用)
FWIW:D2007で、私はコードを簡単に見てみると、 '[DCC Fehler] Project1.dpr(35):E2010 Inkompatible Typen: 'dynamic array'と' Pointer''を得ました。 –
奇妙な。 Packet.Data:= DataSetで「互換性のない型: 'dynamic array'とTDataSet」というエラーが発生しました。しかし、Packet.Data:= @DataSetはOKです。 –
Ah - mea culpa。私は{$ TYPEDADDRESS ON}を含むように私のデフォルトのコンパイラオプションを変更しました - これは違いを説明します。しかし、あなたが現在経験しているように、おそらくそれも含めるべきです。 :-) –