Typecast?

ThomasW69
 
Avatar
 
Subject:

Typecast?

 · 
Posted: 23.01.2012 - 12:21  ·  #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
 
Subject:

Re: Typecast?

 · 
Posted: 23.01.2012 - 12:39  ·  #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
 
Subject:

Re: Typecast?

 · 
Posted: 23.01.2012 - 14:21  ·  #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
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Typecast?

 · 
Posted: 23.01.2012 - 18:03  ·  #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
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Typecast?

 · 
Posted: 23.01.2012 - 21:02  ·  #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
Attachments
Typecast?
Filename: 2012-01-23_211323.JPG
Filesize: 37.46 KB
Title:
Download counter: 26
Typecast?
Filename: 2012-01-23_211608.JPG
Filesize: 34.28 KB
Title:
Download counter: 24
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   95   110 · Page-Gen-Time: 0.025449s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI