zwei uint8_t pointer zuweisen

Gast #1597671
Hallo,

gerne wollte ich zwei
1
uint8_t *
 tauschen.
Leider bekomme ich immer:
error: incompatible types in assignment
1
volatile uint8_t zk_eins[80];
2
volatile uint8_t zk_zwei[80];
3

4

5
void change() {
6
  uint8_t * tmp;
7
  tmp = (uint8_t *)zk_eins;
8
  zk_eins = zk_zwei; // error
9
  zk_zwei = tmp;     // error
10
}

Funktioniert das prinzipiell nicht?

Ziel des Ganzen: Zwei Zeichenketten tauschen, ohne den ganzen Inhalt 
bewegen zu müssen.

RobinK
zk_eins und zk_zwei sind nun mal keine Pointer, sondern arrays.
Wenn man Pointer draus macht dann geht es auch.

Mit
1
static volatile uint8_t zk_eins_[80];
2
static volatile uint8_t zk_zwei_[80];
3

4
volatile uint8_t *zk_eins = zk_eins_;
5
volatile uint8_t *zk_zwei = zk_zwei_;
6

7

8
void change(void) {
9
  uint8_t * tmp;
10
  tmp = (uint8_t *)zk_eins;
11
  zk_eins = zk_zwei; // error
12
  zk_zwei = tmp;     // error
13
}

Eigentlich sollte das auch mit anonymen Arrays gehen, nur fällt mir im 
Moment nicht ein wie.
Zunächst einmal kannst Du nicht ein Array dem anderen zuweisen (bereits 
die Fehlermeldung sollte das klargemacht haben, da kam ja sicher nicht 
nur "error"). Dafür gibt es memcpy() und strcpy().

Dann ist nach
1
  uint8_t * tmp;
2
  tmp = (uint8_t *)zk_eins;
*tmp natürlich keine Zwischenvariable mit eigenem Speicherplatz, der Du 
einen temporären Zwischenwert zuweisen kannst, sondern *tmp ist danach 
nur ein anderer Name, über den Du den Inhalt von zk_eins[] erreichst.
Gast
Moin Moin!

Danke für die Antworten!
1
  // Zwei Speicherbereiche
2
  volatile char * zk_drei = "\0\0\0\0\0\0\0\0" //80 zeichen
3
  volatile char * zk_vier = "\0\0\0\0\0\0\0\0" //80 zeichen
4
  
5
  // Zwei Zeiger auf Speicherbereiche
6
  char * zk_eins;
7
  char * zk_zwei;
8
  
9
  // ....
10

11
  // Zeiger den Speicherbereichen zuweisen
12
  zk_eins = zk_drei; // zk_eins = zk_vier;
13
  zk_zwei = zk_vier; // zk_zwei = zk_drei;


Das ist dann aber wieder ohne Probleme möglich? Oder ist das obere auch 
kein Zeiger, sondern ein Array?
Kenntnisse habe ich allerdings aus (Ansi) C vom Computer.



RobinK
In Deinem Beispiel sind zk_drei und zk_vier Zeiger, die eben auf die 
Strings zeigen. Würdest Du
1
  volatile char zk_drei[] = "\0\0\0\0\0\0\0\0" //80 zeichen
2
  volatile char zk_vier[] = "\0\0\0\0\0\0\0\0" //80 zeichen
schreiben wären es Arrays, deren Größe automatisch vom Compiler anhand 
der Stringlänge bestimmt wird.

Einem Zeiger einen Array "zuweisen" kannst Du immer, der Zeiger zeigt 
dann halt auf das erste Arrayelement. Nur andersrum geht es nicht.

MfG Mark

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.