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
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

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
Das einfachste ist aber folgendes
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:
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.