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
undsigned char
sind zum rechnen.Bei dir ist C ein Pointer, der irgendwo hinzeigt.
Was willst du machen?
Da Pointer keine
int
sind, und weder einint
noch einchar*
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, mitmemset
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
odermemcpy
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 dumemset
odermemcpy
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)?