- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 10

Thema: Problem mit typedef struct

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    114

    Problem mit typedef struct

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Ich schreib mir grad ein Fifo
    hier ein code ausschnitt

    Code:
    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

    Code:
    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...

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    114
    inline macht das der compiler beim Aufruf den Code direkt in die aufrufende Stelle schreibt

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    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

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Was ist mit der Fehlermeldung, die vor den ganzen "has no member"-Fehlern kommt (wegen dem uint_? 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.
    MfG
    Stefan

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    114
    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.

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    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?
    MfG
    Stefan

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    114
    top soll die höhste speicheradresse die zu dem Speicherbereich gehört enthallten

    [edit] ahh jetzt funktioniert es, ich dacht uint_8 sei schon in AVR definiert.[/edit]

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von flo1
    top soll die höhste speicheradresse die zu dem Speicherbereich gehört enthallten
    Du verwendest also einen AVR mit weniger als 255 Bytes SRAM?

    [edit] ahh jetzt funktioniert es, ich dacht uint_8 sei schon in AVR definiert.[/edit]
    Mann, du hast dich einfach nur verschrieben. "uint_8" -> "uint8_t"
    MfG
    Stefan

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test