Problem mit FDEV_SETUP_STREAM

Gast #2393222
Lesenswert?

Hallo,

ich bin am verzweifeln und hoffe ihr könnt mir weiterhelfen..

Ich versuche den Example-Code für den Bosch BMA180 Beschleunigungssensor 
auf einem Atmega zum laufen zu bekommen.
Example-Code: http://www.sparkfun.com/products/9723

Im Moment versuche ich es mit einem Atmega8. Ich habe den Quellcode 
bereits an den Atmega8 angepasst, bekomme jetzt aber folgenden Fehler:

expected primary-expression before '.' token


Müsste soviel heißen, wie: es wird ein Anfangsausdruck vor dem '.' 
Zeichen erwartet.

Der Fehler erscheint 4x hintereinander.

Die betreffende Zeile ist folgende:
1
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar,NULL,_FDEV_SETUP_WRITE);

Die Stdio.h wurde eingebunden. In dieser Header-Datei habe ich folgendes 
gefunden:
1
#if defined(__DOXYGEN__)
2
/**
3
   \brief Initializer for a user-supplied stdio stream
4
   This macro acts similar to fdev_setup_stream(), but it is to be
5
   used as the initializer of a variable of type FILE.
6
   The remaining arguments are to be used as explained in      
7
   fdev_setup_stream().
8
*/
9
#define FDEV_SETUP_STREAM(put,get,rwflag)
10
#else /*!DOXYGEN*/
11
#define FDEV_SETUP_STREAM(p,g,f) \
12
    {
13
         .put=p, \
14
         .get=g, \
15
         .flags=f, \
16
         .udata=0, \
17
    }
18
#endif /*DOXYGEN*/

Kann es sein, das die Stdio.h fehlerhaft ist, oder das der Fehler an 
ganz anderer Stelle in meinem Programm liegt?

Die Fehler scheinen sich ja auf den #else-Teil zu beziehen (.put , .get 
, .flags , .udata).

Gegen halb sechs werde ich mal den kompletten Code meines Programms 
schicken.

Hattet ihr dieses Problem schon einmal? Könnt ihr mir weiterhelfen?

Vielen Dank schon einmal!

MfG Martin
Gast #2393276
Lesenswert?

Martin schrieb:
> Kann es sein, das die Stdio.h fehlerhaft ist, oder das der Fehler an
> ganz anderer Stelle in meinem Programm liegt?

Beidesmal ja, aber mit 99% Wahrscheinlichkeit auf dem 2. ja.

Der gezeigte Auszug aus der stdio.h ist richtig, und wenn du darin 
weiter oben nachschaust, findest du dort sogar ein komplettes 
Codebeispiel. Wenn das fehlerfrei compiliert, ist deine stdio.h in 
Ordnung.

Dann
Gast #2393375
Lesenswert?

@Oliver: Vielen Dank schon mal für deine Antwort!! :-)

Ich habe das Beispiel in der Stdio.h gesehen, bin mir aber eigentlich 
ziemlich sicher das der Code übereinstimmt. Aber vielleicht hab ich ja 
noch was übersehen.

Ich habe im Anhang den Programmcode als SisyAVR-Projektdatei und als PDF 
bzw. Rtf-Datei in Textform.
Die Stdio.h, die ich verwende habe ich sicherheitshalber auch mal mit 
angehangen.

Es wäre klasse, wenn ihr mal drüber schauen könntet, wo sich der Fehler 
eingeschlichen hat, danke schon mal im Vorraus.

MfG Martin
Angehängte Dateien:
Gast #2393497
Lesenswert?

Martin schrieb:
> Kann es sein, das die Stdio.h fehlerhaft ist, oder das der Fehler an
> ganz anderer Stelle in meinem Programm liegt?

Wie man's nimmt. Das hier:

> #define FDEV_SETUP_STREAM(p,g,f) \
>     {
>          .put=p, \
>          .get=g, \
>          .flags=f, \
>          .udata=0, \
>     }

setzt einen C99-Compiler voraus. C++ kennt diese Form der 
Initialisierung nicht. Du kannst dieses Makro so also nicht mit C++ 
verwenden.
Gast #2393960
Lesenswert?

@Rolf: Danke vielmals!!!

