Forum: Mikrocontroller und Digitale Elektronik warning: assignment from incompatible pointer type


von sebastian (Gast)


Lesenswert?

Hallo,
kann mir jemand sagen was ich hier falsch gemacht habe, dass ich hier
diese Fehlermeldung bekomme.

warning: assignment from incompatible pointer type?

Die Fehlermeldung zeigt auf diese -> ptr_flags = &bit; Zeile

1
int   *ptr_flags;
2
3
4
volatile struct
5
{
6
  uint16_t Erststart:1;      
7
  uint16_t Rel:1;          
8
  uint16_t DCout:1;        
9
  uint16_t PowON:1;        
10
  uint16_t ALZ_freeze:1;      
11
  uint16_t GSM_Sleep:1;      
12
  uint16_t ALZ_gesetzt:1;      
13
  uint16_t bfrei_8:1;      
14
15
  uint16_t Alarm:1;        
16
  uint16_t Batwechsel:1;      
17
  uint16_t GSM_aktiv:1;      
18
  uint16_t Ring:1;        
19
  uint16_t GSM_error:1;      
20
  uint16_t mb_alarm:1;      
21
  uint16_t LiIon_alarm:1;      
22
  uint16_t fence_alarm:1;      
23
}bit;
24
25
26
ptr_flags = &bit;          
27
*ptr_flags = eeprom_read_word(&eeStatus);
28
//Flags aus EEPROM in bit-Array schreiben
29
  ptr_flags = &bit;          
30
  *ptr_flags = eeprom_read_word(&eeStatus);
31
32
/** 12V Kalibrierung nach Programierung verhinden.****/
33
  if ((*ptr_flags & SMErststart) == 1)    
34
  {  
35
    while(PINC & MaskResTast)
36
    {
37
      StatLED_blitz(1,200); // Status LED nach Programierung einschalten
38
    }
39
    _delay_ms(50);
40
    while(!(PINC & MaskResTast))
41
    {
42
      StatLED_off;
43
    }
44
    eeprom_busy_wait();
45
    eeprom_write_word(&eeStatus, (*ptr_flags &=~(SMErststart))); //FlagsSichern;
46
  }

vielen Dank schon mal im Voraus.

mfg. Sebastian

von Rene H. (Gast)


Lesenswert?

Der Pointer ist int Pointer und Deine Struktur kein int*. Entweder 
casten oder besser:

Mache ein typedef für die Struktur. Und aus dem Pointer ein 
Strukturpointer.

Grüsse,
R.

von sebastian (Gast)


Lesenswert?

Hallo Rene,

danke für die schnelle Antwort. Hab leider noch so meine Probleme mit 
den Strukturpointer. Muss das erst an einem kleinen Programm testen bis 
ich diesen Pointer auf "du und du" bin.
Wenns Dir nicht zu viele Umständ bereitet, wäre ich Dir sehr dankbar, 
wenn Du mir das mit dem Strukturpointer in meinem Fall mal schreiben 
könntest.

Wenn nicht, trotzdem nochmals vielen Dank.

Freundliche Grüße
Sebastian

von Karl H. (kbuchegg)


Lesenswert?

Dieses ganze

>
1
> volatile struct
2
> {
3
>   uint16_t Erststart:1;      
4
>   uint16_t Rel:1;          
5
>   uint16_t DCout:1;        
6
>   uint16_t PowON:1;        
7
>   uint16_t ALZ_freeze:1;      
8
>   uint16_t GSM_Sleep:1;      
9
>   uint16_t ALZ_gesetzt:1;      
10
>   uint16_t bfrei_8:1;      
11
> 
12
>   uint16_t Alarm:1;        
13
>   uint16_t Batwechsel:1;      
14
>   uint16_t GSM_aktiv:1;      
15
>   uint16_t Ring:1;        
16
>   uint16_t GSM_error:1;      
17
>   uint16_t mb_alarm:1;      
18
>   uint16_t LiIon_alarm:1;      
19
>   uint16_t fence_alarm:1;      
20
> }bit;

ist schon Schwachsinn. Mach halt keine anonyme Struktur draus, dann kann 
man sich auch in Zukunft drauf beziehen.

Ein
1
struct xy_Coord
2
{
3
  double x;
4
  double y;
5
};

beschreibt erst mal, wie eine bestimmte Struktur aussieht. Da ist noch 
keine Speicherallokierung damit verbunden oder sonst etwas, sondern das 
ist erst mal nur der Bauplan: Wie sieht eine struct xy_Coord Variable 
aus.

Und dann kann man davon Variablen erzeugen. Genauso wie du eine int 
Variable erzeugst
1
   int i;
