Autor Beitrag
Hagbard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP Home / Pro
D7.1 Architekt
BeitragVerfasst: Fr 24.06.05 08:55 
Hallo zusammen,

Ich möchte in etwa so, mit meinem Pointer durch ein ArrayOfChar durchrennen,
leider scheint das assigned(locPtr) nicht zu funktionieren, weil ein Pchar, selbst
direkt nach dem Deklarieren in einer Funktion schon assigned zu sein scheint.

Wie kann Ich trotzdem abfragen, ob mein PChar noch auf eine gültige Addresse in meinem
Array zeigt??

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.SkipSpaces(var locPtr: PChar);
begin

  if not assigned( locPtr ) then
    raise exception.Create('Pointer NULL');

  while (assigned(locPtr)) and (isSpace(Byte(locPtr^))) do
    locPtr := PChar ( locPtr + SizeOf(Char) );

end;


Vielen Dank, jetzt schonmal für Tipps und Anregungen ;-)

Grüße,
Christian

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.

_________________
I haven't failed, I just found 10,000 ways that won't work!
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Fr 24.06.05 09:03 
probiers mal mit IsBadReadPtr

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Fr 24.06.05 09:04 
Hi,

Im Prinzip ist es nicht möglich zu Prüfen, ob der Bereich auf den ein Pointer zeigt auch wirklich gültig ist. -> siehe Online Hilfe: Assigned
Du kannst prüfen ob der Pointer gültig ist.

Testen ob der Bereich, auf dein Pointer zeigt in deinem Bereich ist, kannst du per High() und Low() herausfinden. Allerdings solltest du eben dann @High() etc. verwenden.

Was die Gültigkeit deines PChar bzgl. Assigned betrifft:
In der Funktion dort wird ein var- Parameter übergeben, d.h. der Pointer wird mit hoher Wahrscheinlichkeit immer Assigned sein.. es sei denn der Param wird mit absicht auf Nil gesetzt.

Äh soweit.. ja *überleg* Ich hab bestimmt was vergessen..

HF :)

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Hagbard Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP Home / Pro
D7.1 Architekt
BeitragVerfasst: Fr 24.06.05 09:23 
Vielen Dank schonmal für Eure Antworten... das werde Ich mir gleich mal angucken!!!

Danke!!

_________________
I haven't failed, I just found 10,000 ways that won't work!
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Fr 24.06.05 09:58 
Hi

also du möchtest feststellen ob dein PChar auf eine Array-Element zeigt.

Example:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Function PointToElement(var locPtr: PChar): Boolean;
begin
  result := False;
  for i:=Low(Ar) to High(Ar) do
   if @locPtr^ = @Ar[i] then begin
      result := True;
      Break;
  end;
end;
  
  // if (@locPtr^ >= @Ar[Low(Ar)]) AND (@Ar[High(Ar)] >= @locPtr^) then
  // Diese Variante Funktionierte aufgrund der Operatoren nicht (kam man soviel ich weiß
  // in Delphi nicht selbst überladen bzw. implementieren), man könnte allerdings den
  // Zeiger in eine Int typecasten und die Dezimalwertigkeit in einer Menge überprüfen
  // möglicherweise eine alternative

_________________
mfg
Tana´Ri
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Fr 24.06.05 10:14 
@Tana'Ri:

Ich versteh den Kommentar in deinem Quellcode nicht. :gruebel:

Was genau meinst du?

Sowas hier geht nämlich:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
var
  test: array of char;
  pc: pchar;
  i: integer;
begin
  setlength(test, 2);
  test[0] := 'H';
  test[1] := 'i';

  pc := @test[0];

  for i := Low(test) to high(test) do
  begin
    if pchar(@test[i]) = pc then begin
      showmessage('valid');
    end;
    inc(pc);
  end;

  pc := @test[0];

  if (pc >= pchar(@test[low(test)])) and (pc <= pchar(@test[high(test)])) then
  begin
    showmessage('works');
  end;
end;

_________________
Stellen Sie sich bitte Zirkusmusik vor.