Mir ist es gleich komisch vorgekommen, dass mein Entwicklungsprogramm 
(Sisy AVR3) eine .cc-Datei angelegt hat. Hatte aber nicht gedacht, dass 
ich damit solche Probleme bekomme...
Jetzt weiß ich auf alle Fälle wo ich weitersuchen muss - danke für eure 
Antworten:-)

MfG Martin
Moderator Persönliche Seite #2394110
Lesenswert?

Entweder kein C++ benutzen, oder statt FDEV_SETUP_STREAM dann
fdev_setup_stream benutzen.  Dann muss man die Definition der
Variablen allerdings vom Befüllen der initialen Elemente trennen.

Im Prinzip müsste man etwas zu FDEV_SETUP_STREAM vergleichbares in
C++ auch als Konstruktor schreiben können, nur dass sich die Mühe
halt noch keiner gemacht hat.  Patches welcome. ;-)  (Quellcode-
kompatibel zu C wird es allerdings nicht werden, weil die
Konstruktorsyntax ein wenig anders ist; da wäre dann das Gleicheits-
zeichen im Weg.)
Gast #2394180
Lesenswert?

Jörg Wunsch schrieb:
> Im Prinzip müsste man etwas zu FDEV_SETUP_STREAM vergleichbares in
> C++ auch als Konstruktor schreiben können, nur dass sich die Mühe
> halt noch keiner gemacht hat.  Patches welcome. ;-)  (Quellcode-
> kompatibel zu C wird es allerdings nicht werden, weil die
> Konstruktorsyntax ein wenig anders ist; da wäre dann das Gleicheits-
> zeichen im Weg.)

Nein, eine Konstruktorsyntax kann man dafür nicht verwenden, zuminest 
nicht vor C++0x. Man könnte aber FDEV_SETUP_STREAM so abändern, daß es 
in beiden Sprachen geht. Das Problem ist ja nur die Initialisierung über 
Namen der Strukturelemente. Wenn man die klassisch positional schreiben 
würde, ginge es mit C (und zwar nicht nur C99) und mit C++.
Gast #2394183
Lesenswert?

Sorry. Wenn man einen Konstruktor definiert, kann man natürlich auch die 
Konstruktorsyntax zur Initialisierung verwenden. Aber dann ist es kein 
POD mehr und die klassische Initialisierungssyntax geht gar nicht mehr.
Moderator Persönliche Seite #2394202
Lesenswert?

Rolf Magnus schrieb:
> Man könnte aber FDEV_SETUP_STREAM so abändern, daß es
> in beiden Sprachen geht.

Ja, aber dann würde sich das Interface inkompatibel zum bereits seit
mehreren Jahren existierenden ändern.  Da hätte ich eher dran denken
müssen, jetzt mag ich das auch nicht mehr ändern.

Wenn mir aber jemand einen C++-Konstruktor als Patch liefert, dann
bau' ich das gern ein.  Bitte die Doku nicht vergessen (am besten
als Beispiel im einleitenden Text in stdio.h).
Moderator Persönliche Seite #2394499
Lesenswert?

Rolf Magnus schrieb:

>> Ja, aber dann würde sich das Interface inkompatibel zum bereits seit
>> mehreren Jahren existierenden ändern.
>
> Warum sollte sich das ändern müssen?

Nun, wenn ich das seinerzeit so geschrieben hätte, dass man es benutzt
wie:
1
FDEV_SETUP_STREAM(mystdout, uart_putchar, NULL, _FDEV_SETUP_WRITE);

dann hätte ich kein Problem gesehen, für C++ dahinter einen
Konstruktor zu verstecken und für C die jetzige Konstruktion.
Wie aber willst du den Konstruktor gestalten, damit in C++
das hier geht?
1
FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
Gast #2394583
Lesenswert?

Wieso willst du da unbedingt einen Konstruktor machen? Ich würde einfach 
aus dem
1
#define FDEV_SETUP_STREAM(p, g, f) \
2
  { \
3
    .put = p, \
4
    .get = g, \
5
    .flags = f, \
6
    .udata = 0, \
7
  }
sowas wie das
1
#define FDEV_SETUP_STREAM(p, g, f) \
2
  { \
3
    0, /* buf */\
4
    0, /* unget */\
5
    f,  /* flags */\
6
    0, /* size */\
7
    0, /* len */\
8
    p, /* put */\
9
    g,  /* get */\
10
    0   /* udata */\
11
  }
machen. Am Interface ändert sich da gar nix, aber der Code ist 
kompatibel zu C++.

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