PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit typedef struct



flo1
10.11.2009, 20:13
Ich schreib mir grad ein Fifo
hier ein code ausschnitt



typedef struct {
uint_8 *pread;
uint_8 *pwrite;
uint_8 top;
uint_8 bottom;
} fifo_t;

[...]

static void inline _inline_fifo_put (fifo_t *f, const uint8_t data) {
if(f->pread == f->top) f->pread = f->bottom;
else f->pread++;

f->pread = data;
}


und ich bekomme den Fehler



fifo.h:19: error: 'fifo_t' has no member named 'pread'
fifo.h:19: error: 'fifo_t' has no member named 'top'
fifo.h:19: error: 'fifo_t' has no member named 'pread'
fifo.h:19: error: 'fifo_t' has no member named 'bottom'
fifo.h:20: error: 'fifo_t' has no member named 'pread'
fifo.h:22: error: 'fifo_t' has no member named 'pread'


undi ch hab keine Ahnung warum...

PicNick
10.11.2009, 20:33
static void inline _inline_fifo_put

was bedeutet das erste "inline" ?
sowas kenn ich garnicht.
Vielleicht verwirrt das den Compiler so wie mich.

(Ich weiss aber auch nicht alles)

flo1
10.11.2009, 20:49
inline macht das der compiler beim Aufruf den Code direkt in die aufrufende Stelle schreibt

markusj
10.11.2009, 23:06
Mich verwirrt etwas anderes viel mehr:
Du ballerst ziellos mit Pointern um dich - du kannst einen Pointer auf einen uint8_t nicht mit einem uint8_t vergleichen!
pread und pwrite sind Zeiger auf den Speicher, top und bottom simple Byte-Werte (und definitiv keine Zeiger)
Vielleicht solltest du dir zuerst einmal die Beispiele aus dem RN-Wissen ansehen (da gibts einen Fifo in C), bevor du mit deinen Pointern noch jemanden verletzt ;)

mfG
Markus

sternst
10.11.2009, 23:13
Was ist mit der Fehlermeldung, die vor den ganzen "has no member"-Fehlern kommt (wegen dem uint_8)? Fehler arbeitet man der Reihe nach von oben ab. Oft (wie hier) erledigen sich dann nämlich die restlichen Fehler, weil es einfach Folgefehler sind.

flo1
11.11.2009, 12:48
ok ich hab den dereferenzierungszeiger bei f->pwrite = data; vergessen aber sonst?...

ah da hab ich noch einen Error gefunden

hier scheint der Fehler herzukommen

fifo.h:8: error: expected specifier-qualifier-list before 'uint_8'

aber im Internet scheint es nur fälle zu geben bei denen der Fehler bei selbst Referenzierung auftrit.

sternst
11.11.2009, 12:52
Eigentlich habe ich ja schon gesagt, wo der Fehler herkommt.
Es ist das "uint_8". Es gibt keinen solchen Typ (sofern du ihn nicht selbst definiert hast, was offensichtlich nicht der Fall ist).

Und zu dem hier
ok ich hab den dereferenzierungszeiger bei f->pwrite = data; vergessen aber sonst?... solltest du den Post von markusj nochmal etwas genauer lesen. Was soll z.B. der Sinn von "f->pread == f->top" sein, wenn das eine ein unit8_t ist, und das andere ein Zeiger auf ein unit8_t?

flo1
11.11.2009, 12:59
top soll die höhste speicheradresse die zu dem Speicherbereich gehört enthallten

ahh jetzt funktioniert es, ich dacht uint_8 sei schon in avr definiert.

sternst
11.11.2009, 13:31
top soll die höhste speicheradresse die zu dem Speicherbereich gehört enthalltenDu verwendest also einen AVR mit weniger als 255 Bytes SRAM?


ahh jetzt funktioniert es, ich dacht uint_8 sei schon in avr definiert.Mann, du hast dich einfach nur verschrieben. "uint_8" -> "uint8_t"

markusj
11.11.2009, 15:09
Hey Flo,

dein top und bottom sind simple Zählvariablen oder Werte zwischen 0 und 255. Bei jedem halbwegs ausgewachsenen AVR mit mehr als 256 Byte SRAM (oder sogar schon bei weniger) sind Pointer aber 16 Bit breit (u.U. sogar noch breiter?).
Deine Zugriffe machen in gar keinem Fall Sinn, du müsstest top entweder auch als Zeiger definieren und dann top mit Basisadresse + Fifogröße initialisieren, oder komplett offsetbasiert arbeiten und zur Basisadresse immer einen Zählerwert hinzuaddieren.
Bitte sieh dir endlich Mal funktionierenden Code an und lies nochmal in einem Tutorial über C und Pointer genau durch wie das ganz funktioniert und was du falsch gemacht hast!

mfG
Markus