Seite 1 von 4

Mal wieder die Makros

Verfasst: 13.03.2009 23:42
von Josef Sniatecki
Hi,

melde mich mal spät am Abend, da ich einen Bug habe, der mich schon seit
Stunden belästigt hat. Erst jetzt bin ich mir sicher, dass es an PureBasic
und dessen Makros liegt.

Hier ein Beispiel, welches den Bug auslöst:

Code: Alles auswählen

Macro DoubleQuote
  "
EndMacro
Macro DoubleUnderscore(Name)
  "_"+DoubleQuote#Name#DoubleQuote+"_"
EndMacro


Debug DoubleUnderscore(bla) ;Muss "_bla_" ergeben, was auch funktioniert



;Doch nun kommt das komische:
Procedure CallBug(Name$)
  Select Name$
    Case DoubleUnderscore(a)
      ;...
    Case DoubleUnderscore(b)
      ;...
    Case DoubleUnderscore(c)
      ;...
    Case DoubleUnderscore(d)
      ;...
    Case DoubleUnderscore(e)
      ;...
    Case DoubleUnderscore(f)
      ;...
  EndSelect
EndProcedure


CallBug("_f_") ;Müsste das letzte "Case" ansteuern
;Doch das einzige was passiert, ist ein "Invalid memory access"!
Schreibe ich anstatt "DoubleUnderscore(a)" ein "_a_" usw., dann
funzt das Skript ohne Probleme. Es muss also wieder an den Makros
von PB liegen. Noch komischer ist, dass mir dieser Bug nur bei
Select und Case auftritt. Über der Prozedur nutze ich "DoubleUnderscore"
ohne Probleme.

Fragt mich aber bitte nicht, wozu ich solch ein Skript brauche. Es ist
nur ein Beispiel :wink:.

Kann mal wieder jemand bitte diesen Bug bestätigen?

Gruß Josef

Verfasst: 13.03.2009 23:48
von Tur0k
Ich bekomme den gleichen Fehler. :o

Verfasst: 13.03.2009 23:49
von ts-soft

Code: Alles auswählen

Macro DoubleQuote
  "
EndMacro
Macro DoubleUnderscore(Name)
  "_"+DoubleQuote#Name#DoubleQuote+"_"
EndMacro


;Debug DoubleUnderscore(bla) ;Muss "_bla_" ergeben, was auch funktioniert



;Doch nun kommt das komische:
Procedure CallBug(Name$)
  Debug DoubleUnderscore(Name$)
  Select Name$
    Case DoubleUnderscore(a)
      ;...
    Case DoubleUnderscore(b)
      ;...
    Case DoubleUnderscore(c)
      ;...
    Case DoubleUnderscore(d)
      ;...
    Case DoubleUnderscore(e)
      ;...
    Case DoubleUnderscore(f)
      ;...
  EndSelect
  
EndProcedure


CallBug("_f_") ;Müsste das letzte "Case" ansteuern
;Doch das einzige was passiert, ist ein "Invalid memory access"!
Siehste jetzt den Denkfehler?

Verfasst: 13.03.2009 23:54
von Kaeru Gaman
@ts
:lol: :allright:

Verfasst: 14.03.2009 00:26
von ts-soft
hier mal etwas kürzer:

Code: Alles auswählen

Macro DoubleQuote
  "
EndMacro
Macro DoubleUnderscore(Name)
  "_"+DoubleQuote#Name#DoubleQuote+"_"
EndMacro

bla$ = "bla"
Debug DoubleUnderscore(bla$) ;Muss "_bla_" ergeben, was nicht funktionieren kann

Verfasst: 14.03.2009 10:47
von Josef Sniatecki
Ich glaube da habt ihr was falsch verstanden. Ich drücke mich mal klarer
aus:

"DoubleUnderscore" soll nicht variable Strings mit zwei "_" rechts und llinks
versehen. Falls ich nach einigen Bedenken sage, ich möchte noch ein
"_" links und rechts haben (DoubleUnderscore(a) = "__a__"), dann ist so
ein makro sehr nützlich, da ich nicht überall im Code noch ein "_" anhängen
muss, sondern einfach das Makro modifizieren muss.

Versteht ihr was ich meine? Ich nutze das Makro nicht als Funktion, sondern
nur für die Umwandlung von konstanten Werten. Und wenn ich mal was
ändern will, muss ich nur zum Makro gehen.

