Meldung: called too early to check prototyp

Begonnen von Navigator, 07 Mai 2020, 14:22:32

Vorheriges Thema - Nächstes Thema

Navigator

Hi...
ich bekomme bei einem Neustart von FHEM immer die Meldung:

PERL WARNING: main::GewHaus_Bewaesserung_pr() called too early to check prototype at ./FHEM/99_myUtils.pm

bezüglich einer meiner Sub´s in der myUtils.

An betreffender Zeile ruft die Sub sich selber wieder auf, mit zwei Parametern.
An sich funktioniert alles, aber aus der Meldung werde ich trotzdem nicht so recht schlau.  ???
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.

MadMax-FHEM

Wie wäre es dann deinen Code zu posten!?

Wie soll man sonst etwas dazu sagen... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Navigator

oh ja.. gute Idee.  :)


sub GewHaus_Bewaesserung_pr($$) {

my $durchgang = shift;
my $programm = shift;
my $programm2 = "";
if ($programm == 1){
$programm2 = 2
}
elsif ($programm == 2){
$programm2 = 1
}

$durchgang = $durchgang + 1;
my $stunde=(localtime)[2];
my $minute=(localtime)[1];
$minute="0$minute" if $minute < 10;
my $planungsstatus = ReadingsVal("GewHaus_Bewaesserung_Kreis_Vorwahl_pr$programm","kreis$durchgang","");
if (Value("GewHaus_Bewaesserung_Kreis_Vorwahl_pr$programm2") eq "off"){
Log 1, "Gewächshaus Bewässerung gestartet" if $durchgang == 1;
if ($durchgang <= 2) {
if ($planungsstatus eq "eingeplant"){
my $dauer = ReadingsVal("GewHaus_Bewaesserung_Kreis_Vorwahl_pr$programm","dauer$durchgang","");
$dauer = "0$dauer" if $dauer < 10;
Log 1, "Gewächshaus Bewässerung Programm $programm Kreis $durchgang gestartet";
fhem ("set GewHaus_Bewaesserung_Kreis_Vorwahl_pr$programm on;set HMW_GewHaus_Kreis_$durchgang on;setreading GewHaus_Bewaesserung_Kreis_Vorwahl_pr$programm status$durchgang ...beim bewässern seit $stunde:$minute Uhr");
fhem ("define A_GewHaus_Bewaesserung_Ende_Kreis_$durchgang at +00:$dauer setreading GewHaus_Bewaesserung_Kreis_Vorwahl_pr$programm status$durchgang Start $stunde:$minute Uhr - abgeschlossen;;
set HMW_GewHaus_Kreis_$durchgang off;;sleep 2;;set HMW_GewHaus_Kreis_$durchgang off");
my $nextbegin = $dauer - 1;
$nextbegin = "0$nextbegin" if $nextbegin < 10;
fhem ("define A_GewHaus_Bewaesserung_Next_Kreis_$durchgang at +00:$nextbegin:55 {GewHaus_Bewaesserung_pr ($durchgang,$programm)}");
}
elsif ($planungsstatus eq "ausgegliedert"){
Log 1, "Gewächshaus Bewässerung Programm $programm Kreis $durchgang übergangen";
fhem ("setreading GewHaus_Bewaesserung_Kreis_Vorwahl_pr$programm status$durchgang übergangen");
GewHaus_Bewaesserung_pr($durchgang,$programm);
}
}
if ($durchgang == 3) {Log 1, "Gewächshaus Bewässerung Programm $programm beendet";
    fhem ("set GewHaus_Bewaesserung_Kreis_Vorwahl_pr$programm off");
fhem ("set GewHaus_Bewaesserung_Manuell_pr$programm off") if (Value("GewHaus_Bewaesserung_Manuell_pr$programm") ne "off");
fhem ("defmod A_GewHaus_Bewaesserung_Ausgaenge_Check1 at +00:00:20 {for my \$i (1..2){fhem (\"get HMW_GewHaus_Kreis_\$i state\")}}");
fhem ("defmod A_GewHaus_Bewaesserung_Ausgaenge_Check2 at +00:00:25 {
if (Value(\"GewHaus_Bewaesserung_Kreis_Vorwahl_pr1\") eq \"off\"
&& Value(\"GewHaus_Bewaesserung_Kreis_Vorwahl_pr2\") eq \"off\") {
for my \$i (1..2) {if (Value(\"HMW_GewHaus_Kreis_\$i\") ne \"on\" && Value(\"HMW_GewHaus_Kreis_\$i\") ne \"off\"){
fhem (\"set HMW_GewHaus_Kreis_\$i off\");;
Log 1, \"Ausgang HMW_GewHaus_Kreis_\$i vermutlich nicht abgeschalten - schalte ab\"}}}}")
}
}
else {
Log 1, "Kein Start Bewaesserung Programm $programm - anderes Programm in Betrieb";
fhem("set GewHaus_Bewaesserung_Manuell_pr$programm off")
}
}


Der Fehler entsteht in Zeile...

GewHaus_Bewaesserung_pr($durchgang,$programm);
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.

Christoph Morrison

Du brauchst keine Prototypen und dann ist dein Problem auch gelöst.

Navigator

#4
Zitat von: Christoph Morrison am 07 Mai 2020, 15:05:28
Du brauchst keine Prototypen und dann ist dein Problem auch gelöst.
Könntest du das etwas genauer schildern? Ich muss ja genau zwei Werte übergeben.
Sind die Prototypen nicht explizit dafür gedacht um die richtige Anzahl an geforderten Parametern zu definieren?
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.

Christoph Morrison

Zitat von: Dittel am 07 Mai 2020, 15:12:31
Könntest du das etwas genauer schildern? Ich muss ja zwei Werter übergeben, was genau und wie sollte ich deiner Meinung nach ändern.

Ja. Du nimmst statt

sub GewHaus_Bewaesserung_pr($$) {

einfach

sub GewHaus_Bewaesserung_pr {

Die beiden $ sind die Prototyp-Definitionen. Und da du nicht mal weißt für was die gut sind, kannst du sie auch weglassen. Deine Funktion wird weiterhin zwei Parameter akzeptieren.

MadMax-FHEM

Zitat von: Christoph Morrison am 07 Mai 2020, 15:34:47
Deine Funktion wird weiterhin zwei Parameter akzeptieren.

Und sogar mehr oder weniger ;)

Es kommt drauf an was du mittels shift tust bzw. aus dem Aufruf "rausholst"... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Navigator

Nun ich war bisher immer im Glauben Perl braucht die Prototypen um die Anzahl der übergebenen Parameter zu kennen. Jeweils ein Prototype für einen Parameter und für optionale Parameter ein ;$. So habe ich es zumindest gelernt.

Was ist wenn ich die Parameter nicht mit "shift" sonder über "@_" ausgelsesen hätte. Hätte ich die Prototypen dann gebaucht?
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.

Christoph Morrison

Zitat von: MadMax-FHEM am 07 Mai 2020, 15:40:56
Und sogar mehr oder weniger ;)

Spannend auch was geschieht wenn man einfach gar nix übergibt. Hast du das mal getestet?

MadMax-FHEM

FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

Zitat von: Christoph Morrison am 07 Mai 2020, 15:45:15
Spannend auch was geschieht wenn man einfach gar nix übergibt. Hast du das mal getestet?

;)

Aber ich komme aus einer Welt wo OHNE Prototypen nix geht...

Da mosert ja der (Pre)Compiler...

Drum (ungeachtet des verlinkten Threads: mag bei Perl so sein / aber da es nicht schadet ;)  ) nutze ich weiterhin Prototypen...
...bin aber ja auch kein Modulauthor und was ich "bei mir" an Code "fabriziere" geht niemanden was an ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Christoph Morrison

Zitat von: Dittel am 07 Mai 2020, 15:43:36
Was ist wenn ich die Parameter nicht mit "shift" sonder über "@_" ausgelsesen hätte. Hätte ich die Prototypen dann gebaucht?

Nein.

Christoph Morrison

Zitat von: MadMax-FHEM am 07 Mai 2020, 15:48:53
Drum (ungeachtet des verlinkten Threads: mag bei Perl so sein / aber da es nicht schadet ;)  ) nutze ich weiterhin Prototypen...

Lustig das in einem Thread zu schreiben, in dem der OP genau wegen (nutzloser) Prototypen ein Warning bekommt ;-)

MadMax-FHEM

Zitat von: Christoph Morrison am 07 Mai 2020, 15:53:13
Lustig das in einem Thread zu schreiben, in dem der OP genau wegen (nutzloser) Prototypen ein Warning bekommt ;-)

Tja ;)
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

KölnSolar

Zitatbin aber ja auch kein Modulauthor und was ich "bei mir" an Code "fabriziere" geht niemanden was an ;)
und leserlicher ist es allemal....  8)
Nur interessiert das Perl-Gurus nicht. :o
Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt