Forum: Compiler & IDEs Problem mit FDEV_SETUP_STREAM


von Martin (Gast)


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

von Oliver (Gast)


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

von Martin (Gast)


Angehängte Dateien:

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

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch die Fehlermeldung im Anhang..

von Werner B. (werner-b)


Lesenswert?

Was wird denn "vor" der <stdio.h> includiert?
bzw. was steht davor?

upps. Gerade gesehen.

Das ist C++. Da gibt es iirc einiges zu beachten. Nur was? Da mache ich 
mit C++ zu wenig auf dem AVR bzw. mit GCC.

von Rolf Magnus (Gast)


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.

von Martin (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.)

von Rolf Magnus (Gast)


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++.

von Rolf Magnus (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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).

von Rolf Magnus (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> 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.

Warum sollte sich das ändern müssen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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);

von Rolf Magnus (Gast)


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++.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hmm, naja, die blöde Positionsabhängigkeit wollte ich eigentlich
vermeiden, indem ich die benannten Elemente benutze.  Wird mir wohl
nichts anderes übrig bleiben. :-(  Schade, dass C++ sich dazu nicht
durchringen konnte.

von Rolf Magnus (Gast)


Lesenswert?

Ist schon klar, warum du das so gemacht hast. Ich finde das auch 
praktisch, aber leider kam C++ ein Jahr vor C99 raus und setzt deshalb 
noch auf C90 auf.

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.