PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ich hab noch ein Problem in C++


Elvin
2002-11-20, 17:01:54
Ich weiß das dieses Problem bestimmt total bescheuert ist aber nichts desto trotz:

???Wie deklariere ich in C++ (besser gesagt beim Borland C++ Builder) ein Array global??? ??? So das ich es in mehreren Units benutzen kann.

Bin für jede Hilfe dankbar.
Und bitte nicht auslachen :(

P.S. Ein Array lokal zu deklarieren bekomm ich hin.

Einfachkrank
2002-11-20, 19:36:31
Hi,

also ich denke mal, dass der Borland Compiler fast genau so aufgebaut ist wie Microsoft`s Visual C++, oder? Eine globale Variable unterscheidet sich von einer lokalen eigentlich nur in einem Punkt, ob sie in einer Funktion angelegt ist oder nicht(denke ich zumindest). Wenn du die Variable innerhalb einer Funktion anlegst, dann kennt sie nur diese Funktion und ist deshalb lokal. Und global muss du am besten am Anfang deines Quelltextes einfach deklarieren(wie mit den "#includes", die auch nicht in einer Funktion stehen). Dann kennt sie jede Funktion in dieser Datei und ist global. Brauchst du diese Variable dann noch in anderen Dateien, falls du modularisierst, dann kannst du diese auch verwenden, in dem du einfach das Stichwort extern verwendest:
# include <stdio.h>
# include <stdlib.h>

// globale Variable
int Wert;

void main(void)
{
//lokale Variable
int Wert2;
}

// in einer anderen Datei
extern int Wert;
Ich denke, dass es so richtig sein sollte :D

MFG Einfachkrank

Exxtreme
2002-11-20, 20:18:51
Jupp, so sollte es funktionieren. Andererseits sollte man doch lieber auf möglichst viele globale Variablen verzichten wenn's möglich ist.

Elvin
2002-11-21, 11:08:58
Ja, es funtioniert super, aber mein Problem trifft es noch nicht.

Ich will nämlich in der main der Variable einen Wert zuweisen und in der anderen will ich diesen Wert abfragen.

Wenn ich es so mache funzt es nicht.

# include <stdio.h>
# include <stdlib.h>

// globale Variable
int Wert;

void main(void)
{
//lokale Variable
int Wert2;

extern int Wert;
Wert = 5;
}

// in einer anderen Datei
Ausgabe = Wert;

Da kommt dann der Fehler "undefiniertes Symbol 'Wert'"

Exxtreme
2002-11-21, 11:22:20
Du musst das anders machen:

#include ...

int Wert; //globale Variable
void main() {
int Wert2; //lokale Variable
Wert=5;
}


//in der anderen Datei
extern int Wert;
// hier kann man den Wert abfragen

Elvin
2002-11-21, 12:11:54
Ahhaaaaa :idea:

Jetzt hab ichs. Vielen vielen Dank. ;D;D
Ihr seid die größten. :jump2:

BTW: Ich hatte das gleiche Problem auch bei www.Programmier-board.de gepostet, aber in der Zeit wo ich dort nur eine Antwort bekommen hab hab ich hier 3 bekommen.
Fazit: Die Fachmänner sitzen hier. :smokin:

Exxtreme
2002-11-21, 12:28:08
Wie gesagt, am besten auf globale Variablen verzichten wenn es denn geht.

Einfachkrank
2002-11-21, 15:10:54
Originally posted by Elvin
Ja, es funtioniert super, aber mein Problem trifft es noch nicht.

Ich will nämlich in der main der Variable einen Wert zuweisen und in der anderen will ich diesen Wert abfragen.

Wenn ich es so mache funzt es nicht.

# include <stdio.h>
# include <stdlib.h>

// globale Variable
int Wert;

void main(void)
{
//lokale Variable
int Wert2;

extern int Wert;
Wert = 5;
}

// in einer anderen Datei
Ausgabe = Wert;

Da kommt dann der Fehler "undefiniertes Symbol 'Wert'"
Hi, ist ja klar, denn wenn du die Variable mit extern in der Main deklarierst, dann nimmt die Funktion an, dass die Variable in einer anderen Datei steht. Wenn sie in der selben Datei deklariert ist, brauchst du sie nur mit dem '=' Operator verwenden ;)

MFG Einfachkrank

Elvin
2002-11-21, 19:05:13
Ja jetzt ist mir das auch klar.

Ich dachte nur extern bedeutet sowas wie "diese Variable mach ich jetzt überall bekannt".
:nono:
Dabei heißt es ja das die Variable nicht dort deklariert wird sondern schau mal in anderen Units oder so ob es dort eine solche Variable gibt.
Oder so ähnlich. (Umgangsprachlich gesprochen)

Thanks nochma an euch.
:bounce::lol::rofl:;D

Vedek Bareil
2002-11-28, 01:49:44
Originally posted by Exxtreme
Wie gesagt, am besten auf globale Variablen verzichten wenn es denn geht. gibt es dafür auch einen bestimmten Grund? Bei meinen privaten Programmierunternehmungen habe ich bislang immer massiven Gebrauch von globalen Variablen gemacht, weil ich einfach keine Veranlassung gesehen habe, lokale zu verwenden.

Bei der Verwendung mehrerer Units ist übrigens die Bedeutung von global und lokal auch nicht mehr ganz klar:
Gibt es nur eine einzige Unit, so ist eine Variable lokal, wenn sie in nur einer einzigen Funktion deklariert ist, und global, wenn sie in der ganzen Unit deklariert ist. Bei mehreren Units jedoch gibt es drei statt zwei Stufen:
- eine Variable kann innerhalb einer einzigen Funktion innerhalb einer einzigen Unit deklariert sein
- eine Variable kann innerhalb einer ganzen Unit deklariert sein
- eine Variable kann innerhalb der ganzen Gesamtheit aller Units (also innerhalb des ganzen Projektes) deklariert sein.

Nasenbaer
2002-12-02, 18:29:56
Globale Variablen fürhen einfach zu einen miserablen und dadurch schlecht veständlichen Quellcode. Sicher kann man alles global deklarieren aber die Frage ist ob es 1. nötig ist? (Speicher wird ja dauerhaft belegt) und z.b. besetzt man dadurch ja auch den Bezeichner. So wäre eine Zählervariable z.B. ein großes Problem, weil man sowas oft braucht aber sich jedes mal nen neuen Namen ausdenken müsste.

C++ geht dann ja den Weg das man eigentlich keine Variable hat, die außerhalb eines Modules sichtbar sind und in einem kompletten modul sichtbare Variablem findet man dann nur noch dort wo man auch die Main-Funktion hat - obwohl man das sicher auch noch in ne Klasse packen könnte.

Mfg Nasenbaer

Exxtreme
2002-12-02, 19:35:11
@ Vedek

Für's "Hello World" kann man sicher globale Variablen benutzen. Bei meinem rTool, welches sich der 1500-Zeilen-Marke nähert wäre es auch kein Problem globale Veriablen zu benutzen. Bei grösseren Projekten kann sowas aber tödlich sein. Der Mensch neigt dazu Dinge für andere Zwecke zu missbrauchen wenn sie grad zur Hand sind. Stell dir vor, du arbeitest in einem Team. Du bindest auch in das Projekt Sourcecodes ein, die nicht von deiner Feder stammen. Wenn jetzt da jemand globale variablen benutzt, dann kann es sein, daß diese sich in die Quere kommen. Oder anderes Beispiel, du hast so ein nettes globales Flag zur Hand. Warum ein neues anlegen wenn eins schon da ist? Du benutzt es einfach und dein Programmier-Kollege kommt auf die gleiche Idee und benutzt dieses Flag auch. Dann nutzt du zufälligerweise eine Klasse, die dein Kollege geproggt hat. Tja, dann kann es passieren, daß das Flag nach dem Benutzen der Klasse einen anderen Wert bekommt als davor. Und das führt zu Fehlern und du kannst es dir nicht erklären warum die Klasse deines Kollegen das Flag ändert.

Deswegen kann man zu globalen Variablen eins sagen: so wenig wie möglich aber soviel wie nötig nutzen.

zeckensack
2002-12-02, 19:40:45
Ist ja eigentlich kein Problem ... bis auf die Windows-Integration.

Man muß ein paar Win32-spezifische Dinge global deklarieren, sonst kann man sie zB im Window-Callback nicht nutzen.

Apropos, das Window-Callback kann ja auch kein Klassenmember sein (muß __stdcall Aufrufkonvention haben), würde mich also ernsthaft wundern wenn man ein Win32-Fenster vollständig in eine Klasse kapseln könnte (ie ganz ohne globale Variablen).

Demirug
2002-12-02, 19:50:10
Ich benutze inzwischen überhaupt keine globalen Variablen mehr.

Bei meinen C# Projekten geht das sowieso nicht mehr weil es dort keine Globalen Variablen mehr gibt.

Und bei den C++ Sachen habe ich mir es auch abgewöhnt.

In beiden Fällen heist die Lösung statische Members.

@zeckensack: man kann es vollständig kapseln. Habe das mal mit OS/2 gemacht das bei den Fenstern ja nach dem gleichen Prinzip wie Windows arbeitet. Auch hier gilt wieder static Members.

zeckensack
2002-12-02, 21:00:54
Stimmt. Als static deklarieren geht natürlich.

Wobei dann auch der Vorteil der Klassen teilweise wieder wegfällt.

PS: die bessere Übersicht durch Beschränkung des 'scope' bleibt natürlich
Playstation2: ich habe das selbst schon gemacht, aber noch nicht für Fensterklassen. Bei der Win32-Programmierung komme ich mir regelmäßig gegängelt bis veräppelt vor.

Nagilum
2002-12-02, 21:20:45
Originally posted by zeckensack
Wobei dann auch der Vorteil der Klassen teilweise wieder wegfällt.

Wieso? Du hast in deiner Fenster-Klasse doch nur eine einzige statische Methode. Die fungiert dann praktisch als ne Art Wrapper für die WindowProc() und leitet die Messages an die richtige Instanzen der Fenster-Klasse weiter. So kann dann auch jedes Fenster seine eigene WindowProc() haben.

Besser gehts wohl nicht, und die MFC macht das AFAIK genauso.

zeckensack
2002-12-02, 21:42:37
Originally posted by Nagilum


Wieso? Du hast in deiner Fenster-Klasse doch nur eine einzige statische Methode. Die fungiert dann praktisch als ne Art Wrapper für die WindowProc() und leitet die Messages an die richtige Instanzen der Fenster-Klasse weiter. So kann dann auch jedes Fenster seine eigene WindowProc() haben.

Besser gehts wohl nicht, und die MFC macht das AFAIK genauso. Der Bestimmungsort für die Messages ist aber doch für die WindowProc nicht ersichtlich, also ist auch eine Umverteilung der Messages an andere 'gewrappte' Funktionen nicht möglich.

Oder stehe ich jetzt total auf dem Schlauch???

Demirug
2002-12-02, 21:50:55
Originally posted by zeckensack
Der Bestimmungsort für die Messages ist aber doch für die WindowProc nicht ersichtlich, also ist auch eine Umverteilung der Messages an andere 'gewrappte' Funktionen nicht möglich.

Oder stehe ich jetzt total auf dem Schlauch???

Da ich das wie gesagt schon mal für OS/2 gemacht habe kenne ich den Trick. Das ganze funktioniert folgendermassen.

Man kann ja an jede Fensterinstanz zusätzliche Werte anhängen (SetWindowLong, GetWindowLong) Nun speichert man einfach in eine solche Zelle einen Zeiger auf das Fensterobject den man in der statischen WindowProc ausliest und dann die Nachricht an das entsprechende Object weiterleitet.

Nasenbaer
2002-12-02, 22:01:12
Wenn ich nun aber nur ein einziges Fenster nutze, dann muss ich mich aber doch nicht quälen und sämtliche Variablen wie hDC oder den MessageHandler in ne Klasse packen, oder???

Mfg Nasenbaer

Vedek Bareil
2002-12-02, 22:02:02
mal ne ganz dumme Frage zu globalen Variablen und Klassen:
ein Objekt, also eine Instanz einer Klasse, ist ja selbst eigentlich auch eine Variable, nämlich eine vom Datentyp Klasse, und für gewöhnlich werden Objekte doch global deklariert, oder? Wäre demnach ein Objekt nicht eine globale Variable? ???

Exxtreme
2002-12-02, 22:15:26
Originally posted by Vedek Bareil
mal ne ganz dumme Frage zu globalen Variablen und Klassen:
ein Objekt, also eine Instanz einer Klasse, ist ja selbst eigentlich auch eine Variable, nämlich eine vom Datentyp Klasse, und für gewöhnlich werden Objekte doch global deklariert, oder? Wäre demnach ein Objekt nicht eine globale Variable? ???
Nicht unbedingt. Es gib einige globale Klassen und deren Instanzen in den Klassenbibliotheken. Meistens ist es die Applications-Klasse. Man kann ansonsten Instanzen von Klassen auch lokal generieren, da spricht nichts dagegen.