falsche Compilerwarnings?

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

falsche Compilerwarnings?

Beitrag von satmax »

Ich habe folgendes Problem

Code: Alles auswählen

function (xy)
LOCAL oBrow:=0, lModal:=.t., aHotKey
...
aHotKey:= {;                      //    lModal                   lModal
            { xbeK_DEL,     {|oDlg,oBrow,.t.| myHotKey(oDlg,oBrow,lModal,1) }},;   // Löschen
            { xbeK_CTRL_L,  {|oDlg,oBrow,.t.| myHotKey(oDlg,oBrow,lModal,1) }},;   // Löschen
            { xbeK_CTRL_N  ,{|oDlg,oBrow,.t.| myHotKey(oDlg,oBrow,lModal,2) }},;   // Neu
            { xbeK_INS,     {|oDlg,oBrow,.t.| myHotKey(oDlg,oBrow,lModal,2) }},;   // Neu
            { xbeK_CTRL_E,  {|oDlg,oBrow,.t.| myHotKey(oDlg,oBrow,lModal,3) }},;   // Bearbeiten, Test ob neuer Record angelegt werden soll
            { xbeK_ENTER,   {|oDlg,oBrow,.t.| myHotKey(oDlg,oBrow,lModal,3) }};    // Bearbeiten, Test ob neuer Record angelegt werden soll
          }
erzeugt IMHO die falschen Warnungen:

Code: Alles auswählen

MDATEN.PRG(1528:0): warning XBT0116: LOCAL variable oBrow unused
MDATEN.PRG(1699:0): warning XBT0119: Parameter lModal unused
MDATEN.PRG(1699:0): warning XBT0119: Parameter oDlg unused
Was tut man in so einem Fall, muss man hier mit #PRAGMA arbeiten?
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: falsche Compilerwarnings?

Beitrag von georg »

Hallo, satmax -


hinschauen ...

Leider sind in Deinem Code-Ausschnitt keine Zeilennummern dabei.

Code: Alles auswählen

lModal:=.t.
pass nicht zu der Meldung
MDATEN.PRG(1699:0): warning XBT0119: Parameter lModal unused
, da wird auf eine Funktionsdeklaration Bezug genommen, wo Du lModal als Parameter definiert hast, in der Funktion lModal aber nicht verwendet wird.


#PRAGMA verwendet man, wenn man den Compiler anweisen will, etwas bestimmtes zu tun - was in fast allen Fällen auch über Compiler-Schalter geht.

Die Meldungen kommen wahrscheinlich vom Schalter /wu, der über nicht verwendete lexikalische Variablen informiert. Der ist aber auch hinterhältig:

Code: Alles auswählen

LOCAL cFeld
cFeld := "abc"
(restlicher Code hat keinen Bezug mehr zu cFeld)
RETURN(.T.)
In diesem Fall bekommst Du eine Meldung, dass cFeld nicht verwendet wird: was ja auch stimmt. Es wird ein Wert zugewiesen, der aber nirgends verwendet wird. Entweder hat man als Programmierer etwas vergessen (soll vorkommen), oder die Anweisung ist überflüssig.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: falsche Compilerwarnings?

Beitrag von Jan »

Manche Aufrufe der Variablen kann der Compiler nicht sauber verwerten. Ich habe das regelmäßig, wenn ich einer Variablen einen Wert zuweise, das dann aber nicht weiter abfrage. Man kann das mit einem Workaround beheben, indem man diese Variablen mit der Zeile

Code: Alles auswählen

UnUsed(cVariable)
einfügt. Dann ist die Sache erledigt. Nicht sehr elegant, aber wirksam. Ich schreib das immer direkt hinter die Variablendeklarationen, dann steht das alles übersichtlich beisammen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: falsche Compilerwarnings?

Beitrag von satmax »

Jan hat geschrieben:Manche Aufrufe der Variablen kann der Compiler nicht sauber verwerten. Ich habe das regelmäßig, wenn ich einer Variablen einen Wert zuweise, das dann aber nicht weiter abfrage. Man kann das mit einem Workaround beheben, indem man diese Variablen mit der Zeile

Code: Alles auswählen

UnUsed(cVariable)
einfügt. Dann ist die Sache erledigt. Nicht sehr elegant, aber wirksam. Ich schreib das immer direkt hinter die Variablendeklarationen, dann steht das alles übersichtlich beisammen.

Jan
Genau danach habe ich gesucht, danke!

@georg die Varibalen werden sicher verwendet, wie zum Beispiel hier:

Code: Alles auswählen

aHotKey:= {;
            { xbeK_DEL,     {|oDlg,oBrow,lModal| myHotKey(oDlg,oBrow,lModal,1) }},;   // Löschen
            { xbeK_CTRL_L,  {|oDlg,oBrow,lModal| myHotKey(oDlg,oBrow,lModal,1) }},;   // Löschen
            { xbeK_CTRL_N  ,{|oDlg,oBrow,lModal| myHotKey(oDlg,oBrow,lModal,2) }},;   // Neu
            { xbeK_INS,     {|oDlg,oBrow,lModal| myHotKey(oDlg,oBrow,lModal,2) }},;   // Neu
            { xbeK_CTRL_E,  {|oDlg,oBrow,lModal| myHotKey(oDlg,oBrow,lModal,3) }},;   // Bearbeiten, Test ob neuer Record angelegt werden soll
            { xbeK_ENTER,   {|oDlg,oBrow,lModal| myHotKey(oDlg,oBrow,lModal,3) }};    // Bearbeiten, Test ob neuer Record angelegt werden soll
          }
aHotkey wird dann an eine andere Funktion übergeben, da lModal in der aktuellen Funktion nicht weiter verwendet wird, raunzt der Compiler.

Aber Du hast recht: Das vorige Beispiel habe ich manuell erstellt und ist in sich nicht schlüssig.
Gruß
Markus
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: falsche Compilerwarnings?

Beitrag von Manfred »

Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: falsche Compilerwarnings?

Beitrag von georg »

Hallo, satmax -


da liegt ein Verständnisproblem vor:

Wenn Du in einem Codeblock Variablen-Namen verwendest, die zwischen den beiden Pipe-Zeichen stehen, so beziehen sie diese Variablennamen auf Parameter, die später per EVAL() übergeben werden, und nicht auf real definiert Variablen in Deinem Programm-Code:

Code: Alles auswählen

aHotKey:= {;
            { xbeK_DEL,     {|oDlg,oBrow| myHotKey(oDlg,oBrow,lModal,1) }};   // Löschen
}
Du kannst - alternativ - mal folgendes versuchen:

Code: Alles auswählen

aHotKey:= {;
            { xbeK_DEL,     {|xoDlg,xoBrow| myHotKey(xoDlg,xoBrow,lModal,1) }};   // Löschen
}
Du erhältst keine Fehlermeldung, dass xoDlg und xoBrow nicht definiert sind. Denn diese beiden Variablen sind nur Platzhalter, damit der Compiler weiss: "Aha, diese beiden Werte werden später als Parameter an EVAL() übergeben, während ich lModal aus dieser Funktion nehmen muss!"

Infolge dessen sind oDlg und oBrow in Deiner Funktion "nicht verwendet", und die Compiler-Warnung korrekt.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: falsche Compilerwarnings?

Beitrag von AUGE_OHR »

georg hat geschrieben:Wenn Du in einem Codeblock Variablen-Namen verwendest, die zwischen den beiden Pipe-Zeichen stehen, so beziehen sie diese Variablennamen auf Parameter, die später per EVAL() übergeben werden ...
wie Georg schon sagte schau dir die "Codeblock-Funktionen" an.

was Parameter zwischen den Pipe-Zeichen angeht haben die Callback Slots immer 3 Parameter wobei der 3th self ist ( ich mache immer oSelf daraus )
diese Parameter werden von Alaska gestellt und können von deiner Function im Codeblock verarbeitet werden.

in deinem Beispiel sehe ich keinen Grund zwischen den Pipe-Zeichen Parameter zu verwenden da du ja eigene Variablen als Parameter für deine Function benutzt.
gruss by OHR
Jimmy
Antworten