Avatar billede yates Nybegynder
19. juni 2006 - 09:16 Der er 9 kommentarer og
1 løsning

PChar: Ændre 'Urne' til 'Arne' er vel let nok?

Fik muligvis forklaret mig dårligt da jeg spurgte sidst, så her er en revideret udgave af spm som viser balladen:

var
  pArne: pchar;
begin
  pArne:='Urne'; //eller pArne:= fx en TMemorystream.memory

  pArne^:=#65;    //giver access violation, hvorfor??
  pArne[0]:= #65;  //giver access violation, hvorfor??
                   

end;

Nogen der kan forklare mig vhorfor eks ovenfor giver AV, og kan nogen vise mig hvorledes det skal gøres?

VH og tak.
Y.
Avatar billede arne_v Ekspert
19. juni 2006 - 12:42 #1
prøv:

var
  pArne: pchar;
  bArne: string;
begin
  bArne:='Urne'; //eller pArne:= fx en TMemorystream.memory
  pArne:=PChar(bArne);
  pArne^:=#65;    //giver access violation, hvorfor??
  pArne[0]:= #65;  //giver access violation, hvorfor??
Avatar billede yates Nybegynder
19. juni 2006 - 13:19 #2
Hej arne_v,

det du foreslår har jeg (selvfølgelig) også prøvet. Det funker ikke.

Jeg tror jeg har misforstået noget temmeligt grundlæggende, jeg ved bare ikke hvad.

Jeg ville være vældigt glad hvis du kunne forklare det eller vise et eksempel som  virker.

Y.
Avatar billede arne_v Ekspert
20. juni 2006 - 01:27 #3
det forstår jeg ikke - det virker fint hos mig

har du p og b præcis som jeg skitserede det ?
Avatar billede arne_v Ekspert
20. juni 2006 - 01:27 #4
testet med:

program PCharTest;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  pArne: pchar;
  bArne: string;

begin
  bArne:='Urne';
  pArne:=PChar(bArne);
  pArne^:=#65;
  pArne[0]:= #65;
  Writeln(bArne);
end.
Avatar billede yates Nybegynder
21. juni 2006 - 07:40 #5
Hej Arne,

dette her bliver mere og mere mystisk.
I tråd med eksemplet ovenfor laver jeg en form med et memo på og bruger


var
  p: pchar;
  s: string;
begin
  s:= 'Urne';
  p:= pchar(s);
  p^:= #65; //dette giver AV
  p[0]:= #65 //det gør dette også
  p:= 'Arne'; //dette må man gerne
  memo1.lines.add(string(p));
end;


Eksemplet ovenfor giver fin kompilering, men access violation når programmet køres (EAccessViolation).
Jeg vil meget gerne have styr på dette her- er der mon et eller andet kompilerswitch jeg kan have sat forkert (bruger altid bare default).
Er der noget package, uses eller et eller andet mystisk jeg kan have overset?

Det er afprøvet med både D3 og D7 under XP.

Afventer håbefuldt.
VH
Y.
Avatar billede arne_v Ekspert
22. juni 2006 - 04:29 #6
jeg er kommet lid videre !

procedure TForm1.Button1Click(Sender: TObject);

var
  p: pchar;
  s: string;

begin
  s:= 'Urne';
  p:= pchar(s);
  p^:= #65; //dette giver AV
  p[0]:= #65; //det gør dette også
  p:= 'Arne'; //dette må man gerne
  memo1.lines.add(string(p));
end;

fejler men

var
  p: pchar;
  s: string;

procedure TForm1.Button1Click(Sender: TObject);

begin
  s:= 'Urne';
  p:= pchar(s);
  p^:= #65; //dette giver AV
  p[0]:= #65; //det gør dette også
  p:= 'Arne'; //dette må man gerne
  memo1.lines.add(string(p));
end;

virker

d.v.s. at det virker når s er i heap og ikke på stack
Avatar billede arne_v Ekspert
22. juni 2006 - 04:36 #7
følgende virker:

procedure TForm1.Button1Click(Sender: TObject);

var
  p: pchar;
  s: string;

begin
  s:= 'Urne';
  p:=StrAlloc(length(s)+1);
  StrCopy(p,@s);
  p^:= #65; //dette giver AV
  p[0]:= #65; //det gør dette også
  p:= 'Arne'; //dette må man gerne
  memo1.lines.add(string(p));
end;
Avatar billede yates Nybegynder
22. juni 2006 - 09:49 #8
Hej Arne.

Det var helt uventet. Hvem  skulle have troet det?! Jeg kan ikke finde noget om dette i help-filerne noget sted.
For lige at præcisere, jeg gætter på (men kan ikke teste det her) at det er p (og ikke s) der skal være i heap'en, idet det jo er p der manipuleres.

Tusind tak for hjælpen - læg lige et svar.
Y.
Avatar billede arne_v Ekspert
22. juni 2006 - 13:24 #9
p er bare en pointer som peger på s

og det er s som skal ligge i heap så p peger på noget i heap

jeg kan heller ikke helt gennemskue logikken

jeg kan bare se hvad der virker og hvad der ikke virker

StrAlloc og StrCopy må være den rigtige måde

og et svar
Avatar billede yates Nybegynder
22. juni 2006 - 14:25 #10
Det virker egentlig fjollet hvis der er forskel i adgangsrettighederne på heap og stack under disse forhold. Prøver om jeg kan finde noget på nettet om det. Hvis du finder noget så skriv lige et par adresser her...

Y.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester