Seite 2 von 6
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 14:56
von TomS
Es wurde doch schon gesagt, warum es so ist...
Speicherbereich für einen leeren String zu reservieren ist einfach unsinnig.
Eine Integer hat immer den selben Bereich, sobald sie einmal definiert ist. 32/64 bit, Zack bumm, Fertig.
Klar könnte man auch für einen String SizeOf(Char) reservieren und dann die Adresse zurückgeben.
Aber wozu? Sobald ich einen längeren String (ein einzelner Char is genaugenommen gar kein String) in diese Variable schreibe, brauch ich einen neuen Speicherbereich.
Code: Alles auswählen
Define notYetAString.s
Debug @notYetAString
notYetAString = "abc"
Debug @notYetAString
notYetAString = Space(2048)
Debug @notYetAString
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 15:15
von bobobo
DrShrek hat geschrieben:bobobo hat geschrieben:nun stell ich mal zwei Fragen und die musst Du beantworten.
1)Was ist eine IntegerVariable?
2) Was ist ein String ?
Die Antworten sind einfach:
zu 1: IchBineineLongVariable.l
zu 2:"Das ist ein String" und das ist ein leerer String ""
UndIchBinEineStringVariable.s (Kein Sting!)
Siehe hier auch nochmal den Unterschied:
Code: Alles auswählen
Define ipsumme1.s
Debug Len(ipsumme1)
Debug Len("")
Debug @""
Debug @ipsumme1
Das geht eindeutig nicht tief genug. Setzen 6
ich kommentiere das nun nicht weiter. da steht schon genug
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 15:21
von DrShrek
TomS hat geschrieben:Es wurde doch schon gesagt, warum es so ist...
Speicherbereich für einen leeren String zu reservieren ist einfach unsinnig.
Sorry. Aber wenn Du recht hast, dann erkläre doch warum dieser "" (= leere String) plötzlich eine Adresse bekommt?
Der könnte doch genauso ein Pointer auf NULL sein, PureBasic händelt das ja wie eine mit "" definierte Stringvariable.
Das Problem ist nicht der Pointer Null, sondern das PureBasic das handhabt als wenn es ein "" leerer String ist.
Das ist einfach eine unsaubere Handhabung von String Variabeln die NUR deklariert aber nicht definiert wurden.
Der Titel ist übrigends falsch, richtig wäre: BUG: Eine deklarierte String-Variable wird behandelt wie eine definierte String-Variable.
@Bobobo:
Ich mag 6
xen
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 15:42
von TomS
Strings in PB sind null-terminiert.
a.s = "" ist also nicht das gleiche wie Define a.s.
Durch das erstellen eines vermeintlich leeren Strings muss also schon 1 Byte Platz geschaffen werden. Für das Null-Byte. Und damit hast du dann auch eine Adresse.
Aber das hat helpy ja auch schon gesagt^^
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 15:47
von DrShrek
TomS hat geschrieben:Strings in PB sind null-terminiert.
a.s = "" ist also nicht das gleiche wie Define a.s.
Durch das erstellen eines vermeintlich leeren Strings muss also schon 1 Byte Platz geschaffen werden. Für das Null-Byte. Und damit hast du dann auch eine Adresse.
Aber das hat helpy ja auch schon gesagt^^
Ja das ist schon klar. Aber wie Du selbst sagts:
a.s = "" ist also nicht das gleiche wie
Define a.s. Aber es wird von PureBasic gleich behandelt. Das ist unsauber.
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 16:11
von NicTheQuick
Folgender Code
Ergebnis:
14006736
6558824
Fällt dir was auf?
Zwei völlig verschiedene Speicherbereiche. Der obere ist auf dem Heap, wurde also zur Laufzeit alloziert und der untere ist eine Konstante, die schon während dem Kompilieren in der EXE abgelegt wurde und die jetzt nur noch verlinkt wird per Pointer. PB sammelt alle konstanten Stringausdrücke in einem Code und setzt setzt sie in eine Art DataSection. Ich glaube im ASM-Output findet man die auch wieder.
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 17:47
von DrShrek
NicTheQuick hat geschrieben:Folgender Code
Ergebnis:
14006736
6558824
Fällt dir was auf?
Zwei völlig verschiedene Speicherbereiche. Der obere ist auf dem Heap, wurde also zur Laufzeit alloziert und der untere ist eine Konstante, die schon während dem Kompilieren in der EXE abgelegt wurde und die jetzt nur noch verlinkt wird per Pointer.
Fällt Dir was auf?
Ja, so habe ich das ja auch erwartet: Beide haben einen Pointer != NULL.
Also hat nichts mit den Verhalten zu tun wenn die Stringvariable nur deklariert ist = String Pointer == NULL
Re: Adresse eines definierten Strings ist null
Verfasst: 18.05.2011 10:04
von DrShrek
Wer mag den BUG ins englische Forum posten?
Re: Adresse eines definierten Strings ist null
Verfasst: 18.05.2011 13:52
von STARGÅTE
Sry aber Welchen BUG ?
ich sehe immer noch kein BUG, oder gehts jetzt um was anders ?
Wenn überhaupt wäre es ein Wunsch ... mehr auch nicht
Re: Adresse eines definierten Strings ist null
Verfasst: 18.05.2011 13:54
von CSHW89
Es ist kein Bug, sondern eine Design-Entscheidung.
Ihr könnt es ja als Wunsch im englischen Forum posten. Aber wundert euch nicht, wenn folgender Code länger dauert als gedacht:
Code: Alles auswählen
Dim a.s(1000000)
For i = 0 To 1000000
a(i) = Str(i)
Next
Wenn es nach euch geht, werden hier doppelt so viele String allokiert, als nötig. Erst 1000000 leere Strings, und dann 1000000 Strings mit der entsprechenden Zahl.
Der Zeit overhead ist zwar minimal, aber in 99,99% der Fälle komplett unnötig.
lg kevin