Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
TuxForAll
Anmeldungsdatum: 24.06.2007 Beiträge: 9
|
Verfasst am: 24.06.2007, 12:43 Titel: String to zString Ptr Prob oder zwischen meinen Ohren? |
|
|
Hallo zusammen,
bin mir nicht sicher ob das Problem bei mir liegt oder bei FreeBASIC?
Code: |
#define NULL 0
dim tmpStr as string
dim Test_1 as zstring ptr = NULL
dim Test_2 as zstring ptr = NULL
tmpStr = "Free"
Test_1 = strptr(tmpStr)
tmpStr = "BASIC"
Test_2 = strptr(tmpStr)
print *Test_1; *Test_2
sleep
|
Ausgabe bei mir:
BASICBASIC
FB Version 0.18 Linux
Gruß
TuxForAll |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 24.06.2007, 12:53 Titel: |
|
|
du überschreibst die variable tmpStr. ich vermute, dass sie am gleichen Ort bleibt, also dass das "Free" überschrieben wird... is aber nur eine vermutung, weil um den sourcecode 100% zu verstehen, muss man sich schon ein wenig "verrenken"  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 24.06.2007, 13:01 Titel: |
|
|
wenn Du 2 verschiedene String anzeigen willst, egal ob als String, zString oder via pointer und co, bleibt Dir glaub nichts anderes uebrig als auch auf zwei strings zu zeigen...
Code: |
#define NULL 0
dim tmpStr1 as string
dim tmpStr2 as string
dim Test_1 as zstring ptr = NULL
dim Test_2 as zstring ptr = NULL
tmpStr1 = "Free"
tmpStr2 = "BASIC"
Test_1 = strptr(tmpStr1)
Test_2 = strptr(tmpStr2)
print *Test_1; *Test_2
sleep
|
_________________
 |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 24.06.2007, 13:59 Titel: |
|
|
Du kannst auch deine Version ein wenig anpassen, dann geht es auch:
Code: | #define NULL 0
dim tmpStr as string
dim Test_1 as zstring ptr = callocate(5) '4 Bytes für "Free" und 1 Byte (durch callocate 0-Byte) als "Schlussbyte"
dim Test_2 as zstring ptr = callocate(6) '5 .... "BASIC" ....
'Ein ZString muss immer ein 0-Byte am Ende haben, da nicht gespeichert wird, wie lang der String ist
'ein "normaler" String hat einen header, wo das alles drin gespeichert wird,
'da braucht man kein 0-Byte am Ende
tmpStr = "Free"
*Test_1 = *strptr(tmpStr)
tmpStr = "BASIC"
*Test_2 = *strptr(tmpStr)
print *Test_1; *Test_2
sleep
deallocate(Test_1)
deallocate(Test_2)
|
Man kann bei dieser Version den Umweg über den String auch weglassen.
Wichtig ist aber, dass man nicht zu viel Text in die Zstrings schreibt, bevor man den Speicherbereich dealloziert. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
TuxForAll
Anmeldungsdatum: 24.06.2007 Beiträge: 9
|
Verfasst am: 24.06.2007, 14:48 Titel: String to zString Ptr Prob oder zwischen meinen Ohren? |
|
|
Hallo,
nun gut, ist also ein FreeBASIC Problem.
@Programmierer
nee ist klar dat geht so aber das ist mir zu umständlich
@Eternal_plain
genau so habe ich es dann auch gemacht.
ich danke für die Antworten
Gruß
TuxForAll |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 24.06.2007, 16:22 Titel: |
|
|
oO
Das ist keinesfalls ein FB-Problem, das Problem liegt dann doch zwischen deinen Ohren (was du ja auch in Erwägung gezogen hast).
Spaß beiseite.
Pointer sind nunmal nur Zeiger auf einen Speicherbereich. In deinem Code hast du einen String gehabt, der "Free" enthielt. Jetzt lässt du den ersten Pointer auf genau die Anfangsadresse von "Free" zeigen.
Dann änderst du den ursprünglichen String in "BASIC" um. Der erste Pointer zeigt aber immer noch auf den Anfangsbereich von ursprünglich "Free", jetzt aber "BASIC"! Der Pointer zeigt immer noch auf genau das, was du ihm zugewiesen hast. Eine Adresse. Und du änderst nun den Speicher, der sich an dieser Adresse befindet.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 24.06.2007, 17:14 Titel: |
|
|
Moment: du lässt zwei Zeiger auf ein und die selbe stelle Zeigen (nämlich auf tmpStr). Und dann wunderst du dich darüber, dass zwei mal das selbe ausgegeben wird?
OK, gehen wir das ganze mal Zeile für zeile durch:
> tmpStr = "Free"
Zustand:
- Test_1 verweist auf 0
- Test_2 verweist auf 0
- tmpStr = "Free"
> Test_1 = strptr(tmpStr)
Zustand:
- Test_1 verweist auf tmpStr
- Test_2 verweist auf 0
- tmpStr = "Free"
> tmpStr = "BASIC"
Zustand:
- Test_1 verweist auf tmpStr
- Test_2 verweist auf 0
- tmpStr = "BASIC"
(könnte aber auch alle bisherigen Zeiger auf tmpStr invalidieren)
> Test_2 = strptr(tmpStr)
Zustand:
- Test_1 verweist auf tmpStr
- Test_2 verweist auf tmpStr
- tmpStr = "BASIC"
> print *Test_1; *Test_2
gibt als erstes das aus, auf das Test_1 verweist (was tmpStr ist) also "BASIC".
Dann gibt es gibt als das aus, auf das Test_2 verweist (was tmpStr ist) also "BASIC".
Wenn BASICBASIC rauskommt ist also alles perfekt. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit.
Zuletzt bearbeitet von helium am 24.06.2007, 17:52, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 24.06.2007, 17:41 Titel: |
|
|
Es gibt durch aus Situtationen wo ein anderes Verhalten möglich ist.
Wie Vielleicht bekannt, ist die länge eines Strings in Freebasic Variabel bzw. Dynamisch verwaltet.
Code: | #define NULL 0
dim tmpStr as string
dim Test_1 as zstring ptr = NULL
dim Test_2 as zstring ptr = NULL
tmpStr = "Free"
Test_1 = strptr(tmpStr)
tmpStr = " Ich bin eine Lange Leitung die viel zu Lang ist"
Test_2 = strptr(tmpStr)
? Test_1
? Test_2
print *Test_1; *Test_2
sleep |
Was sollte man daraus lernen?
Ein ZString-Pointer auf einen Freebasic String verliert nach dem ändern das Strings seine Gültigkeit.
Wer das nicht glaubt oder versteht wird über lang oder ehe kurz Pointer Probleme haben. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 24.06.2007, 17:55 Titel: |
|
|
csderats hat Folgendes geschrieben: | iwie logisch weil ja zstring fixed length ist.
deswegen gehts gar net anders... |
Hat damit aber an sich nix zu tun.
Test_1 verweist erst auf tmpStr. Dann wird tmpStr etwas zugewisen, was nciht reinpasst, also zieht tmpStr kurzerhand um an einen Ort, wo ausreichend Platz ist. Test_1 bekommt von diesem Umzug aber nichts mit und verweist deswegen immernoch dahin, wo sich vorher tmpStr befand.
Test_2 wird erst nach dem Umzug auf tmpStr gesetzt, verweist also natürlich auf die neue Addresse. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
 |
|