Typecast?

ThomasW69
 
Avatar
 
Betreff:

Typecast?

 · 
Gepostet: 23.01.2012 - 12:21 Uhr  ·  #1
Hallo Zusammen.

Ich habe gerade folgende Berechnung in der mir der Compiler eine Fehlermeldung bringt

location.MJUL:=A+B+trunc(30.6001*(MON+1))+DAY+Ddd(HOUR,MINute,SEC)*d24; //mod Julianisches Datum

Alle VAriablen sind vom Typ Fix64

ersetze ich
trunc(30.6001*(MON+1))
durch
fix64(trunc(30.6001*(MON+1)))
so kann ich compilieren.

erkennt der Compiler nicht automatisch, dass das Ergebnis ein Fix64 sein muss, wenn alle Variablen Fix64 sind oder ist das aus mir noch unbekannten gründen so gewollt?
ThomasW69
 
Avatar
 
Betreff:

Re: Typecast?

 · 
Gepostet: 23.01.2012 - 12:39 Uhr  ·  #2
und gleich noch ein Effekt hinterher.

Code
procedure CalcTimes;
var YEAR: fix64;
....
begin
  YEAR:= 2000.0+inttofix64(Location.UTC_Year);
  ...


Die VAriable UTC_Year ist vom Typ byte. Darin ist das Jahr abgespeichert. Aus Platzgründen und weil es im RTC eh nur als byte abgelegt ist habe ich halt keinen Integer verwendet. Man kan ja z.B. 2012 notfalls erzeugen kann indem man 2000 dazuaddiert. So jedenfalls die Theorie.
Im vorliegenden Fall klappt das aber nicht. Die Variable YEAR ist nach der Ausführung immer 12.0 (in location.UTC_Year wurde vorher 12 eingetragen).
Die Addition mit von 2000 wird komplett ignoriert.
ThomasW69
 
Avatar
 
Betreff:

Re: Typecast?

 · 
Gepostet: 23.01.2012 - 14:21 Uhr  ·  #3
Ich habe da nochmal ein wenig nachgeforscht. Es ist so, dass additionen eines Fix64Variable mit einer Zahl nicht richtig comipliert werden uns so nicht funktionieren. Additionen von zwei Fix64 Variablen funktionieren hingegen tadellos. Am obien beuspiel heißt es, dass
Code

YEAR:= 2000.0+inttofix64(Location.UTC_Year); 

nicht funktioniert, hingegen
Code

YEAR:= 2000.0;
YEAR:=YEAR+inttofix64(Location.UTC_Year); 

das gewünschte Ergebnis liefert.

An andere Stelle hatte ich das selbe Problem.
Code

MON:=MON+1.0; //geht nicht 

hingegen
Code

var dummy: fix64;
...
dummy:=1.0;
MON:=MON+dummy;

liefert das korrekte Ergebnis.

Ob das auch andere Opertionen (-,*,/, usw.) betrifft hab ich jetzt nicht getestet.


Für das Problem mit dem Trunc habe ich mir eine eigene Funktion geschrieben
Code

function Fix64Trunc(const X : Fix64) : Fix64;
var result: Fix64;
begin
  result := inttoFix64(trunc(x));
  Return(result);
end;


Damit habe ich alle ehemaligen trunc ersetzt und jetzt geht es.
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 25
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: Typecast?

 · 
Gepostet: 23.01.2012 - 18:03 Uhr  ·  #4
Hallo Thomas,

wird bis zum WE behoben sein. Workaround:
Machen Sie einen Typecast um die Konstanten. Kostet kein Byte mehr.
mon:= mon + fix64(1.0);

rolf
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 25
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: Typecast?

 · 
Gepostet: 23.01.2012 - 21:02 Uhr  ·  #5
Hallo Thomas,

ich habe nun mal getestet:

mon:= 1;
mon:= 2.0 + mon;
mon:= mon +1.0;
LInt:= trunc(mon);

und die Ergebnisse waren immer korrekt. Bitte ein mini App schicken wo die Probleme nachvollziehbar sind. Beim Trunc(fix64) wird ein LongInt zurückgegeben !!!

rolf
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 14 · Cache Hits: 14   93   107 · Page-Gen-Time: 0.025406s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI