Seite 1 von 6
Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 11:56
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
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 12:37
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
Adresse eines String ist null
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 12:49
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
(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
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 13:03
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

Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 14:09
von DrShrek
Wiese gibt es dann hier keine Fehlermeldung:
Code: Alles auswählen
Define ipsumme1.s
Define ipsumme1$
Debug ipsumme1
Debug ipsumme1$
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 14:14
von bobobo
weil es so korrekt ist.
Ein leerer String (egal ob für den letztlich Speicher reserviert ist oder nicht) ist halt leer
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 14:35
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:
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 14:39
von bobobo
muss ja auch nicht logisch sein sondern nur korrekt.
nun stell ich mal zwei Fragen und die musst Du beantworten.
Was ist eine IntegerVariable?
Was ist ein String ?
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 14:45
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
Re: Adresse eines definierten Strings ist null
Verfasst: 17.05.2011 14:48
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:
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