Es ist also immer noch ein Bug, da folgender Code auch so geschrieben
werden kann, ohne ein Bug auszulösen:

Code: Alles auswählen

Procedure CallBug(Name$)
  Select Name$
    Case "_a_"
      ;...
    Case "_b_"
      ;...
    Case "_c_"
      ;...
    Case "_d_"
      ;...
    Case "_e_"
      ;...
    Case "_f_"
      ;...
  EndSelect
 
EndProcedure
Nutze ich jetzt wieder "DoubleUnderscore", dann kommt ein "Invalid
memory access".

Versteht ihr jetzt das Problem?

Verfasst: 14.03.2009 11:14
von Little John
Josef Sniatecki hat geschrieben:Versteht ihr jetzt das Problem?
So wie ich es verstehe, wird das Problem in diesem Code von Thomas deutlich aufgezeigt. Ich denke es entsteht dadurch, dass Makros zur Compilierzeit abgearbeitet werden, die Prozedur hingegen zur Laufzeit. Einen Bug kann ich da nicht erkennen.

Gruß, Little John

Verfasst: 14.03.2009 13:18
von Kaeru Gaman
Josef Sniatecki hat geschrieben:Ich glaube da habt ihr was falsch verstanden.
nein, du hast da was falsch verstanden.

da du trotz der deutlichen demonstration nicht drauf kommst, hat Johnny es wörtlich gesagt:
Little John hat geschrieben: es entsteht dadurch, dass Makros zur Compilierzeit abgearbeitet werden, die Prozedur hingegen zur Laufzeit.
.
..
...
.... du darfst dann wählen: Anfänger oder Mülleimer?

Verfasst: 14.03.2009 14:53
von Josef Sniatecki
Bevor da irgendwas verschoben wird:

Mir ist völlig bewusst das Makros zur Compilerzeit verarbeitet werden, sonst
würde ich sie ja erst gar nicht benutzen. Ich möchte einfach, dass
DoubleUnderscore(...) zu "_..._" wird. Wieso jetzt Select/Case Makros als
"Invalid memory access" verarbeiten ist ehrlich gesagt ganz komisch.

Hier nochmal der Unterschied:

Löst Bug aus:

Code: Alles auswählen

Macro DoubleQuote
  "
EndMacro
Macro DoubleUnderscore(Name)
  "_"+DoubleQuote#Name#DoubleQuote+"_"
EndMacro

Procedure CallBug(Name$)
  Select Name$
    Case DoubleUnderscore(a)
      ;...
    Case DoubleUnderscore(b)
      ;...
    Case DoubleUnderscore(c)
      ;...
    Case DoubleUnderscore(d)
      ;...
    Case DoubleUnderscore(e)
      ;...
    Case DoubleUnderscore(f)
      ;...
  EndSelect
EndProcedure


CallBug("_f_")
Löst kein Bug aus:

Code: Alles auswählen

Procedure CallBug(Name$)
  Select Name$
    Case "_a_"
      ;...
    Case "_b_"
      ;...
    Case "_c_"
      ;...
    Case "_d_"
      ;...
    Case "_e_"
      ;...
    Case "_f_"
      ;...
  EndSelect
EndProcedure

CallBug("_f_")
Es ist doch klar, dass der 1. Code nach dem kompileren bzw.
verarbeiten der Makros so aussieht wie der 2. Code.


Meine Frage ist nun, wieso ich keine Makros wie in diesem Beispiel
nach "Case" richtig verwenden kann. Kommt etwa bei euch im 1. Code
kein "Invalid memory access"?

Verfasst: 14.03.2009 15:07
von edel
Denke auch dass das ein Bug ist, DoubleUnderscore(a) wird zu einem
statischem string, pb wurstet da aber mit dem stringmanager rum.

Code: Alles auswählen

; Select Name$ 
  PUSH   dword [esp]
; Case "_a_"
  MOV    edx,_S2
  MOV    ecx,[esp]
  CALL  _SYS_StringEqual
  JE    _Case1
;... 
; Case DoubleUnderscore(b) 
  JMP   _EndSelect1
_Case1:
  POP    edx
  MOV    dword [_PB_StringBasePosition],edx
  ADD    edx,[PB_StringBase]
  MOV    ecx,[esp]
  CALL  _SYS_StringEqual
  JE    _Case2