Mal wieder die Makros

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Ich denke eher das PB der Meinung ist, das es sich bei dem Macro um
eine Funktion handelt, den Code dafuer einbaut, aber den Aufruf zu dieser
"Funktion" nicht mehr hinein schreibt.

Code: Alles auswählen

Macro DoubleQuote 
"
EndMacro 

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

Procedure.s a()
  ProcedureReturn "huhu"
EndProcedure

Select Name$
  Case a() 
  Case DoubleUnderscore(Name) 
EndSelect
Der Compiler baut sich folgendes daraus zusammen :

Code: Alles auswählen

; Select Name$
  PUSH   dword [v_Name$]
; Case a() 
  PUSH   dword [_PB_StringBasePosition]
  CALL  _Procedure0
  POP    edx
  MOV    dword [_PB_StringBasePosition],edx
  ADD    edx,[PB_StringBase]
  MOV    ecx,[esp]
  CALL  _SYS_StringEqual
  JE    _Case1





; Case DoubleUnderscore(Name) 
  JMP   _EndSelect1
_Case1:
  POP    edx
  MOV    dword [_PB_StringBasePosition],edx
  ADD    edx,[PB_StringBase]
  MOV    ecx,[esp]
  CALL  _SYS_StringEqual
  JE    _Case2
; EndSelect
Im ersten Block sieht man wie die Funktion aufgerufen wird.
Der 2. Block sieht eigentlich genauso aus, nur das es da keine
Funktion zum aufrufen gibt. Hier haette jetzt der Zugriff zu dem
statischen String erfolgen muessen.

Mit dem Case Workaround sieht das dann so aus :

Code: Alles auswählen

  MOV    edx,_S1
  MOV    ecx,[esp]
  CALL  _SYS_StringEqual
  JE    _Case1
Also genau der gleiche Code, als wenn man "_a_" schreiben wuerde.
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 »

Ich weiß nicht ob ihr recht habt, aber wenn, dann dürfte der erste Teil auch
nicht richtig funktionieren:

Code: Alles auswählen

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


Debug DoubleUnderscore(bla) ;Muss "_bla_" ergeben, was auch funktioniert
Müßte logischerweise "_0_" ergeben :wink:
oder "__"
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 »

nein wieso...
da hast du doch kein "Case", was ja anscheinend mit dem Auslösen des Fehlverhaltens irgendwie zusammenhängt.
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 »

Kaeru Gaman hat geschrieben:nein wieso...
da hast du doch kein "Case", was ja anscheinend mit dem Auslösen des Fehlverhaltens irgendwie zusammenhängt.
In dem Beispiel ist bla eine variable vom Wert 0, er macht aber "_bla_"
draus. Wenn das korrekt wäre, warum soll er bei Name$ nicht "_Name$_"
machen. Beides kann nicht richtig sein :mrgreen:

//edit
Ich laß es lieber sein mit Macros, die sind so unlogisch :mrgreen:
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 »

> Wenn das korrekt wäre, warum soll er bei Name$ nicht "_Name$_"
machen.

weil es darum ja garnicht geht...
erstes posting:

Code: Alles auswählen

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 
nicht "name$" wird an das Macro übergeben, sondern die buchstaben a-f
da hast du dich von Anfang an verguckt gehabt...

außerdem funktioniert das Macro ja mit If oder wenn man das Case ins Macro mit hineinnimmt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

ts-soft hat geschrieben:
Kaeru Gaman hat geschrieben:nein wieso...
da hast du doch kein "Case", was ja anscheinend mit dem Auslösen des Fehlverhaltens irgendwie zusammenhängt.
In dem Beispiel ist bla eine variable vom Wert 0, er macht aber "_bla_"
draus. Wenn das korrekt wäre, warum soll er bei Name$ nicht "_Name$_"
machen. Beides kann nicht richtig sein :mrgreen:

//edit
Ich laß es lieber sein mit Macros, die sind so unlogisch :mrgreen:
Unter normalen Umstaenden macht das Macro genau das was es soll,
wenn du Name$ uebergibst, kommt "_Name$_" dabei raus. Und nicht
der Inhalt von Name$.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Mal so neben bei ... das Macro funktioniert prima. Und was ihr hier als
"Bug" angebt ist einfach nicht unterstützt. Vor einigen Monaten gabs doch
mal einen Thread über Funktionen, die einen String zurückgaben in Select
Case. Ergebnis nach längerer Diskussion. Nicht unterstützt. Hier ist es
sicher auch so, denn ihr versucht hier keinen einzellnen String zu
überprüfen sondern einen Zusammengesetzten. Das Macro ergibt
"_"+"a"+"_" und nicht "_a_" ... versucht das ganze mal ohne Macro

Code: Alles auswählen

Case "_"+"a"+"_"
fürt zu einem IMA.
Was blöd ist ... das folgendes Macro auch nicht funktioniert:

Code: Alles auswählen

Macro DoubleQuote 
  " 
EndMacro 
Macro DoubleUnderscore(Name) 
  DoubleQuote#_#Name#_#DoubleQuote 
EndMacro
Debug DoubleUnderscore(bla) ;ergibt leider "#_bla_" 
Was da jetzt genau alles ein Bug ist oder einfach nicht vorgesehen ist
muss wohl erst mal freak beantworten.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

der "zusammengesetzte string" den du da vorstellst, wird aber zur Laufzeit zusammengesetzt.
und wenn das "Case" im Macro selbst enthalten ist, funktioniert es ja.
das ist also eine ganz andere Problematik, als das zusammensetzen zur Laufzeit.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

Das Macro ergibt "_"+"a"+"_" und nicht "_a_"
Das Macro ergibt "_a_" und nicht "_"+"a"+"_".
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Da kann wohl jemand nicht zählen. :mrgreen:

Code: Alles auswählen

Macro DoubleQuote 
" 
EndMacro 

Macro DoubleUnderscore(Name) 
"_"+DoubleQuote#Name#DoubleQuote+"_" 
EndMacro
... Das besteht aus:
"_"
+
DoubleQuote#Name#DoubleQuiote
+
"_"


Dann wird das innere Macro aufgelöst
"_"
+
"Name"
+
"_"

... tada :D

Und probiert doch erst Code aus bevor ihr etwas behauptet:

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_") ;Müsste das letzte "Case" ansteuern 
;Doch das einzige was passiert, ist ein "Invalid memory access"!

MFG PMV
Zuletzt geändert von PMV am 14.03.2009 23:18, insgesamt 2-mal geändert.
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten