[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/privacyprotection/cron/task/anonymize_ip.php on line 83: A non-numeric value encountered
Inoffizielles deutsches Xbase-Forum • falsche Compilerwarnings?
Seite 1 von 1

falsche Compilerwarnings?

Verfasst: Mi, 02. Okt 2013 20:26
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?

Re: falsche Compilerwarnings?

Verfasst: Mi, 02. Okt 2013 21:08
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.

Re: falsche Compilerwarnings?

Verfasst: Mi, 02. Okt 2013 22:17
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

Re: falsche Compilerwarnings?

Verfasst: Do, 03. Okt 2013 8:17
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.

Re: falsche Compilerwarnings?

Verfasst: Do, 03. Okt 2013 8:18
von Manfred

Re: falsche Compilerwarnings?

Verfasst: Do, 03. Okt 2013 12:11
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.

Re: falsche Compilerwarnings?

Verfasst: Fr, 04. Okt 2013 4:29
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.