/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
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.



Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409070
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste