Forum: Compiler & IDEs typedef und struct Problem mit ICC8 AVR Compiler


von Hauke F. (axfire)


Lesenswert?

Hallo zusammen,

ich bin mit dem ICC8 AVR Compiler von ImageCraft und mit der 
Code::Blocks Entwicklungsumgebung auf ein Problem getreten, auf das ich 
keine Lösung finde.

Ein Beispiel:
1
#include <macros.h>
2
#include <iom644pv.h>
3
4
typedef int INT;
5
6
typedef struct{
7
    int a;
8
    int b;
9
    } MYSTRUCT;
10
11
int main(void)
12
{
13
    //PORTB = 0;    // Wird dieser Befehl vor der Deklaration von 'a' und 'myStruct' ausgeführt, treten besagt Fehler auf
14
15
    INT a;
16
    MYSTRUCT myStruct;
17
18
    a = 0;
19
    myStruct.a = 0;
20
21
    PORTB = a;
22
    PORTB = myStruct.a;
23
24
    while(1)
25
    {
26
    }
27
    return 0;
28
}

Wie zu sehen ist verwende ich in dem Beispiel typedef und struct. Der 
gezeigte Code lässt sich auch fehlerfrei kompilieren.

Aber wenn vor der Deklaration von 'a' und 'myStruct' etwas "Anderes" 
gemacht wird, wie z.B in eine Funktion gesprungen oder wie hier ein 
Register angesprochen wird, gibt es beim übersetzen Fehler wie:
- illegal use of type name `INT'
- syntax error; found `a' expecting `;'
- undeclared identifier `a'

Das Programm lässt sich also nur Überetzen, wenn in der main-Fuktion als 
erstes alle Variablen deklariert werden die etwas mit typedef und struct 
zu tun haben.
Wie kann das sein?

Das selbe (bis auf andere includes) Programm läuft einwandfrei unter dem 
AtmelStudio 6 und dem GCC Combiler.

Hat jemand eine Idee?

LG
Hauke

von Marc (Gast)


Lesenswert?

Weil du in C das schlicht nicht tun darfst.

Wenn du "weiter unten" in einer Funktion etwas deklarieren willst, dann 
mach einen neuen Block auf.

von Hauke F. (axfire)


Lesenswert?

Marc schrieb:
> Weil du in C das schlicht nicht tun darfst.

Was darf ich denn nicht tuhen? Ich habe doch nur schlicht Variablen 
deklariert. Und das darf man meines Wissens doch immer...

Marc schrieb:
> Wenn du "weiter unten" in einer Funktion etwas deklarieren willst, dann
> mach einen neuen Block auf.

Was meinst du denn mit einen neuen Block aufmachen?

von Tom (Gast)


Lesenswert?

Marc schrieb:
> Weil du in C das schlicht nicht tun darfst.

Seit C99 schon, in gcc schon vorher. Bis sich C99 bei den proprietären 
Compilern durchsetzt, wird es wohl noch ein paar Jahrzehnte dauern.

ICC: "We may support C99 at a future date."

von Marc (Gast)


Lesenswert?

Hauke F. schrieb:
> Was darf ich denn nicht tuhen?

"tun" mit h schreiben.

von Rolf M. (rmagnus)


Lesenswert?

Hauke F. schrieb:
> Marc schrieb:
>> Weil du in C das schlicht nicht tun darfst.
>
> Was darf ich denn nicht tuhen?

Du darfst nicht erwarten, dass ein kommerzieller Compiler schon in 
diesem Jahrtausend angekommen ist.

> Ich habe doch nur schlicht Variablen deklariert. Und das darf man meines
> Wissens doch immer...

Das was mal vor 26 Jahren in C verboten. Bei ICC ist es das offenbar 
heute noch.

von Hauke F. (axfire)


Lesenswert?

Rolf Magnus schrieb:
> Das was mal vor 26 Jahren in C verboten. Bei ICC ist es das offenbar
> heute noch.

Oha das ist ja was. Jetzt kenn ich noch einen Grund lieber den GCC zu 
nehmen :)

Danke an Alle für eure Hilfe!

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


Lesenswert?

Rolf Magnus schrieb:
> Das was mal vor 26 Jahren in C verboten.

Du hast ein Carry-Bit verloren. ;-)

16 Jahre isses her, dass der vorletzte C-Standard verabschiedet worden
ist.

von Markus F. (mfro)


Lesenswert?

Jörg Wunsch schrieb:
> Rolf Magnus schrieb:
>> Das was mal vor 26 Jahren in C verboten.
>
> Du hast ein Carry-Bit verloren. ;-)
>
> 16 Jahre isses her, dass der vorletzte C-Standard verabschiedet worden
> ist.

Trotzdem war's vor 26 Jahren auch verboten ;)

von Rolf M. (rmagnus)


Lesenswert?

Markus F. schrieb:
> Jörg Wunsch schrieb:
>> Rolf Magnus schrieb:
>>> Das was mal vor 26 Jahren in C verboten.
>>
>> Du hast ein Carry-Bit verloren. ;-)
>>
>> 16 Jahre isses her, dass der vorletzte C-Standard verabschiedet worden
>> ist.
>
> Trotzdem war's vor 26 Jahren auch verboten ;)

Richtig. Vor 16 Jahren hat es lediglich aufgehört, verboten zu sein…

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.