+ Antworten
Ergebnis 1 bis 8 von 8
  1. #1
    Registriert seit
    Jan 2012
    Ort
    Neu-Isenburg
    Beiträge
    168

    Standard IPS_RunScriptEx Parameter Conversion Error

    Hallo Zusammen,

    mir ist gerade ein Bug in IPS_RunScriptEx aufgefallen (möglicherweise Systemweit). Wenn ich ein Array mit Zahlen außerhalb des Bereiches von 4 Byte Integern übergeben möchte, werden diese falsch weitergegeben. Zahlen im Bereich von -2147483647 bis 2147483647 funktionieren einwandfrei. Dieses Problem ist erst nach dem letzten Update 5.0 aufgetaucht.


    Vielen Dank

  2. #2
    Registriert seit
    Jan 2012
    Ort
    Neu-Isenburg
    Beiträge
    168

    Standard IPS_RunScriptEx Parameter Conversion Error

    Kann das jemand bestätigen, oder das Symcon Team was dazu sagen?

    Aufgefallen ist mir das Problem da das Telegeram Modul nicht mit Super Gruppen kommunizieren kann, da die Gruppen ID größer als die 4 Byte ist.




    Gesendet von iPhone mit Tapatalk

  3. #3
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    7,343

    Das ist die PHP Grenze.
    PHP: Integers - Manual
    Und da es IPS auch für den Pi gibt....
    Größere Zahlen dann nur unter Ubuntu und Windows x64 mit IPS (PHP7).

    Michael
    PS: MacOs keine Ahnung
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  4. #4
    Registriert seit
    Jan 2012
    Ort
    Neu-Isenburg
    Beiträge
    168

    Naja IPS in der neuesten Version 5.0 läuft auf einem Windows 10 x64 System.
    Vor dem Update auf 5.0 ging auch alles ohne Probleme. Und in der Doku steht:
    ParameterKey (string) => Value (variant)



    Gesendet von iPhone mit Tapatalk

  5. #5
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    7,343

    Ja und was soll nun der Verweis auf die Doku? Variant kann ja alles sein.
    Und da es eh nie durch PHP für alle Systeme eine Unterstützung für große Zahlen gibt, ist die 32 Bit Grenze schon logisch.
    Vor IPS 5 also mit PHP 5.x war die 32 Bit Grenze unter Windows auf jeden Fall schon vorhanden. Die ist unter Windows erst mit PHP 7 gefallen.
    Michael
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  6. #6
    Registriert seit
    Jan 2012
    Ort
    Neu-Isenburg
    Beiträge
    168

    Standard Beispielscript

    Hallo,

    vielen Dank für die schnelle Antwort. Ich glaube aber wir reden aneinander vorbei.
    Bitte schau DIr doch mal kurz dieses Beispielscript an. Es zeigt sehr genau was mein Problem ist.

    PHP-Code:
    <?
    $long 
    =  2147483647 1;
    echo 
    $long// 2147483648

    IPS_RunScriptEx(53589 /* script siehe unten */, [ "LONG" => $long ]);
    ?>
    Im zweiten Script (53589) steht:
    PHP-Code:
    <?

    echo $_IPS['LONG']; // -2147483648

    ?>
    Hier sieht man, dass IPS_RunScriptEx den Parameter "LONG" verfälscht.

    Das hat genau so früher wunderbar funktioniert. Da das "echo $long" im ersten Script funktioniert und erst nach der Übergabe nicht mehr korrekt ist, ist das in meinen Augen ein Bug von IPS_RunScriptEx und kann nicht mit der PHP Version oder dem Betriebssystem in Verbindung stehen. Siehst du das anders?

    Gruß
    Tasmanie

  7. #7
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    7,343

    echo konvertiert deine Zahl zu einen String um es darzustellen.
    wenn du echo (int)$long im ersten Script einfügst, kommt auch schon -2147483648 raus
    Warum PHP teilweise mit größeren Zahlen umgehen kann, siehst du wenn du var_dump nutzt.
    PHP konvertiert es dann zu einem Float.

    Beispiel:

    PHP-Code:
    <? 
    $long 
    =  2147483647 1;
    echo 
    $long.PHP_EOL// String  2147483648 
    echo (int)$long.PHP_EOL// int -2147483648 
    var_dump($long); // float 2147483648
    IPS_RunScriptEx(10048  /* script siehe unten */, [ "LONG" => $long ]); 
    IPS_RunScriptEx(10048  /* script siehe unten */, [ "LONG" => (int)$long ]); 
    IPS_RunScriptEx(10048  /* script siehe unten */, [ "LONG" => (float)$long ]);
    PHP-Code:
    <? 
    var_dump
    ($_IPS['LONG']); // var_dump um zu prüfen ob der Variablentyp korrekt ist
    Ausgabe IPS 4.4 (PHP 5.X):
    Code:
    2147483648
    -2147483648
    float(2147483648)
    Code:
    15.05.2018 20:03:28 | ScriptEngine | Ergebnis für Skript 10048
    float(2147483648)
    15.05.2018 20:03:28 | ScriptEngine | Ergebnis für Skript 10048
    int(-2147483648)
    15.05.2018 20:03:28 | ScriptEngine | Ergebnis für Skript 10048
    float(2147483648)
    Ausgabe IPS 5.0 (PHP 7.2):

    Code:
    2147483648
    2147483648
    int(2147483648)
    Code:
    15.05.2018 20:07:16 | ScriptEngine | Ergebnis für Skript 10048
    int(-2147483648)
    15.05.2018 20:07:16 | ScriptEngine | Ergebnis für Skript 10048
    int(-2147483648)
    15.05.2018 20:11:18 | ScriptEngine | Ergebnis für Skript 10048
    float(2147483648)
    Somit halten wir fest.
    PHP 5.6 hat getrickst und einfach einen Float aus den Wert gemacht.
    IPS hat es auch als Float verarbeitet. Somit waren größere Zahlen möglich.

    PHP 7.2 x64 kann mit größeren integern umgehen und gibt es so als integer an IPS weiter.
    IPS arbeitet intern mit 32Bit, somit wurde aus dem Int (korrekt) ein -2147483648.
    Um das gewünschte Verhalten der Konvertierung zu einen Float zu bekommen (wie bei PHP 5.X) , einfach einen cast (float) bei der Übergabe der Parameter anwenden.

    Nur weil PHP 5.X getrickst hat, und du es ausgenutzt hast; kann Symcon dafür nix

    Michael
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  8. #8
    Registriert seit
    Jan 2012
    Ort
    Neu-Isenburg
    Beiträge
    168

    Danke für die klare Erklärung! Wirklich TOP

Ähnliche Themen

  1. DB conversion
    Von wupperi im Forum Allgemeine Diskussion
    Antworten: 3
    Letzter Beitrag: 28.10.15, 22:45
  2. 1-Wire: "conversion failed" nach Update auf 3.4
    Von Gallo im Forum 1-Wire, M-BUS
    Antworten: 21
    Letzter Beitrag: 13.08.15, 10:50
  3. IPS_RunScriptEx & Sys_GetURLContent
    Von Ferengi-Master im Forum Skripte, PHP, SQL
    Antworten: 0
    Letzter Beitrag: 22.08.09, 13:16
  4. $IPS_SENDER von ips_runscriptex?
    Von Smudo im Forum Allgemeine Diskussion (2.x/3.x)
    Antworten: 6
    Letzter Beitrag: 26.03.09, 00:36