Bug Integer ???

Hallo,

ich bin mir nicht sicher ob man das als Bug bezeichnen kann oder nur Schönheitsfehler.
Aber eine vorangesteltte „0“ oder vor einer Intergerzahl oder nicht hat unterschiedliche Auswirkungen.

In meinem Fall geht es um folgende Zeile im Script:

IPS_SetVariableProfileAssociation($ProfilName, 1, "anzeigen", "", 65280 /*[Objekt #65280 existiert nicht]*/);

Um den autom erzeugten Text „/[Objekt #65280 existiert nicht]/“ nicht im Script zu haben, habe ich vor die Integerzahl eine 0 geschrieben. Also folgendes:

IPS_SetVariableProfileAssociation($ProfilName, 1, "anzeigen", "", 065280);

ABER die erzeugte Farbe ist komplett anders, und zwar 426. :eek:

Wenn ich das richtig lese müsste das HEX sein

IPS_SetVariableProfileAssociation("Temperatur", 1, "Wert 1", "Speaker", 0xFFFFFF);

Wibo hat recht…

Aber wie kommst du denn auf 65280? Was wolltest du denn damit aussagen? 426 sieht mir nicht wie ein Farbcode aus…

Edit:

Ah, nun check ich’s… 0x00FF00 (grün) ist das was du suchst

Toni

Ich habe ein fertiges Profil mit dieser Funktion hier
https://www.symcon.de/service/dokumentation/vorgehensweisen/wie-kann-ich/
ganz unten (… ein Variablenprofil exportieren?) erst ausgelesen, so die Eigenschaften (Farben, …) ermittwelt
und die Zahl dann in meinem Script verwendet.

@wibo: Auch wenn HEX keine Datentyp ist, sodern nur Darstellungsformat, ist dein Vorschlag deutlich die besser Variante. Werde die Farben auf HEX ändern. Danke für den Hinweiss!

Ah, achso. Der Wert simmt auch. Nur deine Darstellungsweise halt nicht. So bin ich ja auch drauf gekommen. Grün war doch richtig, oder?

Der Hinweis von wibo steht im Übrigen auch so in der Doku :wink:

Toni

Ja, sollte grün sein. Werde alle Farbcodes auf das HEX Format ändern. Das hilft mir schon weiter. Danke!

Trotzdem ist / sollte programmtechnisch das DEZ Format bei Integerzahl auch möglisch sein und die Zahl 123 ist bei Integer das gleiche wie 0123.:wink:

Kann ja nicht… Wie soll denn der arme Interpreter wissen ob du 000090 (0x5A) oder 0x000090 (0x90) gemeint hast? Wie du ja grad selbst festgestellt hat ist 0x065280 (was der Interpreter verstanden hat) ja ein durchaus gültiger Wert.

Wird schon einen Grund haben warum das explizit so beschrieben ist.

Toni

Alles klar, SORRY, ist mein Fehler da ich den Hinweis nicht beachtet habe und nur auf die Deklaration im Kopf geachtet habe.

Was mich jetzt nur noch etwas wundert (ungeachtet dieser oben genannten Funktion) ist die letzte Ausgabezeile von folgendem Script:

<?
	$Var1 = 0000003.45;
	echo gettype($Var1) . " / ". $Var1 ."
";

	$Var2 = 0000003;
	echo gettype($Var2) . " / ". $Var2 ."
";
	
	$Var3 = 4;
	echo gettype($Var3) . " / ". $Var3 ."
";

	$Var4 = 0x5;
	echo gettype($Var4) . " / ". $Var4 ."
";

	$Var5 = 0x000006;
	echo gettype($Var5) . " / ". $Var5 ."
";
	
	$Var6 = 07;
	echo gettype($Var6) . " / ". $Var6 ."
";
	
	$Var7 = 000007;
	echo gettype($Var7) . " / ". $Var7 ."
";
	
	$Var8 = 08;
	echo gettype($Var8) . " / ". $Var8 ."
";
?>
double / 3.45
integer / 3
integer / 4
integer / 5
integer / 6
integer / 7
integer / 7
integer / 0

Bis zur Zahl 7 ist die 0 davor kein Problem beim Integer.

/Edit:
Hab das gleiche eben auch an einem Webserver probiert; das gleiche Ergebniss.
Hmm, scheint wohl bei PHP normall zu sein.

PHP ist nicht typsicher. Du hast ihm ja nie verraten was $VarX eigentlich ist. Im Hintergrund sitzt eine kleine Logik und würfelt jedes mal. Das klappt im Alltag ganz gut aber verlassen darf man sich bei PHP nie drauf. Wer von einer Hochsprache „umschult“ wird da öfter ins Fettnäpfchen treten.

In einer if-Abfrage kann „7“ (string) == 7 (integer) schon auch mal true ergeben. Normal ein Unding für einen erfahrenen Programmierer. Dafür gibt es in PHP dann speziell den === Operator, der das „richtig“ macht.

$Var1 = 4;
$Var2 = 4.0;
$Var3 = "4";
    
echo gettype($Var1) . " / ". $Var1 ."
";
echo gettype($Var2) . " / ". $Var2 ."
";
echo gettype($Var3) . " / ". $Var3 ."
";

if ($Var1 = $Var2 && $Var1 == $Var3)
    echo "in PHP alles das Selbe"

Gruß,

Toni

@ Toni. Vielen Dank dir für den Backround. [emoji106]

Bin über die vorangestellte 0 gestolpert da ich in CodeSys oder Basic was anderes mit dem Datentyp Integer gewohnt bin. Bin halt in PHP noch nicht so fit.

Solange klar ist, dass er den Wert als Integer interpretieren soll kannst du so viele Nullen voran stellen wie du magst. Ich schätze du hast ihn damit einfach „beim Würfeln“ verwirrt. Wenn du den „Würfel-Algo“ im Hintergrund austricksen willst kannst du den Vartype auch direkt erzwingen: Intval()

[Edit]
Lustig… auch das scheint in PHP nicht ohne Stolpersteine zu gehen…

Demnach wird eine vorangestellte Null als Oktalprefix interpretiert. Das erklärt dann natürlich auch warum es in deinem Test mit Werten kleiner 8 noch funktioniert hat. War mir jetzt auch neu. Vielleicht lässt du sie doch lieber einfach weg. :smiley:
[/Edit]

Toni