Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.01.2011, 20:27

Variabeln auch in anderen Quelldateien zugänglich machen

Hallo,
ich bin jetzt bei 5.11 und würde gerne das ganze übersichtlich anpacken und daher die Funktionen in eine andere Quelldatei packen.
Das funktioniert auch super nur wird mir bei den Variabeln bzw. genauer geht es hier um eine Struktur gesagt:

Zitat

error C2065: 'a_Spielfeld': nichtdeklarierter Bezeichner
Ich habe irgendwo im Buch gelesen wie man sagen konnte das die Variable existiert... denn sie wird in einer anderen Quelldatei(der main) deklariert... Ich finde die Stelle nur leider echt nicht wieder.
Was sollte man hier am besten machen?

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

2

02.01.2011, 20:45

Das ist im Prinzip so ähnlich wie bei Funktionen. Um eine Funktion aufzurufen benötigt man nur einen Funktionsdeklaration (Prototyp), vorausgesetzt die Funktion wird irgendwo innerhalb des Projektes auch definiert.
Genauso ist es bei globalen Variablen. Um eine globale Variable benutzen zu können benötigt man nur ihre Deklaration (deshalb auch die Fehlermeldung "nichtdeklarierter Bezeichner"). So eine Deklaration sieht folgendermaßen aus:

C-/C++-Quelltext

1
2
// in einer Quellcodedatei
extern int globale_variable; // globale_variable wird hier nur deklariert

Diese Variable muss natürlich auch noch irgendwo innerhalb des Projektes definiert werden: (genau ein mal)

C-/C++-Quelltext

1
2
// in einer anderen Quellcodedatei
int globale_variable; // globale_variable wird hier deklariert und definiert

Allerdings rate ich dir, globale Variablen nur dann zu nutzen, wenn sie wirklich unbedingt zwingend notwendig sind. Viele globale Variablen machen ein Projekt sehr schnell sehr unübersichtlich, schwer verständlich und fehleranfälllig.
Signaturen werden überbewertet

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

02.01.2011, 20:45

Am besten sollte man bei so etwas nochmal sein Konzept überdenken, denn es ist oft ein Zeichen für schlechtes Design. Dependency Injection ist hier sicher der bessere Weg.

Rein technisch lässt sich das Problem natürlich mit dem Keyword "extern" lösen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

02.01.2011, 20:48

Ok.
Ich werde mal schauen ob sich die Struktur sinvoll anders lösen lässt (:
Und im Notfall werde ich extern verwenden.
Danke!


EDIT:
Ah das "umdesignen" hat sehr merkwürdige Errors hervorgerufen ...
spiel.coo

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include "prototypen.hpp"

using namespace std;

struct S_Spielfeld//Struktur des Spielfeldes
{
    bool B_besetzt;
    char Name[30];
};

int GrenzeHorizontalMax = 5; //Maximale Horizontale Grenze
cout << "tut";
int GrenzeHorizontalMin = 1; //Minimale Horizontale Grenze
int GrenzeVertikalMax = 5;   //Maximale Vertikale Grenze
int GrenzeVertikalMin = 1;   //Minimale Vertikale Grenze
S_Spielfeld a_Spielfeld[GrenzeHorizontalMax][GrenzeVertikalMax];//Array des Spielfeldes

void Feldbesetzen()
{
    int x,y;
    do {//x Koordinate abfragen
        cout << "x-Position (1-5): ";
        cin >> x;
    }while(GrenzeHorizontalMin < 1 || GrenzeHorizontalMax > 5);
    do {//y Koordinate abfragen
        cout << "y-Position (1-5): ";
        cin >> y;
    }while(GrenzeVertikalMin < 1 || GrenzeVertikalMax > 5);
    cout << "Name: ";
    cin.get(a_Spielfeld[GrenzeHorizontalMax-1][GrenzeVertikalMax-1].Name,29);

}

Lernprojekt.cpp (hauptdatei)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include "prototypen.hpp"//Funktionsprototypen
using namespace std;



int main()
{
    char Wahl;
    do 
    {   //Menue
        cout << "1. Spielfeld anzeigen\n";
        cout << "2. Feld besetzen\n";
        cout << "3. Felddaten anzeigen\n";
        cout << "4. Spielfeld loeschen\n";
        cout << "5. Programm beenden\n";
        cout << "Waehle einen Menuepunkt: ";
        cin >> Wahl;
        
        switch(Wahl)
        {
            case '1':
                cout << "1 - Spielfed anzeigen gewaehlt\n";
                zurueckzumMenue();//Zurueck zum Menue?
                break;
            case '2':
                cout << "2. Feld besetzen gewaehlt\n";
                Feldbesetzen();//Feld besetzen lassen
                zurueckzumMenue();//Zurueck zum Menue?
                break;
            case '3':
                cout << "3. Felddaten anzeigen gewaehlt\n";
                zurueckzumMenue();//Zurueck zum Menue?
                break;
            case '4':
                cout << "4. Spielfeld loeschen gewaehlt\n";
                zurueckzumMenue();//Zurueck zum Menue?
                break;

        }
    }while (Wahl != '5');//Beenden?!
    return 0;
}

menue.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Alle Funktionen das Menue betreffend


#include <iostream>
#include "prototypen.hpp"
using namespace std;

//zueruckzumMenue
//
//Fragen ob man zum Hauptmenu zurueck will
void zurueckzumMenue ()
{
    char wahl = 'n';
    do{
        
        cout << "Zureuck zum Menue \?";
        cin >> wahl;
    }while (wahl != 'j' && wahl!='J');
}

Meine prototype.cpp

C-/C++-Quelltext

1
2
3
4
5
6
#include <iostream>

using namespace std;

void zurueckzumMenue ();
void Feldbesetzen();




Er lieferte mir immer bei

C-/C++-Quelltext

1
S_Spielfeld a_Spielfeld[GrenzeHorizontalMax][GrenzeVertikalMax];//Array des Spielfeldes
das Konstant 0 nicht erlaubt sei.
Irgendwie ja unsinnig da ich vorher die Integers als 5 definiert hatte.
Also habe ich einen anderen Fehler vermutet und ein

C-/C++-Quelltext

1
cout << "tut";
dahingehangen.

Zitat

1>------ Erstellen gestartet: Projekt: LernProjekt1, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>Spiel.cpp
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(13) : error C2143: Syntaxfehler: Es fehlt ';' vor '<<'
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(17) : error C2057: Konstanter Ausdruck erwartet
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(17) : error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(17) : error C2057: Konstanter Ausdruck erwartet
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(17) : error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(17) : error C2087: 'a_Spielfeld': Feldindex fehlt
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(23) : error C2872: 'cout': Mehrdeutiges Symbol
1> kann 'c:\users\ich\projects\lernprojekt1\spiel.cpp(13) sein: int cout'
1> oder "c:\program files\microsoft visual studio 9.0\vc\include\iostream(53) : std::ostream std::cout"
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(23) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const char [19]' ist
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(23) : warning C4552: '<<': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(27) : error C2872: 'cout': Mehrdeutiges Symbol
1> kann 'c:\users\ich\projects\lernprojekt1\spiel.cpp(13) sein: int cout'
1> oder "c:\program files\microsoft visual studio 9.0\vc\include\iostream(53) : std::ostream std::cout"
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(27) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const char [19]' ist
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(27) : warning C4552: '<<': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(30) : error C2872: 'cout': Mehrdeutiges Symbol
1> kann 'c:\users\ich\projects\lernprojekt1\spiel.cpp(13) sein: int cout'
1> oder "c:\program files\microsoft visual studio 9.0\vc\include\iostream(53) : std::ostream std::cout"
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(30) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const char [7]' ist
1>c:\users\ich\projects\lernprojekt1\spiel.cpp(30) : warning C4552: '<<': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
1>Das Buildprotokoll wurde unter "file://c:\Users\Ich\Projects\LernProjekt1\Debug\BuildLog.htm" gespeichert.
1>LernProjekt1 - 13 Fehler, 3 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Ist daraufhin die sehr merkwürdige Fehlermeldung.

Ich überseh anscheinend ein vergessenes Semikolon ansonsten kann ich mir das ganze nicht vorstellen ,...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »easyMaxi« (02.01.2011, 21:01)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

02.01.2011, 21:07

cout << "tut"; kann garnet aufgerufen werden oO
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

6

02.01.2011, 21:13

Ja , irgendwie verstehe ich das nicht ...
Und ich dachte ich kopiere einfach mal

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
struct S_Spielfeld//Struktur des Spielfeldes
{
    bool B_besetzt;
    char Name[30];
};

int GrenzeHorizontalMax = 5; //Maximale Horizontale Grenze
cout << "tut";
int GrenzeHorizontalMin = 1; //Minimale Horizontale Grenze
int GrenzeVertikalMax = 5;   //Maximale Vertikale Grenze
int GrenzeVertikalMin = 1;   //Minimale Vertikale Grenze
S_Spielfeld a_Spielfeld[GrenzeHorizontalMax][GrenzeVertikalMax];//Array des Spielfeldes

den Part von main nach spiel.cpp ... aber das hat nicht funktioniert. Aber was läuft da nicht ^^

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

02.01.2011, 21:22

cout << "tut";
Funktioniert außerhalb von Funktionen nicht, wie NachoMan schon gesagt hat, wann soll es aufgerufen werden?!

S_Spielfeld a_Spielfeld[GrenzeHorizontalMax][GrenzeVertikalMax];
Geht nicht, weil Arrays mit einer konstanten Größe erzeugt werden müssen. Ersetze

int GrenzeVertikalMax = 5; //Maximale Vertikale Grenze
int GrenzeVertikalMin = 1; //Minimale Vertikale Grenze

mit:
#define GrenzeVertikalMax 5; //Maximale Vertikale Grenze
#define GrenzeVertikalMin 1; //Minimale Vertikale Grenze

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

02.01.2011, 21:22

sry. hatte net viel zeit. jeder funktionaufruf muss sich in einer anderen funktion befinden.(cout << "tut"; ist ein funktionaufruf, auch wenn es nicht so aussieht)
der passt da einfach nicht hin.
ups zu spät^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

9

02.01.2011, 21:26

Ahsooo.
Klar das sind ja Konstanten und die erzeugt man mit #define...
Variabeln in der Erzeugung von Arrays sind also nicht gewollt?!

Den Rest hab ich verstanden .. Klar cout geht ja garnicht ^^

EDIT:
Komisch vorher hat der Rest geklappt.
Aber jetzt fällt er in eine Endlosschleiße, wenn man die y Koordinate eingetragen hat.
Und fragt scheinbar ab ob man ins Menue zurück will... aber ohne auf cin zu warten.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

10

02.01.2011, 21:36

Nein keine Variablen, um Arrays zu erzeugen, da der Compiler ja wissen muss, wie viel Speicher er reservieren muss.

Dann wird wohl noch ein Zeichen im Eingangspuffer hängen, das direkt mit cin >> ausgelesen wird. Schreibe vor cin >> cin.ignore();

EDIT:
Mir fällt gerade auf, was willst du mit diesen Schleifen bezwecken? Sind sie nicht ein bisschen unlogisch?!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
do {//x Koordinate abfragen
        cout << "x-Position (1-5): ";
        cin >> x;
    }while(GrenzeHorizontalMin < 1 || GrenzeHorizontalMax > 5);
    do {//y Koordinate abfragen
        cout << "y-Position (1-5): ";
        cin >> y;
    }while(GrenzeVertikalMin < 1 || GrenzeVertikalMax > 5);

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BurningWave« (02.01.2011, 21:42)


Werbeanzeige