Mal wieder die Makros

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Mal wieder die Makros

Beitrag 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
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

Beitrag von Tur0k »

Ich bekomme den gleichen Fehler. :o
buuh* :D
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

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?
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@ts
:lol: :allright:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

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
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
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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?
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Little John

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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"?
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Antworten