Strings sind doch auch nur Arrays

Anfängerfragen zum Programmieren mit PureBasic.
teks
Beiträge: 7
Registriert: 02.07.2008 19:58

Strings sind doch auch nur Arrays

Beitrag 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 =)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Reicht den

Code: Alles auswählen

Debug Mid(Test$, 2, 1)
nicht?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
teks
Beiträge: 7
Registriert: 02.07.2008 19:58

Beitrag von teks »

jo danke hab das inzwischen einfach mid Mid gemacht auch wenn ich das nicht sooo bequem finde, aber besser als nix
danke :)
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Ich glaube, da könnte das Beispiel von NTQ weiterhelfen:

http://www.purebasic.fr/german/viewtopi ... chnapszahl
Windows 11 - PB 6.03 x64
_________________________________
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag 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:
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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)
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten