Windows 7 x86 - CompareMemoryString Bug

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Dann pack den Sting mal in ne Structure. Wohlgemerkt fixen String. Die machen so oder so nur un Structures Sinn.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Doch natürlich hab ich das verstanden.
Ändert aber nichts daran.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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 :)
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag 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.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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)
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten