www.mikrocontroller.net

Forum: PC-Programmierung Inkompatible Typen in Zuweisung


Autor: programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich programmiere mit Eclipse C++.
Dazu habe ich unter anderem eine Funktion erstellt, die eigentlich 
nichts anderes tun soll als die eingegebenen Daten in ein Array von 
einer Struktur übergeben soll.

Beispiel:
struct
{
 daten[20];
}st;


st stDaten;

void copy(unsigned char * buffer)
{
 stDaten.daten = buffer
}

Der Kompiler zeigt mir immer diese Fehlermeldung an:
 --> inkompatible Typen in Zuweisung
Woran liegt das? Was müsste ich in meinem Code andern?

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

Bewertung
0 lesenswert
nicht lesenswert
programmierer schrieb:

> Beispiel:
>
> struct
> {
>  daten[20];
> }st;
> 

Welchen Datentyp hat den daten[20]?

>
> void copy(unsigned char * buffer)
> {
>  stDaten.daten = buffer
> }
> 
>
> Der Kompiler zeigt mir immer diese Fehlermeldung an:
>  --> inkompatible Typen in Zuweisung

Das glaub ich sofort

a) du hast uns nicht gesagt, welchen Datentyp daten denn nun wirklich
   hat

b) einem Array kann man nichts als Ganzes zuweisen. Immer nur einem
   spezifischen Element des Arrays.
   Welches solls denn sein?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was soll denn

> daten[20]

für ein Datentype sein. Außerdem kann man ein array nicht mit = 
zuweisen.

Autor: programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry hab ich vergessen.
daten ist auch vom Typ "unsigned char"

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

Bewertung
0 lesenswert
nicht lesenswert
programmierer schrieb:
> Sorry hab ich vergessen.
> daten ist auch vom Typ "unsigned char"

damit steht links vom Zuweisungszeichen der Datentyp
   unsigned char[20]
und rechts davon
   unsigned char*

Zusammen also
    unsigned char[20] = unsigned char *

Und das mosert der Compiler an. Er sieht auch keine Möglichkeit, wie er 
selbst den Teil rechts vom = umwandeln kann, so dass auf beiden Seiten 
das Gleiche steht.

(Das bedeutet aber immer noch nicht, dass man einem Array als Ganzes 
etwas zuweisen kann)

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird wohl Zeit fuer eine Wiki-Seite:

http://www.amazon.de/Programmieren-C-ANSI-2-C-Refe...

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

Bewertung
0 lesenswert
nicht lesenswert
Du wirst dich also wohl oder übel

a) auf der linken Seite für ein Element des Arrays entscheiden müssen
b) auf der rechten Seite den Pointer dereferenzieren müssen.

Also zb sowas
   stDaten.daten[5] = *buffer;
(Für die 5 natürlich dann der Indexwert den du tatsächlich haben willst)

denn dann steht da datentyp-mässig gesehen

 (unsigned char[20]) Operation-[]  =  Operation-* (unsigned char *)

links: ein Einzelelement eines Arrays hat den Basistyp des Arrays, die 
linke Seite 'kürzt' sich daher zu unsigned char.
und rechts: dereferenziert man einen Pointer, erhält man den Datentyp 
der Werte, auf den der Pointer zeigt. Auf der rechten Seite hebt also 
die Operation '*' ausserhalb der Klammer den * innerhalb der Klammer 
auf.

Beides zusammengenommen ergibt aus Sicht der Datentypen daher

     unsigned char = unsigned char

und damit ist dann auch der Compiler happy, weil links und rechts 
derselbe Datentyp rauskommt.

Ob das allerdings in Summe die Operation ist, die du haben willst, ist 
eine andere Geschichte.

Autor: programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was kann ich nun tun?

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

Bewertung
0 lesenswert
nicht lesenswert
Das hängt davon ab, was du (aus einer höheren Warte betrachtet) 
eigentlich tun willst :-)

Was ist den daten?
Sind das 20 Einzelwerte, oder ist das ein Array welches als ganzen einen 
Wert verkörpert (wie zb einen String)

Aber auf lange Sicht gesehen solltest du den Ratschlag von Peter 
beherzigen und dir ein Buch kaufen und auch durcharbeiten.

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
memcpy(ziel,quelle,größe)  ???

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.