Morgen zusammen!
Mal ne Frage: Bei der Umwandlung von float nach uint8_t, kann man da
irgendwie festlegen, dass der float definitiv aus 4 uint8_t besteht?
Ich frage wegen Portierung auf anderes System, wo der float evtl. nicht
4 Byte groß ist, es programmbedingt aber unbedingt sein muss.
Gibt es da eine Möglichkeit?
Nö, festlegen kann man das nicht.
Aber den Fehlerfall erkennen; wenn sizeof (float) was anderes als 4
ergibt, kannst Du das irgendwo vermerken, sei es als Fehlermeldung beim
Compilieren, sei es als Exception zur Programmlaufzeit.
Mal eine Verständnisfrage noch: Geht es so auch, wie ich es jetzt
geändert habe mit dem "data" als Zeiger. Jetzt würde ich die Adresse an
die Funktion übergeben. Den Stern bei pointer = (uint8_t*) data; habe
ich jetzt dann weggenommen, weil das ja dann schon die Adresse sein
sollte.
Und wie ist es mit der letzten Zeile? Macht es einen Unterschied, ob ich
*buffer[repeat] = *pointer++;
oder
buffer[repeat] = *pointer++;
schreibe? Ein Array wird doch eh als Adresse übergeben, oder?
Dennis schrieb:> Und wie ist es mit der letzten Zeile? Macht es einen Unterschied, ob ich>> *buffer[repeat] = *pointer++;>> oder>> buffer[repeat] = *pointer++;>> schreibe?
Allerdings. Im ersten Fall dereferenzierst Du "buffer[repeat]", was in
die Hose geht, weil "buffer" kein Array von Pointern ist.
Literaturhinweis:
Brian Kernighan & Dennis Ritchie, "Programmieren in C", 2. Auflage,
Hanser-Verlag.
Rufus Τ. Firefly schrieb:> Allerdings. Im ersten Fall dereferenzierst Du "buffer[repeat]", was in> die Hose geht
Schon klar, aber wenn ich ein Array übrgebe, dann bekommt die Funktion
doch die Adresse des Arrays, oder nicht? Wenn ich dann aber den Inhalt
der Adresse beschreiben will, muss ich doch eigentlich * voranstellen.
Was verstehe ich hier gerade falsch?
Rufus Τ. Firefly schrieb:> Nö, festlegen kann man das nicht.
Jein, Ansi C99 sagt zumindest:
Annex F
"The C floating types match the IEC 60559 formats as follows:
— The float type matches the IEC 60559 single format.
— The double type matches the IEC 60559 double format.
— The long double type matches an IEC 60559 extended format,301) else a
non-IEC 60559 extended format, else the IEC 60559 double format."
C++0x nimmt da mal wieder einen schwachsinnigen Sonderweg und definiert
in
3.9.1 8)
"The type double provides at least as much precision as float, ... The
value representation of floating-point types is implementation-defined."
> Aber den Fehlerfall erkennen; wenn sizeof (float) was anderes als 4> ergibt, kannst Du das irgendwo vermerken, sei es als Fehlermeldung beim> Compilieren, sei es als Exception zur Programmlaufzeit.
Dennis schrieb:> Rufus Τ. Firefly schrieb:>> Allerdings. Im ersten Fall dereferenzierst Du "buffer[repeat]", was in>> die Hose geht>> Schon klar, aber wenn ich ein Array übrgebe, dann bekommt die Funktion> doch die Adresse des Arrays, oder nicht? Wenn ich dann aber den Inhalt> der Adresse beschreiben will, muss ich doch eigentlich * voranstellen.> Was verstehe ich hier gerade falsch?
"buffer[repeat]" ist aequivalent zu "*(buffer + repeat)". Wenn Du jetzt
noch ein "*" voranstellst bekommst Du "**(buffer + repeat)". Das geht
aber hoechstens wenn buffer ein Array von Pointern ist. Ist es aber hier
nicht.