webForumDet fria alternativet

Gämföra records

Programmering

7 svar · 253 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#1

Varför kan jag inte gämföra records när jag kan tilldela en record en annan av samma typ?

Har en record som ser ut så här:

  TMapFormat = record
    id: integer;
    objfile: string;
    map : array [0..MapW, 0..MapH] of integer;
  end;

Och vill kolla om arrayen ändras genom att spara en kopia av strukturen.

if CurrentMap <> LAstMap then

Detta funkar inte :(

Medlem sedan maj 20018 027 inlägg
#2

Den där typen av jämförelser brukar bara funka för enkla datatyper som int, long, float, etc. Du kan kolla om Delphi har någon funktion motsvarande "memcmp()". Med en sådan funktion skulle du kunna jämföra stora minnesblock.

Medlem sedan maj 20002 993 inlägg
#3

vet inte vad jag ska söka på... verkar inte finnas i memory rutines eller vad det kllas i hjälpen iaf :l

Medlem sedan maj 20002 993 inlägg
#4

okej. nu har jag hittat funkationen MemoryCompare men jag vet inte hur jag ska använda den eftersom den alltidd returnerar false :(

Medlem sedan maj 20002 993 inlägg
#5
CompareMem(@struct1,@struct1,sizeof(TStruct))

Returnerar true.

struct2 := struct1;
CompareMem(@struct1,@struct2,sizeof(TStruct))

Returnerar false. Varför? De innehåller ju samma data!

Medlem sedan maj 20018 027 inlägg
#6

Alpha II skrev:

struct2 := struct1;
CompareMem(@struct1,@struct2,sizeof(TStruct))

Returnerar false. Varför? De innehåller ju samma data!

Innehåller de även samma id och objfile? Gissningsvis har de olika id. I så fall kommer CompareMem att hitta en skillnad i minnesblocket redan där. Du kanske skulle jämföra enbart medlemmen "map" med hjälp av CompareMem. Då skulle du sannolikt lyckas bättre. Du kanske ska jämföra även objfile, men det beror ju på hur du har tänkt dig att programmet ska fungera.

Medlem sedan maj 20002 993 inlägg
#7

Ja de innehåller exakt samma sak om jag tilldelade struct1 tilll struct2 :) Antar jag iaf...

Denna kod funkar i mitt riktiga program men i en litet test program jag skrev funkade det inte

Medlem sedan maj 20018 027 inlägg
#8

Om man gör en parallell med C, skulle medlemmen "map" vara en pekare mot en matris av integers. Då kommer pekaren i de båda structerna peka mot varsitt minnesblock, som iofs kan innehålla samma saker, men eftersom det är två skilda minnesblock, kommer adresserna i pekarna vara olika. Därför kommer "CompareMem"-jämförelsen resultera i att structerna skiljer sig från varandra. Pröva därför att jämföra "id" och "objfile" för sig, och sedan "map" med hjälp av "CompareMem". Du får alltså göra flera jämförelser för att ta reda på om structerna innehåller likadana data.

268 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)