|
| Pointer overførsel Fra : Carsten |
Dato : 28-09-10 14:15 |
|
Her under er et lille program hvor jeg ønsker at gemme pointer værdien
af variablen "testvar";
Linjen hvor jeg skriver "I2C0Bufer:=@data;" giver det rigtige resultat.
Linjen hvor jeg skriver "I2C0Bufer:=pointer(data);" giver det forkerte.
Jeg ville have troet at det skulle være omvendt.
Er der en logisk forklaring på det.
Carsten
--------------------------------------------
var
I2C0Bufer:pointer;
testvar:array[0..4] of char ='Test';
Procedure WriteFlashRam(var data);
Begin
I2C0Bufer:=@data;
WriteLn(IntToHex(longint(I2C0Bufer),8));
I2C0Bufer:=pointer(data);
WriteLn(IntToHex(longint(I2C0Bufer),8));
End;
Begin
WriteLn(IntToHex(longint(@testvar),8));
WriteFlashRam(testvar);
End.
| |
Uffe Kousgaard (28-09-2010)
| Kommentar Fra : Uffe Kousgaard |
Dato : 28-09-10 20:27 |
|
"Carsten" <carsten_no-mail_@beas.dk> wrote in message
news:4ca1ea7a$0$56786$edfadb0f@dtext02.news.tele.dk...
> Her under er et lille program hvor jeg ønsker at gemme pointer værdien af
> variablen "testvar";
> Linjen hvor jeg skriver "I2C0Bufer:=@data;" giver det rigtige resultat.
Dette giver dig adressen på hvor data er gemt i hukommelsen
> Linjen hvor jeg skriver "I2C0Bufer:=pointer(data);" giver det forkerte.
Dette er et typecast af data til en pointer, som er det samme som en
integer. Altså ikke adressen på data, men selve data.
Dette havde givet samme resultat:
I2C0Bufer:= integer(data);
| |
Carsten (29-09-2010)
| Kommentar Fra : Carsten |
Dato : 29-09-10 08:08 |
|
Uffe Kousgaard wrote:
> "Carsten"<carsten_no-mail_@beas.dk> wrote in message
> news:4ca1ea7a$0$56786$edfadb0f@dtext02.news.tele.dk...
>> Her under er et lille program hvor jeg ønsker at gemme pointer værdien af
>> variablen "testvar";
>
>> Linjen hvor jeg skriver "I2C0Bufer:=@data;" giver det rigtige resultat.
> Dette giver dig adressen på hvor data er gemt i hukommelsen
Dette var også det jeg ville have forventet (et eller andet sted på
stakken), men resultatet er adressen hvor "testvar" er gemt. D.v.s at
WriteFlashRam(testvar); (imellem Begin og End. i hoved programmet)
I2C0Bufer:=@data;
WriteLn(IntToHex(longint(I2C0Bufer),8));
udskriver samme resultat.
>
>> Linjen hvor jeg skriver "I2C0Bufer:=pointer(data);" giver det forkerte.
> Dette er et typecast af data til en pointer, som er det samme som en
> integer. Altså ikke adressen på data, men selve data.
Jeg er igen enig med din konklusion, men jeg kan ikke få det til at
stemme med det der udskrives, der udskrives placeringen af data og ikke
indholdet.
Jeg har testet det i Delphi og FPC med samme resultat.
Carsten
| |
Uffe Kousgaard (29-09-2010)
| Kommentar Fra : Uffe Kousgaard |
Dato : 29-09-10 08:30 |
|
"Carsten" <carsten_no-mail_@beas.dk> wrote in message
news:4ca2e5ff$0$56782$edfadb0f@dtext02.news.tele.dk...
> Dette var også det jeg ville have forventet (et eller andet sted på
> stakken), men resultatet er adressen hvor "testvar" er gemt. D.v.s at
Men testvar og data er jo det samme, når WriteFlashRam tager en var
parameter?
Jeg kan ikke helt se problemet.
| |
Carsten (01-10-2010)
| Kommentar Fra : Carsten |
Dato : 01-10-10 06:57 |
|
> Men testvar og data er jo det samme, når WriteFlashRam tager en var
> parameter?
>
> Jeg kan ikke helt se problemet.
>
Man kan sige det er mig der ikke har læst manualen for Delphi/Fpc godt
nok. Det fremgår sikkert deraf.
Jeg har skrevet et lille program som du kan se i bunden, og det der
skrives ud.
Min forventning var at de 2 procedure ville opføre sig ens da det i
begge tilfælde er pointere der bahandles.
Det er ikke tilfældet.
Så har jeg lært det også.
Carsten
-------------------------------
Type
testvar_typ=array[0..4] of char;
var
I2C0Bufer:pointer;
testvar:testvar_typ='Test';
Procedure WriteFlashRam(var data);
Begin
I2C0Bufer:=@data;
WriteLn(IntToHex(longint(I2C0Bufer),8)); {Udskriv adresse på pointer}
I2C0Bufer:=pointer(data);
WriteLn(IntToHex(longint(I2C0Bufer),8)); {Udskriv adresse på testvar}
End;
Procedure TestPointer(data:pointer);
Begin
I2C0Bufer:=@data;
WriteLn(IntToHex(longint(I2C0Bufer),8)); {Udskriv adresse på pointer}
I2C0Bufer:=pointer(data);
WriteLn(IntToHex(longint(I2C0Bufer),8)); {Udskriv adresse på testvar}
End;
Begin
WriteLn(IntToHex(longint(@testvar),8)); {Udskriv adresse på testvar}
writeln('--');
WriteFlashRam(testvar);
writeln('--');
TestPointer(@testvar);
End.
---------------------------------
0046C4C0
--
0046C4C0
74736554
--
0012FF98
0046C4C0
| |
Uffe Kousgaard (01-10-2010)
| Kommentar Fra : Uffe Kousgaard |
Dato : 01-10-10 10:49 |
|
"Carsten" <carsten_no-mail_@beas.dk> wrote in message
news:4ca5784f$0$56778$edfadb0f@dtext02.news.tele.dk...
> I2C0Bufer:=@data;
> WriteLn(IntToHex(longint(I2C0Bufer),8)); {Udskriv adresse på pointer}
> I2C0Bufer:=pointer(data);
> WriteLn(IntToHex(longint(I2C0Bufer),8)); {Udskriv adresse på testvar}
Bare du har forstået at disse 2 ting ikke er det samme: Det ene er adressen
på data, det andet er et typecast til en pointer.
| |
|
|