Schönheitsfehler bei Pointercasting



  • Hallo SeppSchrot,

    gut, aber das regt ihn nicht auf - immanent bastelt der Compiler sich das richtig hin - die Werte stimmen.
    Wie müßte es denn richtiger heißen?

    Er regt sich aber explizit auf, daß ich ihm einen Pointer auf double übergebe und er mit Pointer auch Char arbeitet.



  • Ich bin zwar selber nicht _der_ C-Profi aber vielleicht sollteast du als ersten Parameter mal '0' anstatt 0 nehmen, das wäre ja dann ein char..

    Und der Rückgabewert ist bestimmt auch falsch, so wie es aussieht müsste da doch ein int oder boolean zurückkommen, oder nicht?

    Ein double Wert kann ich aber beim besten Willen nirgends erkennen.



  • SeppSchrot schrieb:

    EDIT: Überbaupt hats dir char sehr angetan, oder? 😉

    Tja, werkle in einem Controller ständig gegen Stack overflow - da wird um jedes Byte gekämpft. C gibt's ja nicht nur für Gigabyte- Maschinen, oder 😉



  • Konrad schrieb:

    Ich bin zwar selber nicht _der_ C-Profi aber vielleicht sollteast du als ersten Parameter mal '0' anstatt 0 nehmen, das wäre ja dann ein char..

    Und der Rückgabewert ist bestimmt auch falsch, so wie es aussieht müsste da doch ein int oder boolean zurückkommen, oder nicht?

    Ein double Wert kann ich aber beim besten Willen nirgends erkennen.

    Nein, das stimmt schon so, Konrad. Bei if entscheidet immer der boolesche Wert, der Null (false) oder nicht Null (true) ist. Ist sogar echt ANSI.

    Wie man ein Char auslegt, ist Geschmackssache, wenn man nicht die strings.h bemüht - es ist immer nur ein Byte, das übergeben wird.

    Die variable "fliess" ist typ double.

    Wirklich und echt, mein Problem liegt nur in der Uminterpretierung der Pointers von irgendeinem Typ außer char in einen Ponter auf char. 😞


  • Mod

    Konrad schrieb:

    Ich bin zwar selber nicht _der_ C-Profi aber vielleicht sollteast du als ersten Parameter mal '0' anstatt 0 nehmen, das wäre ja dann ein char..

    bloss nicht. es besteht ein grosser unterschied zwischen der zahl null und dem zeichen '0'

    im prinzip müsstest du alle warnungen durch explizites casting beim aufruf wegbekommen:

    if (I2C_ee_multiwrite(0, 4, (char*)&fliess, (char)sizeof(fliess))) chirp_lh(1); // chirp = Signal, wenn Scheiben / Lesen erfolgreich
    if (I2C_ee_multiread(0, 4, (char*)&fliess, (char)sizeof(fliess))) chirp_lh(1);
    

    in der regel wird man aber pointer, die auf irgenwas zeigen dürfen, mit void* deklarieren - denn dann darf man jeden pointer übergeben. nur in der funktion selbst musst du dann explizit nach char* casten:

    char I2C_ee_multiwrite(char, unsigned int, void*, unsigned char); // device, adress, Varpointer, amount
    char I2C_ee_multiread(char, unsigned int, void*, unsigned char);
    


  • camper schrieb:

    Konrad schrieb:

    Ich bin zwar selber nicht _der_ C-Profi aber vielleicht sollteast du als ersten Parameter mal '0' anstatt 0 nehmen, das wäre ja dann ein char..

    bloss nicht. es besteht ein grosser unterschied zwischen der zahl null und dem zeichen '0'

    hm, Ich dachte immer 0 und NULL wären nicht dasselbe.


  • Mod

    von NULL war doch gar nicht die rede 😕



  • camper schrieb:

    in der regel wird man aber pointer, die auf irgenwas zeigen dürfen, mit void* deklarieren - denn dann darf man jeden pointer übergeben. nur in der funktion selbst musst du dann explizit nach char* casten:

    Hallo camper, das hat geholfen - die Warnings sind weg!!! 😃

    Eine Frage noch, eine kleine Seltsamkeit:

    Das das direkte Casting auf den übergebenen Pointer in den multi-fkt hat nicht geklappt und z.B. ein Pointerinkrement hat der Compiler als "sinnlos" wegoptimiert. Erst, als ich einen lokalen Characterpointer eingeführt habe und den mit einem Cast eingerichtet, konnte ich mit der lokalen Kopie weiterarbeiten - seltsam 😕

    Gut, werd' erstmal schauen, ob die Fkt noch tut, was sie soll - the devil is the best inventor for confusion ... 😉



  • Hallo camper danke!!!

    Die Funktionen haben das Umbasteln unbeschadet überstanden 😃

    Mit der lokalen Kopie des Pointers kann ich auch leben ... jedenfalls besser als mit 60 Warnings, die einen langsam kopfscheu machen 😮

    Grüße ins Forum!!! :xmas1:


  • Mod

    void ist kein typ, selbst wenn es einer wäre, hätte er keine bestimmte grösse, die man für das increment benutzen könnte. also muss dort auch ein cast hin 🙂

    wenn ich mich nicht täusche, dann kannst du in C den void* pointer auch ohne cast and die lokale kopie übergeben. malloc liefert ja z.b auch void* pointer. beim C casting gilt generell, lieber eine klammer mehr als eine zu wenig. also:
    ((char*)p)++ oder ((char)p) etc. dann klappt es vielleicht auch ohne kopie.


Anmelden zum Antworten