Adresse eines definierten Strings ist null

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Adresse eines definierten Strings ist null

Beitrag von hjbremer »

Adresse eines definierten Strings ist null, das nervt und ist für mich ein BUG !

Nur wenn man einen String zuweist, gibt es eine Adresse, selbst wenn dies ein Nullstring ist

Code: Alles auswählen

Define ipsumme1.s
Define ipsumme1$

Debug @ipsumme1
Debug @ipsumme1$

ipsumme1 = ""
ipsumme1$ = ""

Debug @ipsumme1
Debug @ipsumme1$
PB 4.51 Windows X86
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
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 »

Adresse eines definierten Strings ist null, das nervt und ist für mich ein BUG !
Warum?
Bitte sage mir: Was willst du mit einer Adresse zu einem leeren String machen?
Warum sollte (wenn der String in einem Array mit 100 Feldern oder so steht) für 100 leere Strings Speicher reserviert werden?

Außerdem hatten wir das Thema doch bereits :wink:
Adresse eines String ist null
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
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Adresse eines definierten Strings ist null

Beitrag von bobobo »

wenn ein String eine feste Größe hätte (wie n Integer oder sowas) wäre es ein Bug.
So ist es halt nur Design (und das ist auch gut so)

ansonsten bleibt Dir sowas

Code: Alles auswählen

define.s  ipsumme1 = space(255)
(der Speicherberich von kleinen Strings ist auch nicht unbedingt fix (windows 32))

Code: Alles auswählen

EnableExplicit
Define i.l,t.l, is.l
Define ipsumme1.s =""
Define ipsumme1$ =""
Define.s  ipsumme2=Space(255)

Debug @ipsumme1
Debug @ipsumme1$
For i = 1 To 20 Step 1
  t+1
  ipsumme1 + Str(t)
  ipsumme1$ = "2"
  If is<>@ipsumme1
    Debug Str(@ipsumme1) +"::Speicheradresse ipsumme1 bei Länge:"+Str(Len(ipsumme1))
    Debug Str(@ipsumme2) +"::Speicheradresse ipsumme2 bei Länge:"+Str(Len(ipsumme2))
    ;Debug @ipsumme1$
    is=@ipsumme1
  EndIf
Next i
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

Re: Adresse eines definierten Strings ist null

Beitrag von shadow »

Also ich finde es ist so korrekt wie es ist.
In C/C++ z. B. ist ein String, der nicht definiert wurde, ein unreferenzierter Zeiger und kann üblen Schaden anrichten. Da ist es doch besser, man bekommt eine Fehlermeldung á la "String ist NULL" anstatt dass man ausversehen so sein System lahmlegt :bluescreen:
ThinkPad T61 (in Gedenken) | PureBasic 4.61 B1 (32) | Windows 7 (32SP1) | ArchLinux (32) | Syllable (32)
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Adresse eines definierten Strings ist null

Beitrag von DrShrek »

Wiese gibt es dann hier keine Fehlermeldung:

Code: Alles auswählen

Define ipsumme1.s
Define ipsumme1$

Debug ipsumme1
Debug ipsumme1$
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Adresse eines definierten Strings ist null

Beitrag von bobobo »

weil es so korrekt ist.
Ein leerer String (egal ob für den letztlich Speicher reserviert ist oder nicht) ist halt leer
‮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 »

bobobo hat geschrieben:weil es so korrekt ist.
Ein leerer String (egal ob für den letztlich Speicher reserviert ist oder nicht) ist halt leer
Das ist nicht logisch. Weil dann müsste es bei anderen Typen ähnlich sein:
String:

Code: Alles auswählen

Define ipsumme1.s
Define ipsumme1$
Debug ipsumme1
Debug ipsumme1$
Debug @ipsumme1
Debug @ipsumme1$
Long:

Code: Alles auswählen

Define ipsumme1.l
Debug ipsumme1
Debug @ipsumme1
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Adresse eines definierten Strings ist null

Beitrag von bobobo »

muss ja auch nicht logisch sein sondern nur korrekt. :lol:

nun stell ich mal zwei Fragen und die musst Du beantworten.

Was ist eine IntegerVariable?

Was ist ein String ?
‮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 »

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
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Adresse eines definierten Strings ist null

Beitrag von helpy »

Nur bei string-Variablen, denen bisher noch nichts zugewiesen wurde, ist der Zeiger NULL!

Wenn einer String-Variablen ein LeerString (test.s = "") zugeweisen wird, dann wird von PureBasic ein String-Speicher allokiert und der Zeiger auf die String-Variable ist ungleich NULL!

Dieses Verhalten wird auch an Unter-Routinen weitergegeben!
D.h. wenn eine String-Variable, der noch nichts zugewiesen wurde, an eine Procedure übergeben wird, so ist auch der Zeiger auf die Procedure-Variable gleich NULL. Im anderen Fall wird eine Kopie (!) des Strings (also ein neuer String-Speicher) von PureBasic angelegt!

Beispiel:

Code: Alles auswählen

Define test.s

Procedure testString(test.s)
	Debug @test
EndProcedure

Debug @test
testString(test)

test = ""
Debug @test
testString(test)
Ergebnis bei mir:

Code: Alles auswählen

0
0
4005548
4005580
Wenn eine Routine mit dem Pointer arbeiten will, muss diese unbedingt prüfen, ob dieser Null ist, ansonsten gibt es eine Fehlermeldung "Unbehandelte Ausnahme bei 0x........ in Programm.exe: 0x........: Zugriffsverletzung beim Schreiben an Position 0x00000000."!

Code: Alles auswählen

Define test.s

Procedure testString(test.s)
	Debug @test
EndProcedure

Procedure parseString(test.s)
	Protected *char.Character
	Protected c.c
	
	*char = @test
	Debug *char
	;c = *char\c   ; Da Pointer NULL ist, würde hier ein Fehler gemeldet werden!
	;Debug c
	
	If Not *char
		; Entsprechende Behandlung!
		Debug "Nicht initialisierter String!"
		ProcedureReturn
	EndIf
	
	c = *char\c
	Debug c
EndProcedure

MessageRequester("","test 1")
Debug @test
testString(test)
parseString(test)
Debug ""

MessageRequester("","test 2")
test = ""
Debug @test
testString(test)
parseString(test)
Debug ""

MessageRequester("","test 3")
test = "Hallo"
Debug @test
testString(test)
parseString(test)
==> Neben einen String "ABC" und einem leeren String ""
gibt es noch die initialisierten und nicht initialisierten String-Variablen!


cu,
guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Gesperrt