mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Char Array in Int Array kopieren


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich empfange per RS232 Daten. Diese Daten werden in ein unsigned char 
array geschrieben. Es kommt immer wird immer zuerst das Low Byte und 
dann das High Byte übertragen.

Wenn ich alle Daten empfangen habe möchte ich das unsinged char array in 
ein unsigned int array kopieren. Uns zwar möchte ich die Daten im Little 
Endian Format abspeichern und dies am besten mit pointern.

Ich hatte an folgende Lösung gedacht:

* int_array = *char_array

anschließend die Adresse des Pointers erhöhen. Jedoch ist mir dann 
aufgefallen das der Integer Pointer um 2 Byte erhöht wird. Dies wird 
dann ja nicht funktionieren.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich ist es nur eine "einfache" Memcopy-Funktion jedoch scheitere 
ich gerade an solch einfachen Dingen.

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

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:

> anschließend die Adresse des Pointers erhöhen. Jedoch ist mir dann
> aufgefallen das der Integer Pointer um 2 Byte erhöht wird. Dies wird
> dann ja nicht funktionieren.

Ist aber richtig. Denn der nächste Integer ist ja im Speicher 
tatsächlich um 2 Bytes weiter.

Bei Pointeradditionen wird immer mit eingerechnet, wie gross der 
Datentyp ist, auf den der Pointer zeigt.


  int * pPtr;

   pPtr++;

der Pointer wird im Zahlenwert um 2 erhöht, wenn ein int auf einer 
Plattform 2 Bytes groß ist.

Ansonsten müsste man doch einen riesen Aufwand treiben, um 
Pointeroperationen von einer Platform auf eine andere zu portieren!

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

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Eigentlich ist es nur eine "einfache" Memcopy-Funktion jedoch scheitere
> ich gerade an solch einfachen Dingen.

Einfach nur nachdenken

wenn du an der Reihenfolge der Bytes nichts ändern musst, dann reicht es 
doch völlig aus, die Bytes einfach byteweise umzukopieren. Dazu darf man 
aber das Ziel nicht als Array von int ansehen, sondern einfach nur als 
Byte-Speicherfläche.


  memcpy( target, source, anzahl_Bytes );

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weis das ich dies nur Byteweise kopieren muss jedoch kenne ich nicht 
genau die Syntax um dies hinzubekommen.

Ich habe gesehn das mein Compiler ein Memcopy-Funktion besitzt:

void *memcpy(void *dest,void *src, unsigned int n)

jetzt ist mir jedoch unklar wie ich diese funktion aufrufe, da der 
Rückgabetype ja auch ein Pointer ist?

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

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Ich weis das ich dies nur Byteweise kopieren muss jedoch kenne ich nicht
> genau die Syntax um dies hinzubekommen.
>
> Ich habe gesehn das mein Compiler ein Memcopy-Funktion besitzt:
>
> void *memcpy(void *dest,void *src, unsigned int n)
>
> jetzt ist mir jedoch unklar wie ich diese funktion aufrufe, da der
> Rückgabetype ja auch ein Pointer ist?

Brauchst du den Return Wert?
Kannst du damit was anfangen?

Nein. Also lass ihn in Ruhe.
Du musst nichts mit einem Return Wert machen, wenn du keine Verwendung 
dafür hast. Wenn memcpy einfach nur die Bytes umkopiert, dann reicht das 
schon.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Demnach rufe ich die Funktion einfach wie folgt auf?

memcpy(&int_array[0], &char_array[0], 0x006);

Autor: Bernhard Spitzer (b_spitzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso denn solche Verrenkungen?
for(i=0; i<sizeof(iWert[]); i++)
 iWert[i] = 256*bWert[2*i+1] + bWert[2*i];

oder falls der Compiler die Multiplikation wirklich ausführen will, kann 
man auch (je nach Compiler) eine int-Variable an einer festen 
Speicherstelle definieren und dann an der selben Anfangsadresse 2 
char-Variablen hintackern. Schreiben 2x in char, lesen 1x aus int.
Bei geschickter Ausführung geht das auch mit Arrays. Die 
Compiler-Warning, dass da Speicherbereiche überlappen ignoriert man hier 
natürlich.

unn tschuess
Bernhard

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

Bewertung
0 lesenswert
nicht lesenswert
Johann schrieb:
> Demnach rufe ich die Funktion einfach wie folgt auf?
>
> memcpy(&int_array[0], &char_array[0], 0x006);

Manchmal kann die Welt so einfach sein :-)

  memcpy( int_array, char_array, 0x006 );

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann schrieb:
> Demnach rufe ich die Funktion einfach wie folgt auf?
> memcpy(&int_array[0], &char_array[0], 0x006);

memcpy(int_array, (const void*)char_array, 0x006);

Oliver

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So kann man es auch machen:

Die Funktion benötigt ja noch Paramater

// Die beiden Puffer
unsigned char rs232[14];
unsigned int data[7];

void copy_data(unsigned char *rs232, unsigned int *data) {
   unsigned char *src;
   unsigned char *dst;

   src = rs232;
   dst = (unsigned char*)data;

   int i;
   for( i=0; i<14; i++ )
   {
       *dst++ = *src++;
   }



Die Funktion rufe ich dann wie folgt auf:

copy_data(&rs232[0], & data [0]);

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.