Seite 1 von 2

Strings sind doch auch nur Arrays

Verfasst: 02.07.2008 20:05
von teks
Nabend PB gemeinde,

Ich habe folgende Frage:
Ist es in PB möglich sowie in C++ eine Zeichenkette Char für Char auszulesen?
z.b. habe ich den String,

Test$="Das ist ein Test"

und möchte nun das Symbol an Position 2 des Strings ausgeben.
Also in etwa so:

Debug(Test[2])

Würde es funktionieren,würde man im Debugger nun lesen können:
"s"
(0=D,1=a,2=s!!)

Ich weiss, dass das nicht funktioniert aber mich würde interessieren ob es eine Möglichkeit gibt das zu erreichen?

danke =)

Verfasst: 02.07.2008 20:09
von ts-soft
Reicht den

Code: Alles auswählen

Debug Mid(Test$, 2, 1)
nicht?

Verfasst: 02.07.2008 20:20
von Kaeru Gaman
yo, natürlich geht auch was mit pointern...
aber wenn es nicht unbedingt nötig ist, sollte man lieber native stringfunktionen verwenden.

Verfasst: 02.07.2008 20:27
von teks
jo danke hab das inzwischen einfach mid Mid gemacht auch wenn ich das nicht sooo bequem finde, aber besser als nix
danke :)

Verfasst: 02.07.2008 20:28
von marco2007
Ich glaube, da könnte das Beispiel von NTQ weiterhelfen:

http://www.purebasic.fr/german/viewtopi ... chnapszahl

Verfasst: 02.07.2008 20:29
von Kaeru Gaman
also, ich finde es bequemer,
als einen mit Char strukturierten, als Array angelegten Pointer mit dem Stringpointer gleichzuschalten,
um darüber auf einzelne Zeichen zuzugreifen.

in C ist ein string nativ ein Chararray.
in Basic ist ein String ein nativer Typ, und man muss rumschrauben, um auf ihn als Chararray zuzugreifen.

Verfasst: 02.07.2008 20:34
von marco2007
Geb Dir vollkommen recht. Mir ist nur das Beispiel eingefallen, weil ich mal probierte, eine schnellere Variante zu machen.

zur Info: Meine war die langsamste :lol:

Verfasst: 02.07.2008 22:26
von hjbremer
ich glaube du meinst so etwas

wegen der unterschiedlichen internen Stringverwaltung von C zu PB funktioniert das so nur mit Fixstrings

im folgenden Beispiel sollte der Zugriff über text\c[ ] den Index 99 nicht überschreiten.

Code: Alles auswählen

Structure stringfeld
 StructureUnion
 s.s{100}
 c.c[0]    ;0 - 99 = 100 in diesem Fall
 EndStructureUnion
EndStructure 

text.stringfeld

text\s = "Hallo"
Debug text\c[4]  ;ergibt 111 für das o in Hallo, ab null gezählt

text\s = "Alles Banane"
Debug text\c[7]

das folgende Beispiel funktioniert zwar, aber nur solange korrekt, wie der String von PB intern nicht verschoben wird !!!
Da ich nicht weiß, wie die interne Stringverwaltung genau funktioniert, sind die folgenden beiden Methoden wohl recht unsicher.

Code: Alles auswählen

Structure stringfeld2
 c.c[0]
EndStructure


txt$ = "Hallo"

*t.stringfeld2 = @txt$
Debug *t\c[4]

*t.stringfeld2 = @"Hallo"
Debug *t\c[4]

Vielleicht kann ja mal einer der PB-Gurus uns die Stringverwaltung nahebringen :D

Das einfachste ist aber folgendes :mrgreen: :mrgreen: :mrgreen:

Code: Alles auswählen

txt$ = "Hallo"

Debug PeekC(@txt$+4)

Verfasst: 02.07.2008 22:34
von Kaeru Gaman
> wegen der unterschiedlichen internen Stringverwaltung von C zu PB funktioniert das so nur mit Fixstrings

nein, das ist so nicht richtig....

man kann einen strukturierten pointer mit nem array erzeugen,
und den dann auf den String verbiegen, das funktioniert, da bin ich sicher.

...aber ich weiß nicht genau wie, und finde mal ein stückchen code über die forensuche....

irgendwie so was ähnliches:

Code: Alles auswählen

*chararray.c[0] = a$
Debug *chararray[12]
aber das hier funktioniert eben nicht...

das muss so ähnlich funktionieren, wie ein strukturierter pointer auf einen allocierten speicherbereich...

Verfasst: 02.07.2008 23:03
von hjbremer
Fixstrings sind im Prinzip nix anderes als allocierter Speicher

also im Grunde folgendes

Code: Alles auswählen

Structure charfeld
 c.c[0]
EndStructure

a.s{100}

a = "Hallo hier bin ich"

*chararray.charfeld = @a 
Debug *chararray\c[12]
und einen Pointer, egal ob strukturiert oder nicht auf einen String verbiegen, funktioniert nur 100 prozentig wenn es ein Fixstring ist, denn die werden nicht verschoben, soviel ich weiß. Aber das verbiegen, siehe oben, macht selten Sinn finde ich, außer für die unter uns, die es von C gewohnt sind. Urbasicer nehmen PeekC.