Seite 1 von 2
Arbeiten mit Zeiger/Pointer
Verfasst: 05.02.2013 19:32
von dysti
Könnt ihr mir erklären, wie ich folgendes per Zeiger/Pointer erreichen kann:
Ich habe folgenden String:
„11 1333 22 44444 2339 3223 44444 777777 „
Der String sollte nachher so aussehen:
„11 1003 22 40004 20009 3003 40004 700007“
Wie kann man das mit Zeigern/Pointern erreichen?
Re: Arbeiten mit Zeiger/Pointer
Verfasst: 05.02.2013 19:46
von STARGÅTE
Wenn die Stringlänge sich änder garnicht. Wenn das im Beispiel nur ein versehen ist, dann so:
Code: Alles auswählen
Structure CharacterArray
c.c[0]
EndStructure
Procedure Umwanden(*Char.CharacterArray)
Protected I.i
While *Char\c[I]
Select *Char\c[I]
Case '0' To '9'
If (I <> 0 And *Char\c[I-1] <> ' ') And (*Char\c[I+1] <> ' ' And *Char\c[I+1] <> #NUL)
*Char\c[I] = '0'
EndIf
EndSelect
I + 1
Wend
EndProcedure
Define String.s = "11 1333 22 44444 2339 3223 44444 777777"
Debug String
Umwanden(@String)
Debug String
Re: Arbeiten mit Zeiger/Pointer
Verfasst: 05.02.2013 20:23
von dysti
Toll, jetzt muß ich das nur noch verstehen.

Re: Arbeiten mit Zeiger/Pointer
Verfasst: 05.02.2013 20:35
von STARGÅTE
Umwanden(@String) übergibgt die Adresse der Zeichenkette an die Prozedur.
Die Struktur CharacterArray, besteht aus einem Array von Zeichen (Characters).
Mit der Laufvariable I durchlaufe ich nun die Adresse der Zeichenkette und lese so Zeichen für Zeichen.
Mit I-1 oder I+1 kann ich halt auf Vorgägerzeichen oder nachfolgende Zeichen zugreifen.
Re: Arbeiten mit Zeiger/Pointer
Verfasst: 05.02.2013 21:45
von Kurzer
STARGÅTE hat geschrieben:
Code: Alles auswählen
Structure CharacterArray
c.c[0]
EndStructure
*Char.CharacterArray
Das ist ja nen toller Trick.
Ich staune immer wieder über so kleine Überraschungen.
c.c[0] passt sich also variabel an? Cool.
Re: Arbeiten mit Zeiger/Pointer
Verfasst: 05.02.2013 23:29
von dysti
Ist das Array begrenzt oder nur abhängig vom Arbeitsspeicher?
Re: Arbeiten mit Zeiger/Pointer
Verfasst: 05.02.2013 23:39
von ts-soft
dysti hat geschrieben:Ist das Array begrenzt oder nur abhängig vom Arbeitsspeicher?
Der Speicher Deines Strings zeigt auf das Array, somit sollte die Grösse klar sein

Wobei der maximale Index des statischen Arrays einem Integer entspricht. Die Grösse
hängt allerdings auch vom Typ ab.
Code: Alles auswählen
Structure CharacterArray
c.c[0]
EndStructure
*p.CharacterArray = AllocateMemory(WasSystemHerGibt) ; Speicher zuordnen
*p\c[0 - MaxInteger] ; ansprechen per Index
Re: Arbeiten mit Zeiger/Pointer
Verfasst: 06.02.2013 01:27
von STARGÅTE
[0] ist absichtlich von PB zugelassen als "uneigentliches Array"
Bei [10] bekommst du ja vom Debugger n Error, wenn du auf [11] zugreifen willst.
Bei [0] darfst du dass.
Re: Arbeiten mit Zeiger/Pointer
Verfasst: 06.02.2013 09:17
von Kurzer
Danke für die Erklärungen.

Kriegt man das im Laufe der Zeit einfach mal raus oder steht sowas in der Hilfe?
Re: Arbeiten mit Zeiger/Pointer
Verfasst: 06.02.2013 10:34
von dysti
Von mir auch DANKE.
Werde später sicherlich noch Fragen haben