Seite 4 von 6

Verfasst: 12.01.2009 15:24
von remi_meier
@ts-soft: Was läuft denn mit dir? :?

Selbst wenn die Funktion falsch benutzt wurde (weder #PB_Ignore
NOCH #PB_Any werden als Flags unterstützt!), muss sich die
Funktion an die Hilfe halten, welche besagt, dass nur die folgenden
3 Werte zurückgegeben werden dürfen:

Code: Alles auswählen

Debug #PB_String_Equal ; : wenn String1 gleich String2 ist
Debug  #PB_String_Lower ; : wenn String1 kleiner als String2 ist
Debug  #PB_String_Greater;: wenn String1 größer als String2 ist
Guess what, keine der drei Konstanten hat den Wert "21474...", wie
Andy erhielt.

-> Bug, ob du willst oder nicht. Der Debugger kann ja warnen, wenn
ein falsches Flag angegeben wird.

Und btw, glaubst du wirklich, dass konstante Strings nicht nullterminiert
sind? Tut mir leid, aber so verkorkst ist PB nun auch wieder nicht. Wenn
man sich nicht mal auf das verlassen kann, auf was dann?
Ob Stringkonstante oder Stringvariable darf keine Rolle spielen! Dieses
Feature wird von mir oft genutzt um API Funktionen aufzurufen...


Sowas von ignorant :roll: , hätte ich nicht von dir erwartet...

Verfasst: 12.01.2009 16:17
von ts-soft

Code: Alles auswählen

Text1 = @"HaHa"
Ich glaube nicht, das hier der Stringmanager eingreift. Wenn man dies einer
API übergibt, funktioniert es ja auch, aber es ist nicht sichergestellt, das dies
von PB wie ein String behandelt wird. Mit solchen konstruktionen gabs bisher
immer probleme und es ist nirgends dokumentiert das dies so Funktioniert,
bzw. würde ich es auch nie so verwenden, macht den Code nur unleserlich.

Fehlermeldung vom Compiler sollte schon sein, da geb ich Dir recht.

Desweiteren wurde von cxAlex ein Fehler in der zweiten Funktion beschrieben,
den ich nicht nachvollziehen kann und der mich irritierte.
Erst ganz zum Schluß wurde klar, was das eigentliche Problem ist.

Verfasst: 12.01.2009 16:45
von Thorium
remi_meier hat geschrieben: Und btw, glaubst du wirklich, dass konstante Strings nicht nullterminiert
sind? Tut mir leid, aber so verkorkst ist PB nun auch wieder nicht. Wenn
man sich nicht mal auf das verlassen kann, auf was dann?
Ob Stringkonstante oder Stringvariable darf keine Rolle spielen! Dieses
Feature wird von mir oft genutzt um API Funktionen aufzurufen...
Natürlich sind fixe Strings _nicht_ nullterminiert, das ist doch der Sinn an der ganzen Geschichte. Und selbst wenns so wäre. Wer sagt dann das es sich immer um einen von PB verwalteten String handelt? Man kann nicht davon ausgehen das jeder X-beliebige String nullterminiert ist.

In binären Dateiformatenz.B. , sind Strings sehr oft nicht nicht nullterminiert, sondern werden von einem Längendeskriptor angeführt.

Verfasst: 12.01.2009 16:53
von remi_meier
@Thorium: Ich bin kein Anfänger. Wenn du Unwahrheiten verbreiten
willst, dann bitte mit Disclaimer oder begründet.

@ts-soft:
Auszug purebasic.asm:

Code: Alles auswählen

_S1: db "hallo",0
_S2: db "du",0
Man beachte das "Komma-Null".


In der Tat _müsste_ der Stringmanager nicht eingreifen, aber es ist die
einzige sinnvolle Lösung. Alles andere wäre zu fehleranfällig.

Verfasst: 12.01.2009 16:56
von Thorium
Dann pack den Sting mal in ne Structure. Wohlgemerkt fixen String. Die machen so oder so nur un Structures Sinn.

Verfasst: 12.01.2009 17:10
von remi_meier
Du hast etwas nicht verstanden:
"string" ist eine nullterminierte Stringkonstante
s.s ist eine nullterminierte Stringvariable
s.s{10} ist eine Stringvariable, die auf 10 Chars begrenzt ist, d. h. der
Compiler speichert die Länge und kann sie auch zur Laufzeit verwenden.
Es ist nicht nötig, dem String eine 0 anzuhängen.

Btw. ist, sofern s.s{10} ohne Memory-Operationen benutzt und nicht
bis zur max. Länge ausgenutzt auch ein nullterminierter String:

Code: Alles auswählen

s.s{32} = "hallo"
Debug len(PeekS(@s))
Aber wir haben nicht von einem fixen String, sondern von einem
_konstanten_ gesprochen. Das dieser String auch "fix" ist, hängt alleine
damit zusammen, dass er konstant ist und keinefalls, dass er ein fixed-
length String wäre.

Verfasst: 12.01.2009 18:01
von Thorium
Doch natürlich hab ich das verstanden.
Ändert aber nichts daran.

Verfasst: 12.01.2009 18:09
von remi_meier
Thorium hat geschrieben:
remi_meier hat geschrieben: Und btw, glaubst du wirklich, dass konstante Strings nicht nullterminiert
sind? Tut mir leid, aber so verkorkst ist PB nun auch wieder nicht. Wenn
man sich nicht mal auf das verlassen kann, auf was dann?
Ob Stringkonstante oder Stringvariable darf keine Rolle spielen! Dieses
Feature wird von mir oft genutzt um API Funktionen aufzurufen...
Natürlich sind fixe Strings _nicht_ nullterminiert, das ist doch der Sinn an der ganzen Geschichte. Und selbst wenns so wäre. Wer sagt dann das es sich immer um einen von PB verwalteten String handelt? Man kann nicht davon ausgehen das jeder X-beliebige String nullterminiert ist.

In binären Dateiformatenz.B. , sind Strings sehr oft nicht nicht nullterminiert, sondern werden von einem Längendeskriptor angeführt.
Hieraus geht hervor, dass du offensichtlich fixe Strings mit konstanten
Strings (von denen ich gesprochen habe) verwechselt hast. Wenn man
aber deine Aussagen nur auf fixed-length Strings bezieht, stimmen sie.
Lassen wir es also dabei :)

