Gleich vorweg, ich möchte keine erneute Diskussion zum Thema double anzetteln. Trotzdem habe ich das Problem, dass ich mit einem externen Steuerrechner fest definierte Datenstrukturen austauschen muss, die zum größten Teil aus 8-Byte-double Feldern bestehen. Für die interne Rechnerei würde auch 4Byte-double reichen. Leider ist in AVR-Studio (gcc) der double- und auch der real- Typ nur mit 4Byte definiert. Bisher konnte ich auch keine Compilereinstellung finden, die 8Byte zuläßt. Ausserdem funktioniert sprintf auf double und real mit %f nicht. Da wird ein ? geliefert. Hat jemand eine Ahnung was das bedeutet? Für Tipps bezüglich 8Byte double wäre ich sehr dankbar. Gibt es vielleicht doch einen Compilerschalter oder einen anderen Compiler, der das kann?
Auch wenn das hier fuer echten double gedacht ist, kann dieser Code als basis dienen.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
Gast
#458656
>die zum größten Teil aus 8-Byte-double Feldern bestehen. du übernimmst die doch nicht etwa binär??? arbeite im AVR mit 4 Byte double und übergib es als ASCII. >Ausserdem funktioniert sprintf auf double und real mit %f nicht. möglicherweise hast du vergessen die floating point library zu linken. >inen anderen Compiler, der das kann? IAR
Das Fragezeichen wird von der schlankeren nicht-float-printf-Library ausgegeben; Du musst nur die fettere float-unterstützende printf-Library verwenden und schon geht's. Überprüfe die Linkereinstellungen bzw. die gelinkten Libraries. Eine manuelle Konvertierung von double nach float müsste mit partiellem Kopieren der höchstwertigen Bits der Mantisse und Bitschieben des Exponenten möglich sein; Du solltest Dir mal die binäre Repräsentation der entsprechenden Formate ansehen. Natürlich ist der Wertebereich von float gegenüber double beschränkt, bei zu großen Exponenten musst Du Dir also eine sinnvolle Fehlerbehandlung einfallen lassen.
Gast
#458664
@Francesco: das ist eine Konvertierung von 80Bit nach 64 Bit aber was ist denn das? >double ConvertFromIeeeExtended(bytes) >unsigned char *bytes; /* LCN */ >{ funktion Convert... gibt double zurück hat als Parameter bytes unbekannter Typ in Fkt. wird lokale Variable (pointer) bytes auf char definiert oder interpretiere ich da was falsch?
>> double ConvertFromIeeeExtended(bytes) >> unsigned char *bytes; /* LCN */ >> { > funktion Convert... gibt double zurück hat als Parameter bytes > unbekannter Typ > in Fkt. wird lokale Variable (pointer) bytes auf char definiert > oder interpretiere ich da was falsch? Das ist altes K&R C im neueren ANSI C würde es heissen: double ConvertFromIeeeExtended( unsigned char* bytes ) { ...
Gast
#458683
danke für die Erklärung, hatte schon so ne Ahnung...
Wolfram wrote: > möglicherweise hast du vergessen die floating point library zu linken. Ich habe die Lib libprintf_flt.a unter Librarys in den Projekteinstellungen übernommen - keine Änderung. > IAR Was kostet das Teil?
Michael Korb wrote: > Ich habe die Lib libprintf_flt.a unter Librarys in den > Projekteinstellungen übernommen - keine Änderung. AVR Studio bietet keine sehr nutzerfreundliche Bedienerführung für diese Art Einstellung. <Werbung>Mfile ist da besser.</Werbung> Du musst noch -Wl,-u,vfprintf in die Optionen aufnehmen (vor allen Bibliotheken). >> IAR > Was kostet das Teil? Mehr als ein gebrauchtes Auto. Offizielle Preise wirst du nur vom IAR Salesdroiden deines geringsten Misstrauens erfahren.
Jörg Wunsch wrote: > Du musst noch -Wl,-u,vfprintf in die Optionen aufnehmen (vor allen > Bibliotheken). Compileroption oder Linkoption?
Linker.
klappt nicht. Hab mal als externes Makefile exportiert - s. Anhang.
-uvfprintf ist eine Option Nochmal zum Mitschreiben: AVR Studio, Project Configuration 'Libraries' anwählen: libprintf_flt.a 'Add Library' libc.a 'Add Library' 'Custom Options' anwählen: Linker Options auswählen -uvfprintf 'Add' 'OK' Die Reihenfolge der Libraries scheint wichtig zu sein. Wenn man die umdreht, gehts nicht mehr.
Vielen Dank, jetzt hab ichs gerafft und es funzt.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.