Forum: Compiler & IDEs char in short kopieren


von Owen S. (senmeis)


Lesenswert?

Servus,

ich habe zwei Array:
1
unsigned char var1[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
2
unsigned short var2[4];
Nun sollen die Werte des var1 ins var2 kopiert werden, also nach dem 
Kopieren:

var2[0] = 0x1122, var2[1] = 0x3344, var2[2] = 0x5566, var2[3] = 0x7788

Die Frage ist, wie macht man dies effizient und zuverlässig für den 
Atmega128.

MfG
Senmeis

von Volker Z. (vza)


Lesenswert?

1
memcpy(var2,var1,8);

von tuppes (Gast)


Lesenswert?

Volker Zabe schrieb:
> memcpy(var2,var1,8);

Leider nicht. Der ATmega ist ein Little-Endian-Prozessor, d.h. nach 
einfachem memcpy sieht var2 so aus:
1
unsigned short var2[4] = 
2
{
3
    0x2211
4
    , 0x4433
5
    , 0x6655
6
    , 0x8877
7
};

von Volker Z. (vza)


Lesenswert?

war aber immer hin eine 50% Chance.
1
char *ptr1=       var1;
2
char *ptr2=(char*)var2;
3
4
for(i=0;i<4;i++)
5
{
6
   *(ptr2+1) = *ptr1++;
7
   *(ptr2  ) = *ptr1++;
8
   ptr2 += 2;
9
}

von Karl H. (kbuchegg)


Lesenswert?

Dann wird den TO wohl nichts anderes übrig bleiben, als sich einen der 
mittlerweile unzähligen Threads rauszusuchen, die alle nach dem Muster
"Hilfe, wie mache ich aus 2 mal 8 Bit eine 16 Bit Zahl"
gestrickt sind und das Ganze in eine Schleife einzubauen.

von Karl H. (kbuchegg)


Lesenswert?

Volker Zabe schrieb:
> war aber immer hin eine 50% Chance.

Ja.

Aber wie so oft:
Wenn es 2 Möglichkeiten gibt, hast du eine 75% Chance zuerst die falsche 
zu erwischen :-)

(frei nach Murphy)

von Sven H. (dsb_sven)


Lesenswert?

1
for (int i = 0; i < 4; i++)
2
{
3
  var2[i] = var1[2*i] + ((uint16_t)var1[2*i+1] << 8);
4
}

von Owen S. (senmeis)


Lesenswert?

vielen Dank.

Was ist mit dem umgekehrtem Kopieren? Gibt’s bessere Lösungen als
1
for (i = 0; i < 4; i++)
2
{
3
  var1[2*i] = (uint8_t)var2[i];
4
  var1[2*i+1] = (uint8_t)var[i] >> 8;
5
}
?

MfG
Senmeis

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.