Funktion ohne Parameter funktionieren nicht

luca
Beiträge: 15
Registriert: 24 Aug 2015, 16:07

Funktion ohne Parameter funktionieren nicht

Beitragvon luca » 25 Apr 2018, 09:36

Es scheint nicht möglich zu sein Funktionen ohne Parameter zu erstellen.

Beispiel

Code: Alles auswählen

DefFunc showProductLogo() : string
    comment "Show product picture"
    ShowBitmap "%ScriptPath%\logo.png" $ProductId$
endfunc


Bereits bei Verarbeitung der Funktionsdefinition liefert WINST folgenden Fehler:

Code: Alles auswählen

[8] [Apr 25 09:35:24:800] Found new defined function name: showproductlogo
[8] [Apr 25 09:35:24:804] Found defined function parametername: )
[8] [Apr 25 09:35:24:807] Parameter has call type: val
[8] [Apr 25 09:35:24:809] Parameter has invalid data type: string
[2] [Apr 25 09:35:24:811] Syntax Error in Section: Actions (Command in line 24 origin: library.opsiscript Line: 18): DefFunc -> , or ) expected after Parameter Type
Zuletzt geändert von luca am 25 Apr 2018, 09:55, insgesamt 1-mal geändert.

luca
Beiträge: 15
Registriert: 24 Aug 2015, 16:07

Re: Funktion ohne Parameter

Beitragvon luca » 25 Apr 2018, 09:38

Analog wäre es auch interessant Funktionen schon per Deklaration ohne Rückgabewert zu ermöglichen. Evt etwas wie

Code: Alles auswählen

DefFunc showProductLogo()
    comment "Show product picture"
    ShowBitmap "%ScriptPath%\logo.png" $ProductId$
endfunc


oder vielleicht

Code: Alles auswählen

DefFunc showProductLogo() : void/none/o.Ä.
    comment "Show product picture"
    ShowBitmap "%ScriptPath%\logo.png" $ProductId$
endfunc


Das würde es bereits in der Deklaration deutlich machen, ob der Rückgabewert der Funktion relevant ist, oder nicht.


luca
Beiträge: 15
Registriert: 24 Aug 2015, 16:07

Re: Funktion ohne Parameter funktionieren nicht

Beitragvon luca » 25 Apr 2018, 10:05

Danke, das habe ich wohl übersehen.

Benutzeravatar
d.oertel
uib-Team
Beiträge: 3269
Registriert: 04 Jun 2008, 14:27

Re: Funktion ohne Parameter funktionieren nicht

Beitragvon d.oertel » 26 Apr 2018, 14:02

Hallo allerseits,

Der opsi-winst der das kann ist hier:
https://download.uib.de/opsi4.0/experimental/opsi-v407/products/localboot/opsi-winst_4.12.0.17-1.opsi
die Doku hier:
https://download.uib.de/opsi4.0/experimental/opsi-v407/doc/opsi-winst-manual-de.pdf
Beispielefinden sich im allg. Test und Beispielprodukt:
https://download.uib.de/opsi4.0/experimental/opsi-v407/products/localboot/opsi-script-test_4.12.0.17-1.opsi

Code: Alles auswählen

changelog:
=============================
opsi-winst/opsi-script (4.12.0.17) stable; urgency=low

  * osparser: processcall: log Executing on LLNotice
  * new unit osparserhelper in common (Skip / getword /  ...)
  * osdefinedfunctions: int new local string vars
  * osdefinedfunctions: isVisibleLocalVar check for empty varname
  * osparser: catch powershellCall at Linux
  * OsDefinedFunction.parseCallParameter: fix handling parameters with ')'

-- Detlef Oertel <d.oertel@uib.de>  Fri, 13 Apr 2018:15:00:00 +0200

opsi-script-test (4.12.0.16-1) stable; urgency=low

  * ExecWith_powershell: added trap { write-output $_ ; exit 1 }
  * ExecWith_powershell: added exit $LASTEXITCODE
  * fuction with no parameters
  * fuction with no (void) result
  * using isConfidential to test:
    ** SetConfidential
    ** asConfidential
    ** splitStringOnWhiteSpace
    ** splitString
  * asConfidential
  * upper(<str>)
  * lower(str)
  * RegKeyExists
  * RegVarExists
  * %opsiapplog%
  * %opsidata%
  * getIndexFromListByContaining
  * new function : getSubListByMatch(<search string>, <target list>) :stringlist
  * new function : getSubListByMatch(<search list>, <target list>) :stringlist
  * new function : getSubListByContaining(<search string>, <target list>) :stringlist
  * new function : getSubListByContaining(<search list>, <target list>) :stringlist
  * new function : getSubListByKey(<search string>, <target list>) :stringlist
  * new function : getSubListByKey(<search list>, <target list>) :stringlist
  * new function : getKeyList(<list>) :stringlist
  * getregistryvalue(<keystr>, <varstr> [, <access str>]) : string
  * powershellCall

-- detlef oertel <d.oertel@uib.de>  Tue,  27 Mar 2018 15:00:00 +0200

