Globale Variablen und mehrere Units?
-
Hi Leute!
Ich habe das Problem, das ich ein Projekt habe, welches mehrere Funktionen verwendet, die globale Variablen benutzen. Jetzt würde ich aber gerne diese Funktionen als eine Art Library vom Hauptprogramm abtrennen und damit eine bessere Übersichtlichkeit erreichen. Ich habe das Problem mal am folgenden Beispiel im Borland C++ Builder 4 ausprobiert:
HELLO.H (Vorwärts-Deklarationen und eine globale Variable "pieps")
#ifndef HELLO_H #define HELLO_H #include <condefs.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> void printpieps(); void setpieps(); int pieps; #endifPIEPSFUNC.CPP (Library-Funktionen)
#include "hello.h" void printpieps() { printf("PIEPS: %d\n", pieps); } void setpieps() { pieps = 45; printf("setpieps done: %d\n", pieps); }TEST.CPP (das Main-File meines Projekts)
#include "hello.h" //--------------------------------------------------------------------------- USEUNIT("piepsfunc.cpp"); //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { pieps = 10; printf("%d\n", pieps); printpieps(); printf("%d\n", pieps); setpieps(); printf("%d\n", pieps); pieps = 999; printpieps(); getch(); return 0; }Wenn ich dieses Programm nun ausführe erhalte ich folgende Ausgabe:
10
PIEPS: 0
10
setpieps done: 45
10
PIEPS: 45Ich will aber eigentlich erreichen, das "pieps" als globale Variable von beiden Files sozusagen verwendet wird, d.h. wenn ich pieps in TEST.CPP auf 10 setze, soll auch pieps im PIEPSFUNC.CPP den Wert 10 haben, und umgekehrt. Demnach solte es richtig lauten:
10
PIEPS: 10
10
setpieps done: 45
45
PIEPS: 999Wisst ihr was man da machen kann?
Danke & Gruss,
~code_pilot
-
versuch's mal so:
[code] //---------------------------------------------------------------------------- //globale Variablendefinition extern int Speicher, Vorlauf, Ruecklauf, Lux, V1, V2, PumpeTime, SaveVarTime; extern int Vorlauf_min, Speicher_max, Einschaltdiff, Ausschaltdiff, VentilTime; extern bool R1, R2; //----------------------------------------------------------------------------- //Initialisierungsfunktionen extern void init (); //initialisiert Variablen extern void init_label (); //initialisiert die Label //usw................... [/code]so geht's halt bei mir!!
PS: steht in der Header Datei
mfg
Tom
-
Hi!
Nein das geht so leider auch nicht, dann bekomme ich einen Linker-Fehler:
[Linker Fehler] Unresolved external '_pieps' referenced from C:\PROGRAMME\BORLAND\CBUILDER4\PROJECTS\INCLUDE_TEST\PIEPSFUNC.OBJ.
Allerdings nur, wenn ich wirklich sage
extern int pieps;Bei den Funktionen gibts keinen Fehler. Aber du machst es doch genauso, warum geht das dann nicht bei mir?!

Gruss,
~code_pilot
-
Hallo
hast du denn die Variable auch noch mal in der Implementationsdatei deklaraiert?
Header-Datei PIEPSFUNC.h
extern int pieps;Implementationsdatei PIEPSFUNC.cpp
extern int pieps = 10; // Initialisierungbis bald
akari
-
Hallo,
Lass das extern in der cpp mal lieber weg.
-
Ja aber da dann global und ohne extern, das heißt direkt nach dem #include der div. Header Datein
-
Wobei man noch erwähnen sollte, dass man globale Variablen grundsätzlich vermeiden soll. Die extensive Verwendung globaler Variablen ist immer ein Zeichen schlechten Designs. Wenn es unbedingt nötig ist kann man globale Variablen in ein Singleton oder Monostate packen.
-
Habs jetzt selber lösen können :):
HELLO.H
#ifndef HELLO_H #define HELLO_H #include <condefs.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> void printpieps(); void setpieps(); #endifPIEPSFUNC.CPP
#include "hello.h" extern int pieps; void printpieps() { printf("PIEPS: %d\n", pieps); } void setpieps() { pieps = 45; printf("setpieps done: %d\n", pieps); }TEST.CPP
#include "hello.h" int pieps; //--------------------------------------------------------------------------- USEUNIT("piepsfunc.cpp"); //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { pieps = 10; printf("%d\n", pieps); printpieps(); printf("%d\n", pieps); setpieps(); printf("%d\n", pieps); pieps = 999; printpieps(); getch(); return 0; }So klappts ;)...
-
Hier nochmal die (nun korrekte) Ausgabe:
10
PIEPS: 10
10
setpieps done: 45
45
PIEPS: 999~cp
@ADMIN: Thread close!
-
Warum übergibst du deine Variable nicht einfach den Funktionen die sie benötigen? So wäre das deutlich übersichtlicher.
-
Braunstein schrieb:
Warum übergibst du deine Variable nicht einfach den Funktionen die sie benötigen? So wäre das deutlich übersichtlicher.
Weil ich ein bestehendes System habe bei dem das nicht "mal eben" änderbar ist.