int in char



  • Wenn ich int in char wandeln will, muss ich hierfür unsigned char oder char nehmen?

    Das ganze sieht so aus:

    int i = 212;
    char* c; // oder unsigned char* ???

    memset(c, 0, 4);
    memcpy(c, &i, 4);

    Vielen Dank!



  • char ist für Zeichen.
    unsigned char und signed char sind zum rechnen.

    Bei dir ist C ein Pointer, der irgendwo hinzeigt.

    Was willst du machen?

    Da Pointer keine int sind, und weder ein int noch ein char* 4 Byte groß sein müssen, ist die Lösung deines eigentlichen Problems besser, als eine Lösung für deine (vermeintliche) Lösung zu finden.



  • Es geht darum, um z.B. beliebig lange Strukturen abspeichern zu können. Das mit 4 Byte hier war nur ein Beispiel.

    Beispielsweise könnte das char* insgesamt 64 Bytes speichern können und somit einige Integer abspeichern.

    Verwende ich hierfür unsigned char* oder char*?



  • Warum verwendest du keine Arrays?

    Nochmals: Was willst du genau machen (bzw. was programmierst du gerade)? Wofuer willst du beliebig lange Strukturen speichern koennen?



  • Es geht um ein CAN Interface. Das mit char* ist so vorgegeben, ich würde es selbst auch anders machen.

    Nur die Frage ist char* oder unsigned char*?



  • Im Prinzip egal, da du ja nicht direkt über char* darauf zugreifst, sondern über einen cast.

    Daher kann es auch ein void* sein.

    Nimm den Zeiger, den du für deine Daten brauchst. In ein char* zur Datenübertragung kannst du den immer noch casten.

    Aber wenn es dir besser gefällt, nimm unsigned char .



  • Das erste Problem was du hast mit

    int i = 212; 
     char* c; // oder unsigned char* ??? 
    
     memset(c, 0, 4); 
     memcpy(c, &i, 4);
    

    dass c ist nicht initialisiert und somit zeigt irgendwo hin, mit memset kann alles möglich passieren: vom harmlosesten crash (segfault) zum gefährlichsten Überschreiben von wichtigen Daten im Speicher.

    Für CAN Datagramme würde ich das hier nutzen

    #include <stdint.h>
    #include <string.h>
    
    struct CANDatagram {
        uint16_t cobid;   /* CANOpen 11 bit COB-ID (communication object identifier) */
        size_t   len;     /* length of the message, 0 to 8 */
        uint8_t  data[8]; /* 8 bytes of data */
    }
    

    Denk daran, dass ein memset oder memcpy hier fehl am Platz sind, weil CANOpen (ich geh davon aus, du nutzt CANOpen) little endian nutzt und das heißt, wenn dein System big endian nutzt und du memset oder memcpy nutzt, dann sind die Daten falsch angeordnet. Da muss man schon seine eigene Konvertierungsfunktionen schreiben.

    Außerdem würde ich auch ein Set von Funktionen schreiben, die dir helfen die unterschiedlichen CAN Datagrame aufzubauen, bsp

    void create_NMT(struct CANDatagram *can, uint8_t nmt)
    {
        can->cobid = 0;
        can->length = 1;
        memset(can->data, 0, sizeof can->data);
        can->data[0] = nmt;
    }
    
    ...
    


  • Ich finde es erschreckend, daß jemand CAN-Kommunikation programmiert, der keine Ahnung von der Grundlagen der Programmierung (bzw. der Sprache C) sowie der Datentypen hat.

    @EF2004 : ich hoffe mal, du programmierst keinen ECUs (Steuergeräte)?


Log in to reply