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 :wink:
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

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

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 :bluescreen:

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:

Code: Alles auswählen

Define ipsumme1.l
Debug ipsumme1
Debug @ipsumme1

Re: Adresse eines definierten Strings ist null

Verfasst: 17.05.2011 14:39
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 ?

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:

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