Forum: PC-Programmierung IAR Include Problem


von Christopher Schirner (Gast)


Lesenswert?

Hallo liebe µC Freunde!

Ich hab ein Problem mit IAR V3.41.

Ich möchte mehrere Dateien so includen, das "Jeder alles kennt".

Nach diesen Prinzip verfahre ich normalerweise beim VC++:
http://root.pixelmurder.de/drawing.pdf

Dies funktioniert beim IAR nicht :(

Hier ist der C Code (bzw eigentlich nur die include stuktur usw)
http://root.pixelmurder.de/Modelleisenbahn.rar

Ich bin völlig ratlos, wie ich beim IAR includen soll.

Vielen Dank schonmal im Vorraus, für eure Antworten.

MFG
Christopher Schirner

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was mag "funktioniert nicht" heißen?

Stürzt der Compiler ab?

von Christopher Schirner (Gast)


Lesenswert?

nein, ich mein das das include konzept nicht funktioniert im IAR

z.b. hab in der LCD.h eine bool bTest; angelegt, und wollte in der
main.c bTest = false; machen ..

fehler:
Error[e27]: Entry "bTestVar" in module LCD ( C:\Dokumente und
Einstellungen\Schinken\Eigene Dateien\µC\
Modelleisenbahn\Debug\Obj\LCD.r43 ) redefined in module Rail (
C:\Dokumente und Einstellungen\Schinken\Eigene
Dateien\µC\Modelleisenbahn\Debug\Obj\Rail.r43 )

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du definierst globale Variablen in einer Headerdatei?

Das ist ein Fehler - der führt dazu, daß für jedes Sourcemodul, das
diese Headerdatei einbindet, eine neue Kopie der globalen Variablen
angelegt wird.

Manche Compiler (gcc) können diesen Fehler tolerieren; deren Linker
überlagert alle gleichlautenden Symbole.
Ich halte das für ausgemachten Murks.

In Headerdateien sollten Variablen nur deklariert werden (durch
voranstellen des Schlüsselworts "extern"), und sie sollten in exakt
genau einer Sourcedatei definiert werden.

von Christopher Schirner (Gast)


Lesenswert?

aber sonst, das includen passt?

apropos, auserdem dürfte der die nur einmal deklarieren.. grund:

#ifndef _RAIL_H_
#define _RAIL_H_

bool bTestVar;

#endif

von Christopher Schirner (Gast)


Lesenswert?

btw hier ne JPG, falls jemand keinen PDF reader hat
http://root.pixelmurder.de/drawing.jpg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dein #include-Trick hilft nur gegen mehrfaches Einbinden in dasselbe
Sourcefile, nicht aber gegen Einbinden in verschiedene Sourcefiles.

Daher wird Deine Variable für jedes einzelne Sourcefile angelegt, das
die betreffende Headerdatei einbindet.

Das lässt sich auch nicht mit so einem "include-guard" abfangen; wie
soll der Compiler beim Übersetzen eines Sourcefiles wissen, was er bei
einem früheren Compilerlauf für ein anderes Sourcefile gemacht hat?

von Christopher Schirner (Gast)


Lesenswert?

Hm ok .. und wo deklarier ich dann Globale Variablen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

So, wie man das in C (oder auch C++) schon immer macht.

blafusel.h
1
// Deklaration
2
extern int blafusel;

blafusel.c
1
#include "blafusel.h"
2
3
// Definition und Initialisierung
4
int blafusel = 0;


Jedes Modul (C-Quelltextdatei), das auf die globale Variable zugreifen
will, muss "blafusel.h" (oder eine diese Headerdatei einbindende
Headerdatei) einbinden, um die Deklaration "sehen" zu können.
Andernfalls motzt der Compiler über "undefined symbol".

von Christopher Schirner (Gast)


Lesenswert?

ok klappt... danke :P

von Gast (Gast)


Lesenswert?

Danke für den guten Beitrag hab schon ewig gesucht

von Tobi (Gast)


Lesenswert?

Mega gut der Beitrag, danke!!

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.