www.mikrocontroller.net

Forum: Compiler & IDEs zwei uint8_t pointer zuweisen


Autor: RobinK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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


void change() {
  uint8_t * tmp;
  tmp = (uint8_t *)zk_eins;
  zk_eins = zk_zwei; // error
  zk_zwei = tmp;     // error
}

Funktioniert das prinzipiell nicht?

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

RobinK

Autor: Werner B. (werner-b)
Datum:

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

Mit
static volatile uint8_t zk_eins_[80];
static volatile uint8_t zk_zwei_[80];

volatile uint8_t *zk_eins = zk_eins_;
volatile uint8_t *zk_zwei = zk_zwei_;


void change(void) {
  uint8_t * tmp;
  tmp = (uint8_t *)zk_eins;
  zk_eins = zk_zwei; // error
  zk_zwei = tmp;     // error
}

Eigentlich sollte das auch mit anonymen Arrays gehen, nur fällt mir im 
Moment nicht ein wie.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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
  uint8_t * tmp;
  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.

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und jetzt 100 mal an die Tafel schreiben

     "Arrays sind keine Pointer!"

 ;-)

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und Pointer sind keine Adressen!
SCNR :->

Autor: RobinK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Moin!

Danke für die Antworten!
  // Zwei Speicherbereiche
  volatile char * zk_drei = "\0\0\0\0\0\0\0\0" //80 zeichen
  volatile char * zk_vier = "\0\0\0\0\0\0\0\0" //80 zeichen
  
  // Zwei Zeiger auf Speicherbereiche
  char * zk_eins;
  char * zk_zwei;
  
  // ....

  // Zeiger den Speicherbereichen zuweisen
  zk_eins = zk_drei; // zk_eins = zk_vier;
  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

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Deinem Beispiel sind zk_drei und zk_vier Zeiger, die eben auf die 
Strings zeigen. Würdest Du
  volatile char zk_drei[] = "\0\0\0\0\0\0\0\0" //80 zeichen
  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

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.