www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik problem mit include


Autor: Rolf Riller (ultra-low)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

ich binde die datei test.c mit #include "test.c" ein. nun wenn ich in 
dieser datei irgendein c code schreibe ausser #define dann gibt der 
compiler fehler aus.
ein beispiel:
    uint8_t var_1;

../test.c:1: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'var_1'


ich vermute dass bei compiler zusätzlich was eingestellt werden muss 
dass die include datei "ganz normal" eingegunden wird.

meine prog. umgebung: xp, avrstudio 4.16, winavr 20081205

gruss

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil der Compiler uint8_t nicht als Datentyp kennt, denkt er Du möchtest 
einen Wert zuweisen. Vermutlich hast Du einfach das #include <..> für 
das .h-File vergessen, in dem der Typ uint8_t definiert ist.

Du solltest übrigens keine *.c Files per Include einbinden. Include ist 
für *.h Files. Wenn Du mehrere *.c Files brauchst, dann kannst Du die 
einzeln kompilieren und dann beim Linken alle *.o Files angeben oder Du 
gibst dem Compiler gleich eine Liste der *.c Files die er zu einem 
Executable machen soll. Schau Dir einfach mal ein x-beliebiges Makefile 
an, da kann man sehen wie das gemacht wird.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst nur Header dateien includen. Die C-Datei musst du zum Projekt 
hinzufügen.

Autor: Rolf Riller (ultra-low)
Datum:
Angehängte Dateien:
  • preview image for 1.jpg
    1.jpg
    37,8 KB, 93 Downloads

Bewertung
0 lesenswert
nicht lesenswert
habs in projekt eingebunden. aber die fehlermeldung kommt immer noch...

ps:die betreffende datei heisst "global_var_def.c"

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann mit #include alles includen. Egal ob .h, .c, .txt, .schnitzel 
oder sonstwas. Der Praeprozessor fuegt den Teil einfach ein, basta - nur 
syntaktisch korrekt muss das Resultat sein.

Um Rolfs Problem zu loesen, muesste er schon ein wenig mehr zeigen. 
Mindestens das File das den include macht und das komplette test.c.

Autor: Rolf Riller (ultra-low)
Datum:
Angehängte Dateien:
  • preview image for 1.jpg
    1.jpg
    171 KB, 94 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Man kann mit #include alles includen. Egal ob .h, .c, .txt, .schnitzel
oder sonstwas. Der Praeprozessor fuegt den Teil einfach ein, basta - nur
syntaktisch korrekt muss das Resultat sein.

@ Peter Stegemann

das habe ich auch gemeint. mehr möchte ich auch nicht. in meiner 
referenz steht auch "Der Präprozessor entfernt die #include-Zeile und 
ersetzt sie durch den gesamten Quelltext der Include-Datei. Die 
Quelltextdatei selbst wird nicht physisch verändert, der Compiler erhält 
jedoch den modifizierten Text zur Übersetzung. "

dem scheint es aber nicht so zu sein...

hier ist gleich makefile

######################################################################## 
#######
# Makefile for the project projekt_1
######################################################################## 
#######

## General Flags
PROJECT = projekt_1
MCU = atmega644p
TARGET = projekt_1.elf
CC = avr-gcc

## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=  -SRC=$(TARGET).c-globals.c  -Wl,-Map=projekt_1.map


## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings


## Objects that must be built in order to link
OBJECTS = projekt_1.o globals.o

## Objects explicitly added by the user
LINKONLYOBJECTS =

## Build
all: $(TARGET) projekt_1.hex projekt_1.eep projekt_1.lss size

## Compile
projekt_1.o: ../projekt_1.c
  $(CC) $(INCLUDES) $(CFLAGS) -c  $<

globals.o: ../globals.c
  $(CC) $(INCLUDES) $(CFLAGS) -c  $<

##Link
$(TARGET): $(OBJECTS)
   $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o 
$(TARGET)

%.hex: $(TARGET)
  avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@

