DUnit を TDD のドライバーとして使用して Delphi 5 でいくつかのソフトウェアを開発していましたが、CheckEqualsMem を使用すると、デバッガーで比較されているオブジェクト (この場合はロングワードの 2 つの配列) が比較されていることを確認できたにもかかわらず、失敗し続けることがわかりました。同一。
内部的には、CheckEqualsMem は CompareMem を使用し、これが false を返していることを発見しました。
もう少し深く掘り下げると、 @ または Addr を使用してオブジェクトのアドレスへのポインターで CompareMem を呼び出すと、メモリが同一であっても CompareMem が失敗することがわかりましたが、PByte (Windows から) または PChar を使用すると、メモリが適切に比較されます。 .
なんで?
ここに例があります
var
s1 : String;
s2 : String;
begin
s1 := 'test';
s2 := 'tesx';
// This correctly compares the first byte and does not return false
// since both strings have in their first position
if CompareMem(PByte(s1), PByte(s2), 1) = False then
Assert(False, 'Memory not equal');
// This however fails ?? What I think I am doing is passing a pointer
// to the address of the memory where the variable is and telling CompareMem
// to compare the first byte, but I must be misunderstanding something
if CompareMem(@s1,@s2,1) = False then
Assert(False,'Memory not equal');
// Using this syntax correctly fails when the objects are different in memory
// in this case the 4th byte is not equal between the strings and CompareMem
// now correctly fails
if CompareMem(PByte(s1),PByte(s2),4) = False then
Assert(False, 'Memory not equal');
end;
コメントでわかるように、私は C のバックグラウンドを持っているので、@s1 は s1 の最初のバイトへのポインターであり、PByte(s1) は同じものであるべきだと思いましたが、そうではありません。
ここで私は何を誤解していますか?@ / Addr と PByte の違いは何ですか??