Forum: PC-Programmierung Inkompatible Typen in Zuweisung


von programmierer (Gast)


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:
1
struct
2
{
3
 daten[20];
4
}st;
5
6
7
st stDaten;
8
9
void copy(unsigned char * buffer)
10
{
11
 stDaten.daten = buffer
12
}

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

von Karl H. (kbuchegg)


Lesenswert?

programmierer schrieb:

> Beispiel:
>
1
> struct
2
> {
3
>  daten[20];
4
> }st;
5
>

Welchen Datentyp hat den daten[20]?

>
1
> void copy(unsigned char * buffer)
2
> {
3
>  stDaten.daten = buffer
4
> }
5
>
>
> 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?

von Peter (Gast)


Lesenswert?

was soll denn

> daten[20]

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

von programmierer (Gast)


Lesenswert?

Sorry hab ich vergessen.
daten ist auch vom Typ "unsigned char"

von Karl H. (kbuchegg)


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)

von P. S. (Gast)


Lesenswert?


von Karl H. (kbuchegg)


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
1
   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.

von programmierer (Gast)


Lesenswert?

Was kann ich nun tun?

von Karl H. (kbuchegg)


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.

von Volker Z. (vza)


Lesenswert?

1
memcpy(ziel,quelle,größe)  ???

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.