Int(Var.f) kein Integer?

Anfängerfragen zum Programmieren mit PureBasic.
qvex
Beiträge: 4
Registriert: 24.04.2018 19:13

Int(Var.f) kein Integer?

Beitrag 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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Int(Var.f) kein Integer?

Beitrag 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))
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Int(Var.f) kein Integer?

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Int(Var.f) kein Integer?

Beitrag 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 ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
qvex
Beiträge: 4
Registriert: 24.04.2018 19:13

Re: Int(Var.f) kein Integer?

Beitrag 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.

 
 
Antworten