Seite 1 von 1

Int(Var.f) kein Integer?

Verfasst: 24.04.2018 20:24
von qvex
Hallo,

es geht um folgende Zeilen:

Code: Alles auswählen

;PrintN(":" +  Str(Round( (Int(Seconds)%60) /10, #PB_Round_Nearest)*10))
;                         -----------------
iSeconds= (Int(Seconds)%60)
 PrintN(":" +  Str(Round(     iSeconds      /10, #PB_Round_Nearest)*10))
;
Die erste Zeile bringt (ohne Auskommentierung) die Fehlermeldung, dass der %-Operator einen Integer-Wert erwartet. Trotz Umwandlung mittels Int().
Wenn ich aber wie zwei Zeilen weiter unten den selben Ausdruck vorher in eine Variable packe, und diese Variable dann in die ansonsten identische Formel, geht es wie gedacht. Woran liegt das?

Hier noch der ganze Code (kleiner hingewurschtelter Mikrowellenumrechner)

Code: Alles auswählen

EnableExplicit

OpenConsole("Mikrowellenrechner")

#MyWatt= 600 ; Meine Mikrowelle hat 600 Watt.

Define.c WattIn, MinutesIn, SecondsIn ; Auf der Packung des Tiefkühlgerichts ist eine andere Wattzahl angegeben.
Define.f Seconds
Define.c iSeconds

Print( #CRLF$ + " Vorgegebene Leistung (Watt): " )
WattIN= Val( Input())
Print( #CRLF$ + " Vorgegebene Zeit  (Minuten): " )
MinutesIn= Val( Input())
Print( #CRLF$ + " Vorgegebene Zeit (Sekunden): " )
SecondsIn= Val( Input())

Seconds = MinutesIn * 60 + SecondsIn
Seconds * (WattIn / #MyWatt)
Print( #CRLF$ + "          Einzustellende Zeit: "+Str(Int(Seconds/60)))

;PrintN(":" +  Str(Round( (Int(Seconds)%60) /10, #PB_Round_Nearest)*10))    ; <------------------------------------
;                         -----------------
iSeconds= (Int(Seconds)%60)
 PrintN(":" +  Str(Round(     iSeconds      /10, #PB_Round_Nearest)*10))    ; <------------------------------------
;                             --------

If GetEnvironmentVariable("PROMPT")=""
  Print(#CRLF$ +" Drücke Taste zum Beenden")
  Repeat:Until Inkey()
EndIf

Re: Int(Var.f) kein Integer?

Verfasst: 24.04.2018 20:48
von ccode_new
Hallo qvex,

beide Varianten sind im Allgemeinen korrekt.

Es scheint wohl (Konvertierungsabhängig ?) unter PureBasic nicht unterstützt zu werden.

Aber interessante Feststellung und nettes Programmchen.

Vielleicht kann hier jemand auch noch etwas anderes dazu sagen. (Vielleicht Assembler-Ausgabe analysieren ?)

.......

Für PureBasic hat für solche Fälle extra eine Funktion (Mod).

So funktioniert es:

Code: Alles auswählen

PrintN(":" + Str(Round( Mod(Seconds,60) /10, #PB_Round_Nearest)*10))

Re: Int(Var.f) kein Integer?

Verfasst: 24.04.2018 21:49
von mk-soft
Eigentlich logisch wegen Autocast (automatische Typewandlung)

Round( (Int(Seconds)%60) /10, #PB_Round_Nearest)*10)

1. Round -> Type Float -> Jetzt festgelegt
2. Int(Second) -> Second nach Type Integer -> dann wieder nach Type Float gegen Autocast
3. Zwischenergebnis Float von "Int(Second)" mit % 60 /10 nicht zulässig -> Fehler

Re: Int(Var.f) kein Integer?

Verfasst: 24.04.2018 22:16
von ccode_new
Hallo mk-soft,

ganz so logisch finde ich deine Erklärung jetzt nicht.
1. Round -> Type Float -> Jetzt festgelegt
2. Int(Second) -> Second nach Type Integer -> dann wieder nach Type Float gegen Autocast
Warum wird dann eine übergebene Integer-Variable nicht automatisch in eine Float-Variable umgewandelt ?

Re: Int(Var.f) kein Integer?

Verfasst: 24.04.2018 23:23
von qvex
Für PureBasic hat für solche Fälle extra eine Funktion (Mod).

So funktioniert es:

Code: Alles auswählen

PrintN(":" + Str(Round( Mod(Seconds,60) /10, #PB_Round_Nearest)*10))
Danke. Eine unnötige Variable gespart.
Der abgespeckte vollständige Code nun:

Code: Alles auswählen

EnableExplicit

OpenConsole("Mikrowellenrechner")

#MyWatt= 600 ; Meine Mikrowelle hat 600 Watt.

Define.c WattIn, MinutesIn, SecondsIn ; Auf der Packung des Tiefkühlgerichts ist eine andere Wattzahl angegeben.
Define.f Seconds

Print( #CRLF$ + " Vorgegebene Leistung (Watt): " )
WattIN= Val( Input())
Print( #CRLF$ + " Vorgegebene Zeit  (Minuten): " )
MinutesIn= Val( Input())
Print( #CRLF$ + " Vorgegebene Zeit (Sekunden): " )
SecondsIn= Val( Input())

Seconds = MinutesIn * 60 + SecondsIn
Seconds * (WattIn / #MyWatt)
Print( #CRLF$ + "         Einzustellende Zeit: "+Str(Int(Seconds/60)))
PrintN(":" + Str(Round( Mod(Seconds,60) /10, #PB_Round_Nearest)*10))

If GetEnvironmentVariable("PROMPT")=""
  Print(#CRLF$ +" Drücke Taste zum Beenden")
  Repeat:Until Inkey()
EndIf
Ein wenig irritiert mich aber noch, dass geklammerte Ausdrücke anscheinend nicht von innen nach außen ausgewertet werden. Na, mal sehen.