www.mikrocontroller.net

Forum: Compiler & IDEs char in short kopieren


Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

ich habe zwei Array:
unsigned char var1[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
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

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
memcpy(var2,var1,8);

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned short var2[4] = 
{
    0x2211
    , 0x4433
    , 0x6655
    , 0x8877
};

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
war aber immer hin eine 50% Chance.
char *ptr1=       var1;
char *ptr2=(char*)var2;

for(i=0;i<4;i++)
{
   *(ptr2+1) = *ptr1++;
   *(ptr2  ) = *ptr1++;
   ptr2 += 2;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Sven H. (dsb_sven)
Datum:

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

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank.

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

MfG
Senmeis

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.