Forum: Compiler & IDEs zwei uint8_t pointer zuweisen


von RobinK (Gast)


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

von Werner B. (werner-b)


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.

von Hc Z. (mizch)


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.

von Werner B. (werner-b)


Lesenswert?

Und jetzt 100 mal an die Tafel schreiben

     "Arrays sind keine Pointer!"

 ;-)

von Sven P. (Gast)


Lesenswert?

Und Pointer sind keine Adressen!
SCNR :->

von RobinK (Gast)


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

von Mark .. (mork)


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

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.