zwei uint8_t pointer zuweisen

Gast #1597671
Lesenswert?

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
#1597692
Lesenswert?

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.
#1597694
Lesenswert?

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 #1597832
Lesenswert?

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
#1597989
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren