Forum: Mikrocontroller und Digitale Elektronik C++ Newibie Frage


von Simeone (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem in C++:

ich habe eine main.c:
1
int var1;
2
int main(void)
3
{
4
5
var1 = 10;
6
}

In einer berechne.c arbeite ich mit weiteren Funktionen:
1
void doberechnung(void)
2
{
3
int x;
4
x = var1;
5
}


Fehlermeldung ist immer
"var1" ist undeclared, dabei ist doch var1 in der main.c global 
definiert!??

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Simeone schrieb:

> "var1" ist undeclared, dabei ist doch var1 in der main.c global
> definiert!??

Die ineterssiert aber den Compiler nicht, wenn er berechne.c compiliert.
Jedes C-File wird für sich alleine compiliert, ohne Ansehen aller 
anderen C-Files.
1
extern int var1;
2
3
void doberechnung(void)
4
{
5
  int x;
6
  x = var1;
7
}

Wie man das dann in der Praxis vernünftig macht, findest du zb in der
FAQ
im Abschnitt 9. "Globale Variablen"

von Peter II (Gast)


Lesenswert?

Simeone schrieb:
> "var1" ist undeclared, dabei ist doch var1 in der main.c global
> definiert!??

und? woher soll der Compiler das wissen wenn er berechne.c übersetzt?

Und warum C++ wenn deine Dateien *.c sind?

von Bitflüsterer (Gast)


Lesenswert?

Jede C-Datei oder auch C++-Datei wird für sich übersetzt. D.h. während 
die eine Datei übersetzt wird, sind dem Compiler keinerlei Deklarationen 
oder Definitionen aus anderen Dateien bekannt.
Diese "Zusammenführung" geschieht erst am Schluß, bevor das gesamte 
Programm gebaut wird, im sog. "Linker" (was man ganz lose auch als 
"Zusammenführer" übersetzen könnte.

Was Du brauchst ist eine Deklaration in einem H-File (und ein C-Buch).

Dazu schreibst Du in einer H-Datei
1
extern int var1;

und fügst diese mit dem "#include"-Präprozessorbefehl in berechne.c ein.

Übrigens sehe ich im Code und an den Dateiendungen nur C und nicht C++.

von Fred (Gast)


Lesenswert?

Translation units in C (das sind deine beiden .c-Dateien) werden 
unabhängig voneinander kompiliert.

Wenn der Compiler gerade berechne.c verarbeitet, schaut er sich main.c 
nicht an. Auch wenn er main.c gerade davor verarbeitet haben sollte, 
vergißt er am Ende alles, was darin stand, und beginnt die berechne.c 
wieder mit völlig leerem "Gedächtnis".

von Daniel A. (daniel-a)


Lesenswert?

Erstelle noch eine main.h und eine berechne.h

In main.c kommt dann zuoberst
1
#include<main.h>
2
#include<berechne.h>

In berechne.c kommt zuoberst
1
#include<berechne.h>

In main.h kommt
1
int main( void );

In berechne.h kommt
1
extern  int var1;
2
void doberechne( void );

von Hans (Gast)


Lesenswert?

Daniel A. schrieb:
> In main.h kommt
> int main( void );

Wozu? In einem vernünftig aufgebautem Programm inkludiert kein andere 
C-Datei eine main.h, denn das wäre zwangsläufig eine wechselseitige bzw. 
zyklische Abhängigkeit. Und eine Vorwärtsdeklaration der main-Funktion 
braucht man selbst in main.c nicht, da main() ausschließlich vom 
Startupcode (des Compilers) aufgerufen wird ...

von tester (Gast)


Lesenswert?

würde übersichtshalber auch im main.h den berechnungsheader einbinden 
und nicht im c file, oder?!

von Kaj (Gast)


Lesenswert?

Karl Heinz schrieb:
> extern int var1;
>
> void doberechnung(void)
> {
>   int x;
>   x = var1;
> }
Das extern kann man sich auch einfach sparen und den Wert übergeben. Ist 
meiner Meinung nach viel sauberer als irgendwo eine Variable zu haben, 
die dann irgendwo anders benutzt wird...
Mach es ordentlich!
1
void doberechnung(int var)
2
{
3
  int x = var;
4
}
Und ansonsten der übliche Tipp: Lies ein C- bzw. C++-Buch!
(http://www.amazon.de/Der--Programmierer-professionell-anwenden-L%C3%B6sungen/dp/3446438947/ref=sr_1_1?ie=UTF8&qid=1399393473&sr=8-1&keywords=der+c%2B%2B+programmierer)

von Cube_S (Gast)


Lesenswert?

Kaj schrieb:
>   int x = var;

Das bringt so gut wie fast gar nichts, denn var ist in diesem Moment 
schon eine lokale Variable für "doberechnung"

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.