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 8)
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 6xen

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

Code: Alles auswählen

Define s.s = ""

Debug @s
Debug @""
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

Code: Alles auswählen

Define s.s = ""

Debug @s
Debug @""
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