=============================


gruß
d.oertel
opsi support - uib gmbh

For productive opsi installations we recommend support contracts.
http://www.uib.de
http://www.opsi.org

luca
Beiträge: 15
Registriert: 24 Aug 2015, 16:07

Re: Funktion ohne Parameter funktionieren nicht

Beitragvon luca » 27 Apr 2018, 08:57

Hallo und danke für das schnelle Update.

Die Deklaration von Funktionen ohne Parameter und ohne Rückgabewert (void) funktioniert jetzt.

Allerding sind mir ein paar Dinge aufgefallen:

Benutzung von "Message" funktioniert nicht innerhalb von Funktionen.

Code: Alles auswählen

DefFunc test() : void
    Message "test wurde ausgeführt"
EndFunc

Message "--------"
test()
Message "--------"


Erzeugt folgende Logausgabe. (Timestamps stimmen nicht, weil meine VM Probleme mit dem Datum hat)

Code: Alles auswählen

[5] [Apr 25 11:26:39:380] message --------
[8] [Apr 25 11:26:39:383] We are coming from function with index: -1 (-1 = base)
[8] [Apr 25 11:26:39:385] We enter the defined function: test with 1 lines. inDefFuncLevel: 1
[8] [Apr 25 11:26:39:390] We leave the defined function: test ; inDefFuncLevel: 0
[5] [Apr 25 11:26:39:392] message --------


Wenn ich eine Funktion, die per Deklaration keine Parameter bekommt mit Parametern aufrufe ist die Fehlermeldung irreführend.

Code: Alles auswählen

DefFunc test() : void
    Message "test wurde ausgeführt"
EndFunc

test("eigentlich darf hier kein parameter rein")


Führt zum Fehler.

Code: Alles auswählen

[2] [Apr 27 08:49:07:583] Syntax Error: Parameter parsing failed: ")" expected  ) expected


Das ist zwar kein großes Problem aber es kann irreführend sein, wenn man Pakete schreibt. Technisch gesehen ist es auch kein Syntax Fehler. Weder Parser noch Lexer dürften hier fehlschlagen, das ist ein semantischer Fehler der erst später überprüft werden sollte. Beispielsweise mittels Attributgrammatiken oder ähnlichen Checks.

Eine Fehlermeldung wie die Folgende wäre besser.

Code: Alles auswählen

Es wurde ein Parameter für Funktion "test" angegeben, aber die Funktion "test" erwartet keine Parameter.

Benutzeravatar
d.oertel
uib-Team
Beiträge: 3269
Registriert: 04 Jun 2008, 14:27

Re: Funktion ohne Parameter funktionieren nicht

Beitragvon d.oertel » 30 Apr 2018, 10:57

Hi luca,

Danke für die Hinweise.

Dem Problem mit dem message Befehl gehe ich nach.

Das mit dem Syntax Fehler sehe ich etwas anders.
Wenn ich einer Funktion mit einer vorgegebenen anzahl von Parametern eine falsche Anzahl von Parametern geben bezw die falschen Typen, dann ist die erwartete Syntax nicht beachtet.
Die Meldungen können sicherlich noch verbessert werden.

gruß
d.oertel
opsi support - uib gmbh

For productive opsi installations we recommend support contracts.
http://www.uib.de
http://www.opsi.org

luca
Beiträge: 15
Registriert: 24 Aug 2015, 16:07

Re: Funktion ohne Parameter funktionieren nicht

Beitragvon luca » 07 Mai 2018, 11:13

Mir ist gerade noch etwas aufgefallen bei Funktionen ohne Rückgabewert. In Winst Version 4.12.0.15 behelfe ich mir aktuell so, dass ich zwar string als Rückgabewert angebe, aber $result$ niemals beschreibe. Wenn ich die Funktion allerdings dann aufrufe, ohne den Rückgabewert einer Variablen zuzuweisen, dann bekomme ich einen Fehler.

Code: Alles auswählen

DefVar funktionOhneRueckgabe(var $NONE$ : string) : string
    ; ...
EndFunc


Dieser Aufruf funktioniert:

Code: Alles auswählen

DefVar $dummy$
Set $dummy$ = funktionOhneRueckgabe("")


Dieser hier nicht:

Code: Alles auswählen

funktionOhneRueckgabe("")


Hier erhalte ich den Fehler

Code: Alles auswählen

funktionOhneRueckgabe -> undefined


Könnte ein relevanter Test-Case sein, wenn ihr dann Funktionen ohne Rückgabewert einbaut.

Benutzeravatar
d.oertel
uib-Team
Beiträge: 3269
Registriert: 04 Jun 2008, 14:27

Re: Funktion ohne Parameter funktionieren nicht

Beitragvon d.oertel » 07 Mai 2018, 16:56

Hi,

opsi-script >= 4.12.0.17 verwenden ....
https://forum.opsi.org/viewtopic.php?f=1&t=10134

gruß
d.oertel
opsi support - uib gmbh

For productive opsi installations we recommend support contracts.
http://www.uib.de
http://www.opsi.org