Verfasst: 12.01.2009 18:39
von rolaf
Also hier mein Test unter Win7 32Bit
Debug mit Fischi (der sich ins Bild drängelte): ;)
Bild

Insgesamt ist Win7 schon bedeutend angenehmer und flotter als Vista auch alle Treiber wurden gefunden. Jedoch muß man sich umgwewöhnen weil die Einstellungen wieder woanders versteckt wurden als in XP - das ist echt blöde. Ansonsten könnte das was werden, jedenfalls gibt es jetzt nicht mehr den kleinsten Grund sich noch Vista zu kaufen.

Verfasst: 12.01.2009 19:19
von cxAlex
K. Dr Falo hats auf ner nativen Maschine bestätigt. Entweder ein Win 7 oder PB Bug, auf XP gibts keine Probleme. Zu dem mit der Null-Terminierung, das macht den selben Fehler, an den liegts nicht:

Code: Alles auswählen

Text1 = ?Test1
Text2.s = "HaHa"

Debug CompareMemoryString(Text1, @Text2, #PB_String_NoCase, #PB_Ignore)
Debug CompareMemoryString(Text1, @Text2, #PB_String_NoCase)

DataSection
  Test1:
  Data.s "HaHa"
  Data.b 0 ; 0 - Terminierung
EndDataSection
Das Problem trat in einem anderen Projekt auf, das ist nur eine kleiner Code um den Fehler zu verdeutlichen. Aber sowas in 10.000 Zeilen + zu finden ist schon anstrengen :evil: , vor allem da auch ich dachte "An dem kanns nicht liegen". Inzwischen hab ich für das Projekt nen WorkAround, wenn Win 7 final da ist werden wir sehn obs ein PB Bug ist. (Ich denke doch)