Forum: Compiler & IDEs error 'conflicting types' bei Zeiger Deklaration


von Jan T. L. (sandpit)


Lesenswert?

Hallo zusammen,

als C-Neuling gebe ich mich mit der neuen Mnemonik schwer ... aber ich 
möchte nicht alles weiter in ASM schreiben.

Bei der Deklaration der Zeiger *lz und *sz für den Rx-Puffer des UARTs 
bekomme ich vom Compiler die Fehlermeldungen:

error: conflicting types for 'lz'
error: previous declaration of 'lz' was here
error: conflicting types for 'sz'
error: previous declaration of 'sz' was here

Beide Links verweisen auf die Deklaration.

Ich verstehe nicht, warum die Deklaration falsch ist oder von der 
Reihenfolge noch nicht bekannt sein könnte? Im Forum scheint keiner das 
gleiche Problem zu haben. Ich suche jetzt einige Stunden nach einer 
Lösung.

In der Hoffnung Euch mit dem vermutlich trivialen Problem nicht zu 
verprellen...
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
6
//INCLUDE Test-LCD
7
#include <stdlib.h>
8
#include "LCD_display.h"
9
10
#define F_CPU 8000000UL
11
12
//UART Definitionen
13
#define BAUD 9600UL // Baudrate
14
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
15
#define max 20 // Definiere maximale Laenge für Empfang
16
17
uint8_t puffer[max];
18
uint16_t *lz;
19
uint16_t *sz;
20
21
//Initialisierung der Zeiger auf Pufferanfang
22
lz=puffer;
23
sz=puffer;
24
25
26
ISR(USART_RXC_vect)
27
{
28
*sz = UDR; //empfangenes Datenbyte abspeichern
29
sz++;
30
if (sz==puffer+max) sz = puffer;  //Ring-Puffer zurueckgesetzt
31
}
32
......usw

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jan T. L.. schrieb:
> //Initialisierung der Zeiger auf Pufferanfang
> lz=puffer;
> sz=puffer;

Das steht außerhalb eines Funktionsrumpfes, und ist außerdem keine 
Initialisierung, sondern eine Zuweisung.

Wenn das außerhalb des Funktionsrumpfes bleiben soll, dann so:

> uint16_t *lz = (uint16_t* ) puffer;
> uint16_t *sz = (uint16_t* ) puffer;

von pointer (Gast)


Lesenswert?

Warum unterschiedliche Dtaentypen von puffer und lz, sz?

von Jan T. L. (sandpit)


Lesenswert?

Hallo Rufus, hallo Pointer,

vielen Dank vorab, das ging ja schnell!

Rufus Τ. Firefly schrieb:
> Das steht außerhalb eines Funktionsrumpfes,...

Ja, Variablen sollten vom ISR und anderen Funktionen genutzt werden.
Oder brauche ich dann das mit dem volatile?

Rufus Τ. Firefly schrieb:
> ... und ist außerdem keine
> Initialisierung, sondern eine Zuweisung.

Initialisierung insofern ich zu beginn den Lese- und Schreibzeiger (*lz 
u. *sz) auf den Anfang des Feldes Puffer setzen wollte.

> Wenn das außerhalb des Funktionsrumpfes bleiben soll, dann so:
>
> uint16_t *lz = (uint16_t* ) puffer;
> uint16_t *sz = (uint16_t* ) puffer;

*lz = &puffer;
*sz = &puffer;
...hätte ich noch verstanden, was bewirkt die Klammer (uint16_t*) für 
die Zuweisung der Zeiger?

pointer schrieb:
> Warum unterschiedliche Dtaentypen von puffer und lz, sz?
Hatte für die beiden Zeiger zwei Byte Adressen angenommen.

von Ralf (Gast)


Lesenswert?

Jan T. L.. schrieb:
> pointer schrieb:
>> Warum unterschiedliche Dtaentypen von puffer und lz, sz?
> Hatte für die beiden Zeiger zwei Byte Adressen angenommen.

Nee, nee. Der Zeiger soll doch sicher auf einen Datenbereich von max * 
uint8_t zeigen. Dann muss mann das auch so schreiben:
1
uint8_t *lz;
Dass der dann selber 16 Bit "braucht", hat damit nichts zu tun!

Rufus Τ. Firefly schrieb:
> Wenn das außerhalb des Funktionsrumpfes bleiben soll, dann so:
>
>> uint16_t *lz = (uint16_t* ) puffer;
>> uint16_t *sz = (uint16_t* ) puffer;

Hier soll jetzt der Pointer auf ein 16-Bit-Array zeigen, dazu wird 
puffer entsprechend 'verwandelt' (=cast).

Evtl. meinst Du aber sowas?:
1
uint8_t *lz = puffer;
(Wenn man das vor der main überhaupt so machen kann?)

von ... (Gast)


Lesenswert?

Ralf schrieb:
> uint8_t *lz = puffer;
> (Wenn man das vor der main überhaupt so machen kann?)

Man kann. Und genauso sollte man auch.

Aber der TO hat scheinbar den Unterschied noch nicht erkannt.
Obiges ist eine Definition samt Initialisierung.
Was NICHT außerhalb einer Funktion geht:
1
uint8_t *lz;
2
lz = puffer;
Das ist eine Definition mit anschließender Zuweisung. Und Zuweisungen 
sind nunmal nur innerhalb von Funktionen erlaubt.

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.