%.eep: $(TARGET)
  -avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0

%.lss: $(TARGET)
  avr-objdump -h -S $< > $@

size: ${TARGET}
  @echo
  @avr-size -C --mcu=${MCU} ${TARGET}

## Clean target
.PHONY: clean
clean:
  -rm -rf $(OBJECTS) projekt_1.elf dep/* projekt_1.hex projekt_1.eep 
projekt_1.lss projekt_1.map


## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um es mal zu präzisieren:
Die übliche Vorgehensweise, um syntaktische Probleme zu vermeiden, ist 
das erstellen einer Headerdatei (*.h) zu jeder .c-Datei, in der sich 
ausschließlich Deklarationen (jedoch keine Definitionen ) aller 
Objekte befinden, die in der dazugehörigen .c-Datei definiert sind und 
die für andere Module (andere .c-Dateien) sichtbar sein sollen. Und nur 
die .h-Dateien werden dann mit #include eingebunden.

Außer Variablen-/Funktionsdeklarationen können in Headerdateien auch 
Typdfinitionen (typedef) und Präprozessormakros stehen. Das war es dann 
aber auch schon fast...

Normalerweise bindet man Quelldateien tatsächlich nicht mit #include 
ein. Klar, man kann alles einbinden, aber nur in wenigen Fällen macht 
das Sinn.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag mal, geht's noch? Du sollst den Quellcode posten und nicht 
irgendwelche unsinnigen Screenshots! Das Dateiformat für C-Code heißt 
nicht .jpg, sondern .c!

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stell die linker Optionen wieder zurück, das macht avrstudio schon von 
alleine

siehe unten die Ausgabe des Compilers...

Er versucht die globals.c zum compiliern, was natürlich fehlschlägt...

Jede .c braucht alle includes die sie selber brauch.

Such mal nach globlane Variablen hier im Forum, da wird dir geholfen...

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Riller wrote:

> @ Peter Stegemann

> dem scheint es aber nicht so zu sein...

Doch doch, dein projekt_1.c uebersetzt auch einwandfrei. Nur hast du 
globals.c nochmal separat im Projekt - und das File alleine kann der 
Compiler so nicht uebersetzen. Und selbst wenn er koennte, du haettest 
den Inhalt dann doppelt, was beim Linken wieder krachen duerfte, weil du 
so doppelte Symbole bekommst. Ach das liesse sich loesen, fuehrt aber 
hier wohl zu weit...

Man kann zwar mit #include machen was man moechte, wenn man aber nicht 
genau weiss, was man tut, haelt man sich besser an die von Johannes 
beschriebenen Konventionen ;-)

Ich denke was du willst ist ein globals.c, das selbstaendig uebersetzt 
(also alle noetigen includes machen!) und ein globals.h, dass die 
Variablen extern deklariert und von den anderen Dateien eingebunden 
wird. Wie ....... schon schrieb, muss das mehrfach hier im Forum 
beschrieben sein.

Autor: Rolf Riller (ultra-low)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gut. danke. habe jetzt in globals.c "#include <avr/io.h> " eingefügt und 
beim compilieren ergeben sich jetzt keine fehler.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und nein, das hat nichts mit Compiler oder Linker-Einstellungen zu tun.

Mein Tip ist übrigens, dass dir ein

#include <inttypes.h>

an irgendeiner Stelle fehlt.

Autor: Rolf Riller (ultra-low)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich kriegs nicht auf die reihe.

kann mir jemand ein tutoriallink geben wo erklärt wird wie man diese 
problematik bewerkstelligt:

--- hauptfile.c -----
int main()
  {
    var_1 = 1;
    var_2 = 1;
    func_1();
    func_2();
  }

--- module_1.c ------
int var_1;
void func_1()
  {
    var_2 = 1;
    func_2();
  }

--- module_2.c -------
int var_2;
void func_2()
  {
    var_1 = 1;
    func_1();
  }

was ich möchte ist dass man "kreuz und querz" aufrufe tätigen kann, wie 
man das von php oder vb.net kennt. dort includet man das nötige modul 
mit seinen funktionen und variablen und gut ist es. meine hausaufgaben 
habe ich schon gemacht nämlich sämtliche foren durchsucht usw. da wird 
zwar viel geredet aber nichts konkretes.

danke im voraus

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest dir ein C-Buch zulegen. Das sind absolute Grundlagen, kaum 
einer hier wird Lust haben, einen C-Kurs abzuhalten.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach:

--- hauptfile.c -----
#include "module_1.h"
#include "module_2.h"

int main()
  {
    var_1 = 1;
    var_2 = 1;
    func_1();
    func_2();
  }

--- module_1.c ------
#include "module_2.h"

int var_1;
void func_1()
  {
    var_2 = 1;
    func_2();
  }

--- module_2.c -------
#include "module_1.h"

int var_2;
void func_2()
  {
    var_1 = 1;
    func_1();
  }

--- module_1.h ------
extern int var_1;
void func_1();

--- module_2.h -------
extern int var_2;
void func_2();

Autor: Marco G. (stan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zunächst mal überlegst du dir, welche Informationen für module_1.c bzw. 
module_2.c 'nach aussen' sichtbar sein sollen.

Für module_1.c sind das
  * Es gibt eine Variable var_1
  * Es gibt eine Funktion func_1

Für module_2.c sind das
  * Es gibt eine Variable var_2
  * Es gibt eine Funktion func_2

Dann legst du dir für jedes der beiden *.c Files ein entsprechendes 
Header File an. Sinnvollerweise nennt man das Header File gleich wie das 
zugehörige *.c File, nur kriegt es die Endung *.h

In diese Header Files kommen die Deklarationen für alle Dinge, die vom 
*.c File exportiert werden, also von aussen sichtbar sein sollen

In deinem Beispiel sind das

--- module_1.h ------
extern int var_1;

void func_1();

und

--- module_2.h -------
extern int var_2;
void func_2();

Wie werden sie jetzt verwendet?
Ganz einfach.
Jedes *.c, dass eine Funktionalität aus einem anderen *.c benutzen will, 
includiert das entsprechende Header File. Sinnvollerweise wird das 
definierende C-File auch sein eigenes Header File includieren. Damit 
ermöglicht man dem Compiler eine gewisse Prüfung, ob beides auch 
zusammenstimmt und wenn man eigene Datentypen definiert (Strukture, 
Unions) führt sowieso an diesem Include kein Weg vorbei

Konkret:

--- hauptfile.c -----
#include "module_1.h"    // stellt var_1  und func_1  bereit
#include "module_2.h"    // stellt var_2  und func_2  bereit

int main()
{
  var_1 = 1;
  var_2 = 1;
  func_1();
  func_2();
}

--- module_1.c ------
#include "module_1.h"

int var_1;
void func_1()
{
  var_2 = 1;
  func_2();
}

--- module_2.c -------
#include "module_2.h"
#include "module_1.h"   // weil ja var_1 und func_1 benutzt werden sollen

int var_2;
void func_2()
{
  var_1 = 1;
  func_1();
}

Autor: Rolf Riller (ultra-low)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super. danke. besser hätte man das nicht erklären können.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das funktioniert so nicht:

-- module_1.c ------
#include "module_1.h"

int var_1;
void func_1()
{
  var_2 = 1;
  func_2();
}

Hier wird auf Dinge zugegriffen, die im Modul2 definiert sind. Also muss 
auch --wie ich es weiter oben schon gezeigt habe-- auch module_2.h 
eingebunden werden.

Pedanterie:
s/dass/das/

Autor: Rolf Riller (ultra-low)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe schon getestet. alles bestens.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly wrote:
> Das funktioniert so nicht:
> Hier wird auf Dinge zugegriffen, die im Modul2 definiert sind.

Oops. Hab ich übersehen.
Danke für den Fix.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.