Hvorfor ændrer den variabel sig?

Tags:    delphi

Jeg fatter virkelig ikke, hvad der foregår! Jeg har et array jeg bruger i en class, og for at være sikker på, at den er '' til at starte med, sætter jeg den specifikt til det. Det går fint nok. De næste mange mange linier af programmet eksekveres, hvor den stadig er ''. Men lige pludselig, nej, ikke længere, så bliver den det sidste af det tidligere index i arrayet. Jeg tjekker det ved den her kode:

Først (to relevante linier):

form1.label3.caption:=plugin[1].plLine1;
topname.caption:=plugin[setplug].plName;

(Den øverste linie er min måde at debugge det på). SetPlug er i øvrigt 0. I dette tilfælde står der ikke noget i label 3's caption (normalt står der noget, så den er synlig ved jeg).

Nu rykker jeg min debug linie ned på den anden side:

topname.caption:=plugin[setplug].plName;
form1.label3.caption:=plugin[1].plLine1;

Og nu står der lige pludselig "checker" i label3... Hva #¤%? "checker" er det sidste ord i plugin[0].plName, og da setplug er 0 må tingene jo hænge sammen, men hvordan kan et kald til topnames (en labels) caption ændre værdien af plugin[1]? Jeg fatter det virkelig ikke, og det er ved at drive mig til vanvid. Det må jo øjensynligt være noget andet, der foregår, men hvad det skulle være, kan jeg ikke lige se. Hvis en af jer ved det, eller en gang har oplevet noget lignende, eller bare har en idé, så lad mig endelig høre. Jeg er ved at gå fra forstanden!!!



1 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Jeg fatter virkelig ikke, hvad der foregår! Jeg har et array jeg bruger i en class, og for at være sikker på, at den er '' til at starte med, sætter jeg den specifikt til det. Det går fint nok. De næste mange mange linier af programmet eksekveres, hvor den stadig er ''. Men lige pludselig, nej, ikke længere, så bliver den det sidste af det tidligere index i arrayet. Jeg tjekker det ved den her kode:

Først (to relevante linier):

form1.label3.caption:=plugin[1].plLine1;
topname.caption:=plugin[setplug].plName;

(Den øverste linie er min måde at debugge det på). SetPlug er i øvrigt 0. I dette tilfælde står der ikke noget i label 3's caption (normalt står der noget, så den er synlig ved jeg).

Nu rykker jeg min debug linie ned på den anden side:

topname.caption:=plugin[setplug].plName;
form1.label3.caption:=plugin[1].plLine1;

Og nu står der lige pludselig "checker" i label3... Hva #¤%? "checker" er det sidste ord i plugin[0].plName, og da setplug er 0 må tingene jo hænge sammen, men hvordan kan et kald til topnames (en labels) caption ændre værdien af plugin[1]? Jeg fatter det virkelig ikke, og det er ved at drive mig til vanvid. Det må jo øjensynligt være noget andet, der foregår, men hvad det skulle være, kan jeg ikke lige se. Hvis en af jer ved det, eller en gang har oplevet noget lignende, eller bare har en idé, så lad mig endelig høre. Jeg er ved at gå fra forstanden!!!


Hej Carsten,

Det ville være nemmere at hjælpe dig med problemet hvis du kunne vise os hvordan din record ser ud (altså, den record som dit plugin array indeholder).

Men her er et par ting du kan prøve/checke:
1. Har du nul stillet alle elementer i dit array til at starte med?
2. Bruger du dynamisk array (array of type) eller statisk (array[0..n] of type)?
3. Hvis du bruger statisk, så skal du huske at nul stille hvert enkelt element i dit array.
4. Hvis du bruger dynamisk, så vil SetLength automatisk nul stille dine elementer hvis du bruger Strings, Varianter eller variant arrays i din record. Men bruger du der i mod PChar eller andre pointer typer så SKAL du selv nul stille arrayets elementer.
5. plName og plLine hvilken type er de???
- Hvis de er PChar så HUSK du SKAL allokere hukommelse til længden af dem streng du tildeler variablen inden du kopiere strengen til variablen. Og du skal selvfølgelig også deallokere dem igen når de ikke skal bruge mere.
- Hvis du har oprettet dem som array[0..n] of Char så sørg for at sætte alle elementerne i arrayet til #0 som det første.

Du skal også huske at selv om det virker når du kører det fra Delphi ide så kan det godt være at det ikke vil fungere korrekt når du kører programmet fra shell'en. Dette er fordi at delphi (når du debugger) sørger for at nulstille dine variabler men dette sker ikke når du starter programmet fra shell'en.

Hvis du vil ha' lidt mere specifik hjælp så må du meget gerne vise os hvordan din record ser ud og hvordan du initialisere den (fra dit dll og exe).

/Michael.



t