Forum: PC-Programmierung Int in Array zerlegen


von Praktikant (Gast)


Lesenswert?

Moin Moin,
ich versuche gerade ein Integer in zwei Bytes zu zerlegen.. aber 
irgendwie funktioniert das nur mit Zahlen kleiner 255. Warum ist das so, 
und gibt es dafür eine Lösung?

1
typedef union MyVal{
2
unsigned int valInt;
3
unsigned char buffVal[CAN_DATA_LENGTH];
4
5
}GetMyVal;
6
7
GetMyVal SetMyVal;
8
9
unsigned int Value=260;
10
unsigned char Buff[2];
11
12
13
SetMyVal.valInt=Value;
14
15
Buff[0]=SetVal.buffVal[0];
16
Buff[1]=SetVal.buffVal[1];

Viele Grüße

von g a s t (Gast)


Lesenswert?

Was ist CAN_DATA_LENGTH? 2?

Das Problem kommt alle drei Tage hier im Forum. Ich meine der Standard 
sagt man darf nur das lesen was zuletzt geschrieben wurde. Wenn du denn 
GCC nimmst versuchs mal mit attribute((_packed_)).

von g a s t (Gast)


Lesenswert?

grmpf
1
attribute((__packed__))

von Praktikant (Gast)


Lesenswert?

g a s t schrieb:
> Was ist CAN_DATA_LENGTH? 2?

Ja, ist 2.

Leider funktioniert das trotz packed nicht.

von Praktikant (Gast)


Lesenswert?

Hier der Code ausm GCC:
1
union attribute((__packed__)) MyVal{
2
unsigned int valInt;
3
unsigned char buffVal[2];
4
5
};
6
7
union MyVal SetMyVal;
8
9
unsigned int Value=260;
10
unsigned char Buff[2];
11
12
13
SetMyVal.valInt=Value;
14
15
Buff[0]=SetVal.buffVal[0];
16
Buff[1]=SetVal.buffVal[1];

von DirkB (Gast)


Lesenswert?

Bei little Endian:
Buff[0] =  Value       & 0xff;
Buff[1] = (Value >> 8) & 0xff;

von Uwe (Gast)


Lesenswert?

Ich würde in der Union ( der übersichtlichkeit wegen ) entweder 4 
unsigned chars für ein unsigned int nehmen oder 2 unsigned chars für ein 
unsigned short int.

von Praktikant (Gast)


Lesenswert?

Da kommt immer das gleiche heraus, egal auf welche Art ich das mache.
Habe es gerade noch mit memcpy versucht.. same shit. -.-

von Rolf Magnus (Gast)


Lesenswert?

unions sind für sowas überhaupt nicht gedacht. Dazu kommt, daß int 32 
Bit breit ist und nicht 16. Gehen müßte es aber trotzdem. Bei mir kommt 
wie erwartet für Buf[0] 4 raus und für Buf[1] 1.

Praktikant schrieb:
> Da kommt immer das gleiche heraus, egal auf welche Art ich das mache.

Was kommt denn raus?

> Habe es gerade noch mit memcpy versucht.. same shit. -.-

Kannst du mal ein kurzes, aber komplettes Programm zeigen, wo du das 
Problem hast?

von Peter II (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Dazu kommt, daß int 32 Bit breit ist und nicht 16
nicht auf einem 16Bit Prozessor

von Rolf Magnus (Gast)


Lesenswert?

Du meinst, er programmiert noch für DOS?

von Peter II (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Du meinst, er programmiert noch für DOS?

oder für ein µC mit 8bit

von Rolf Magnus (Gast)


Lesenswert?

Davon gehe ich im Forum "PC-Programmierung" nicht aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.