Makros: Falsche Anwendung oder Bug?

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:

Makros: Falsche Anwendung oder Bug?

Beitrag von Josef Sniatecki »

Folgendes habe ich gefunden, was laut Beschreibung in der Hilfe nicht
mit Makros passieren sollte:

(Ist nur ein Beispiel):

Code: Alles auswählen

Macro Call(FunctionAndArguments)
  Function_#FunctionAndArguments
EndMacro

Procedure.i Function_Test1(a,b)
  Debug a
  Debug b
EndProcedure
Procedure.i Function_Test2(a,b)
  Debug a+10
  Debug b+10
EndProcedure

Call(Test1(1,2))
Nun müsste die letzte Zeile zu "Function_Test(1,2)" werden, doch
stattdessen wird daraus der Fehler "Function_#Test(1,2)".

Doch das komische ist, dass das Beispiel ohne "_" vor dem "#","Test1"
und "Test2" funktioniert.
Der Bug ist also: Wenn das Symbol "#" nach einem Unterstrich steht,
dann wird das "#" nicht entfernt.

Könnt ihr das bestätigen? Wurde das schon mal gemeldet, oder im
Englischem Forum angedeutet?

Gruß Josef
Zuletzt geändert von Josef Sniatecki am 04.01.2009 21:12, insgesamt 1-mal geändert.
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
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Bei mir läuft dein Code einwandfrei:

Code: Alles auswählen

Macro Call(FunctionAndArguments)
  Function_#FunctionAndArguments
EndMacro

Procedure.i Function_Test1(a,b)
  Debug a
  Debug b
EndProcedure
Procedure.i Function_Test2(a,b)
  Debug a+10
  Debug b+10
EndProcedure

Call(Test1(1,2))
PB 4.3 x86
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
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag von Josef Sniatecki »

Hab auch jetzt gemerkt, dass es an etwas anderem lag. Wenn der Makro
genauso heißt, wie das vor dem "#", dann kommt es zu einem Fehler:

Code: Alles auswählen

Macro Example_(FunctionAndArguments)
  Example_#FunctionAndArguments
EndMacro

Procedure.i Example_Test1(a,b)
  Debug a
  Debug b
EndProcedure
Procedure.i Example_Test2(a,b)
  Debug a+10
  Debug b+10
EndProcedure

Example_(Test1(1,2))
Kann man das dann immer noch als Bug anerkennen, oder ist das ein
Rekursions-Fehler? Denn da bin ich mir nicht sicher, da ich im Makro
"Example_" keine Klammer angebe, sondern nur einen angehängten
Makro-Parameter.
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ß
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ob das eine Rekursion auslöst weiß ich nicht, weil PB ja keine beliegig vielen compiler durchgänge ausführt.

aber ein Fehler deinerseits ist es auf jeden Fall.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Kann ich bestätigen. Wenn der Makro-Name vor dem # - Verknüpfungsoperator vorkommt, gibt es einen Fehler.

Würde sagen es ist ein Bug, den in der Hilfe steht nicht das der Macro-Name nicht im Macro vorkommen darf:

http://www.purearea.net/pb/german/manua ... acros.html

Edit:

> aber ein Fehler deinerseits ist es auf jeden Fall.

Wiso? Man kan darüber streiten ob die Namensgebung sinnvoll ist, aber laut Hilfe hat er keinen Fehler gemacht.

[offtopic]
> ob das eine Rekursion auslöst weiß ich nicht, weil PB ja keine beliegig vielen compiler durchgänge ausführt.

Ich hab ja schon oft im englischen Forum sowas gelesen das PB ein Single-Pass-Compiler währe. Aber was hat das für einen Sinn? Der Asm - Output würde sich IMHO mit einem Multipass Compiler weit mehr optimieren lassen?

[/offtopic]
Zuletzt geändert von cxAlex am 04.01.2009 21:24, insgesamt 2-mal geändert.
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

naja..
also für mich wäre die wiederverwendbarkeit von namen eher etwas, was explizit erwähnt werden müßte.

> in der Hilfe steht nicht das der Macro-Name nicht im Macro vorkommen darf
in der Help muss auch nicht jeder selbstverständlicher schei$ drinstehen.

> laut Hilfe hat er keinen Fehler gemacht.
nur weil nicht drin steht, dass er es nicht darf, heißt es nicht dass er es nicht darf, siehe oben.

identische namen parallel für variablen und funktionen verwenden zu können, fände ich extrem strange.
ein array darf nicht so heißen wie eine funktion, weil der compiler diese nicht unterscheiden könnte.
wieso sollte es überhaupt möglich sein, dass ein Objekt vom Typ1 exakt den selben bezeichner trägt wie ein Objekt vom Typ2?
das entbehrt jeder logik.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Gut, hast recht. Trozdem ist der Fehler komisch das einfach das # - nicht entfernt wird. Eine "forbidden" - Fehlermeldung oder sowas währe sinnvoller.
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yup, da stimme ich dir zu. ne saubere Fehlermeldung wäre schön.

wobei die Frage bleibt, warum man unbedingt zwei zusätzliche klammern schreiben will...
es ist schließlich nicht möglich, den Inhalt einer stringvariable an ein Macro zu übergeben...
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 »

Immerhin waren die Codes da oben nur unbedeutsame Beispiele. Hier
mal ein Code, der sich wirklich lohnt:

Code: Alles auswählen

Macro Error_(FunctionAndArguments)
  Error_#FunctionAndArguments
  ProcedureReturn
EndMacro

Procedure.i Error_Std(Message.s)
  Debug Message
EndProcedure
Procedure.i Error_Arg(Type.s)
  Debug "Invalid Type used: "+Type
EndProcedure

Procedure.i Test(Type.s)
  If Type<>"Integer"
    Error_(Arg(Type))
    ;Anbei wird noch automatisch ein
    ;"ProcedureReturn" hinzugefügt.
  EndIf
  Debug "This Type is valid: "+Type
EndProcedure

Test("Integer") ;Ausgabe: This Type is valid: Integer
Test("String")   ;Ausgabe: Invalid Type used: String
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ß
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nö, seh ich nicht.

wenn du

Code: Alles auswählen

    Error_(Arg(Type))
schreiben kannst, warum schreibst du nicht gleich

Code: Alles auswählen

    Error_Arg(Type)
:?:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten