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. :bounce:

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. :shock:
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 :wink:
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