kannst du mit deinem niegel-nagel-neuen Datentyp 'struct xy_Coord' eine 
neue Variable erzeugen.
1
  struct xy_Coord Mittelpunkt;

Aus praktischen Gründen, kann man in C jetzt auch beides zusammenfassen: 
In einem Aufwasch eine neue Struktur definieren und auch gleichzeitig 
davon Variablen erzeugen
1
struct xy_Coord
2
{
3
  double x;
4
  double y;
5
} Mittelpunkt, Umfangspunkt, EckeLinksOben;

und man kann in so einem Fall dann auch den Namen der Struktur 
weglassen. Denn zum Erzeugen der Variablen braucht man ihn ja durch die 
Zusammenfasseung nicht mehr
1
struct
2
{
3
  double x;
4
  double y;
5
} Mittelpunkt, Umfangspunkt, EckeLinksOben;

So etwas nennt man dann eine anonyme Struktur, weil sie ja keinen Namen 
hat.
Die Kehrseite der Medaille ist, dass man sich dann auf diese Struktur in 
einem anderen Zusammenhang auch nicht mehr beziehen kann. Wenn sie 
keinen Namen hat, wie soll man sich dann darauf beziehen?
Wenn das nie der Fall ist und man das nie braucht, dann ist das schon 
ok. Aber in den meisten Programmen benötigt man den Namen der Struktur 
an der einen oder anderen Stelle und genau deshalb sind anonyme 
Strukturen meisten Unsinn. Zumindest in diesem Zusammenhang. 'typedef's 
lasse ich jetzt erst mal aussen vor.


Hast du einen int
1
  int  i;

dann kannst du einen Zeigr auf int erzeugen und auf den int zeigen 
lassen
1
  int * ptrToInt = &i;

hast du einen double
1
  double d;

denn bezeichnet
1
  double * ptrToDouble = &d;

eine Zeiger auf diesen double.

Hast du einen long
1
  long j;
dann bezeichnet
1
  long * ptrToLong = &j;

eine Pointer auf einen long.

Hast du daher ein
1
  struct xy_Coord Mittelpunkt;
dann bezeichnet folgerichtig
1
  struct xy_Coord * ptrToPunkt = &Mittelpunkt;
einen Pointer auf ein Objekt welches vom Typ 'struct xy_Coord' ist.


Hat denn dein C-Buch zu diesem Thema gar nichts zu sagen?
Das kann ich mir nicht vorstellen. In deinem C-Buch müsste das Thema 
Strukturen, sowie das Thema Pointer mindestens einen Umfang von gut und 
gerne 30 bis 40 Seiten einnehmen, welcher sich dann ab diesen beiden 
Kapiteln durch den Rest, und das sind immerhin mindestens die Hälfte des 
C-Buches, hinzieht und immer wieder vor kommt. Kein Wunder, das sind ja 
auch Grundlagen auf denen dann wieder andere Dinge aufbauen.

Oder gehörst du auch wieder mal zu der Sorte, die meinen, kein C-Buch zu 
brauchen, weil sie sich mit anlassbezogenem Erfragen von Achtelwissen in 
Foren durch die Programmierung schlagen?

von Rene H. (Gast)


Lesenswert?

Hallo Sebastian,

sorry, ich war unterwegs (Urlaub). Aber Karl-Heinz hat ja bereits alles 
beantwortet.

@Karl-Heinz

Ich denke Du meintest:
1
typedef struct 
2
{
3
  double x;
4
  double y;
5
} xy_Coord;

Grüsse,
R.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Zum K&R als Literaturhinweis gesellt sich ein Neuzugang:

http://www.oreilly.de/catalog/9781449344184/index.html

von Karl H. (kbuchegg)


Lesenswert?

Rene H. schrieb:
> Hallo Sebastian,
>
> sorry, ich war unterwegs (Urlaub). Aber Karl-Heinz hat ja bereits alles
> beantwortet.
>
> @Karl-Heinz
>
> Ich denke Du meintest:
>
>
1
> typedef struct
2
> {
3
>   double x;
4
>   double y;
5
> } xy_Coord;
6
>

kann man so schreiben.
Ich wollte aber absichtlich typedefs erst mal draussen lassen. Sonst 
wärs zu lang geworden. typedefs sind nett und sparen viel Schreibarbeit, 
aber im eigentlichen Sinne "braucht" man sie an dieser Stelle nicht 
wirklich.

von Karl H. (kbuchegg)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Zum K&R als Literaturhinweis gesellt sich ein Neuzugang:
>
> http://www.oreilly.de/catalog/9781449344184/index.html

:-)
Dann nehm ich meine 30 bis 40 Seiten von weiter oben zurück und tausche 
gegen 250 bis 300 Seiten.

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.