Adresse eines definierten Strings ist null

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Adresse eines definierten Strings ist null

Beitrag 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
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Adresse eines definierten Strings ist null

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Adresse eines definierten Strings ist null

Beitrag 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
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Adresse eines definierten Strings ist null

Beitrag 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^^
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Adresse eines definierten Strings ist null

Beitrag 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.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Adresse eines definierten Strings ist null

Beitrag 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.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Adresse eines definierten Strings ist null

Beitrag 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
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Adresse eines definierten Strings ist null

Beitrag von DrShrek »

Wer mag den BUG ins englische Forum posten?
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Adresse eines definierten Strings ist null

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Adresse eines definierten Strings ist null

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Gesperrt