error 'conflicting types' bei Zeiger Deklaration

OP #2214789
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
OP #2214931
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.
Gast #2215101
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?)
Gast #2220324
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren