probleme mit globalen variablen



  • Hi,

    ich habe ein Problem mit globalen Variablen

    Mein code:

    globals.h:

    #ifndef GLOBALS_H
    #define GLOBALS_H
    
    char Ship[20];
    unsigned int Ship_met, Ship_kris, Ship_deut, Ship_struktur, Ship_schild, Ship_angriff;
    
    #endif
    

    calcs.cpp:

    #ifndef CALCS_CPP
    #define CALCS_CPP
    #include "globals.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    ...
    ...
    
    void getShipInfo()
    {
      string in;
      string valid_ships[]={"Kleiner_Transporter", "kleiner_transporter", "Großer_Transporter",
                             "großer_transporter", "Leichter_Jaeger", "leichter_jaeger",
                             "Schwerer_Jaeger", "schwerer_jaeger", "Kreuzer", "kreuzer",
                             "Schlachtschiff", "schlachtschiff", "Kolonieschiff", "kolonieschiff",
                             "Recycler", "recycler", "Spionagesonde", "spionagesonde", "Bomber",
                             "bomber", "Solarsatellit", "solarsatellit", "Zerstoerer", "zerstoerer",
                             "Todesstern", "todesstern", "Schlachtkreuzer", "schlachtkreuzer",
                             "Hilfe", "hilfe"};
      enum valid_ships_words{Kleiner_Transporter, kleiner_transporter, Grosser_Transporter,
                             grosser_transporter, Leichter_Jaeger, leichter_jaeger,
                             Schwerer_Jaeger, schwerer_jaeger, Kreuzer, kreuzer,
                             Schlachtschiff, schlachtschiff, Kolonieschiff, kolonieschiff,
                             Recycler, recycler, Spionagesonde, spionagesonde, Bomber,
                             bomber, Solarsatellit, solarsatellit, Zerstoerer, zerstoerer,
                             Todesstern, todesstern, Schlachtkreuzer, schlachtkreuzer,
                             Hilfe, hilfe};           // Das mag etwas brutal klingen ist aber nur für ein browsergame
    
      int count = sizeof(valid_ships)/sizeof(std::string);
    
      bool error = true;
    
      ifstream data("Data/schiffe.dat");
    
      if(data.good())
      {
        do
        {
          cin >> in;
    
          switch(find(valid_ships, valid_ships + count, in) - valid_ships)
          {
             ...
             ...
             case schlachtschiff:
             case Schlachtschiff:
             {
               data.seekg(0, ios_base::beg);
    
               for(int x = 0; x < 5; x++)
                 data.ignore( numeric_limits< streamsize >::max(), '\n' );
    
               data >> Ship; cout << Ship << endl;                // Die ausgaben sind nur zum testen
               data >> Ship_met; cout << Ship_met << endl;
               data >> Ship_kris; cout << Ship_kris << endl;
               data >> Ship_deut; cout << Ship_deut << endl;
               data >> Ship_struktur; cout << Ship_struktur << endl;
               data >> Ship_schild; cout << Ship_schild << endl;
               data >> Ship_angriff; cout << Ship_angriff << endl << endl;
    
               error = false;
               break;
             }
             ...
             ...
           }
        }while(error == true);
      }
      else
      {
        cout << "FEHLER: Die Datei Data/schiffe.dat konnte nicht geoeffnet werden!\n";
      }
    }
    
    ...
    ...
    
    #endif
    

    Data/schiffe.dat:

    Kleiner_Transporter 2000 2000 0 4000 10 5
    Großer_Transporter 6000 6000 0 12000 25 5
    Leichter_Jaeger 3000 1000 0 4000 10 50
    Schwerer_Jaeger 6000 4000 0 10000 25 150
    Kreuzer 20000 7000 2000 27000 50 400
    Schlachtschiff 45000 15000 0 60000 200 1000
    Kolonieschiff 10000 20000 10000 30000 100 50
    Recycler 10000 60000 2000 16000 10 1
    Spionagesonde 0 1000 0 1000 0 0
    Bomber 50000 25000 15000 75000 500 1000
    Solarsatellit 0 2000 500 2000 1 1
    Zerstoerer 60000 50000 15000 110000 500 2000
    Todesstern 5000000 4000000 1000000 9000000 50000 200000
    Schlachtkreuzer 30000 40000 15000 70000 400 700
    

    Hauptprogramm:

    #include "globals.h"
    #include "calcs.cpp"
    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
    ...
    getShipInfo();cout << Ship_schild;
    ...
    return 0;
    }
    

    es lässt sich compilieren allerdings mit Warnungen:

    Warning: Das als public deklarierte Symbol '_Ship' ist in den beiden Modulen C:\***\CALCS.OBJ und C:\***\OGAME CALC.OBJ definiert
    
    Warning: Das als public deklarierte Symbol '_Ship_met' ist in den beiden Modulen C:\***\CALCS.OBJ und C:\***\OGAME CALC.OBJ definiert
    
    Warning: Das als public deklarierte Symbol '_Ship_kris' ist in den beiden Modulen C:\***\CALCS.OBJ und C:\***\OGAME CALC.OBJ definiert
    
    Warning: Das als public deklarierte Symbol '_Ship_deut' ist in den beiden Modulen C:\***\CALCS.OBJ und C:\***\OGAME CALC.OBJ definiert
    
    Warning: Das als public deklarierte Symbol '_Ship_struktur' ist in den beiden Modulen C:\***\CALCS.OBJ und C:\***\OGAME CALC.OBJ definiert
    
    Warning: Das als public deklarierte Symbol '_Ship_schild' ist in den beiden Modulen C:\***\CALCS.OBJ und C:\***\OGAME CALC.OBJ definiert
    
    Warning: Das als public deklarierte Symbol '_Ship_angriff' ist in den beiden Modulen C:\***\CALCS.OBJ und C:\***\OGAME CALC.OBJ definiert
    

    Leider weiß ich nicht was das bedeuten soll.

    Das Problem ist wenn ich in der main() die variablen abrufen will haben die den wert 0.

    Ausgegeben wird:

    45000
    15000
    0
    60000
    200
    1000
    
    0
    

    Mfg Yazoo



  • Das heißt, daß du in jeder Übersetzungseinheit eine Kopie der globalen Variablen definiert hast - und die existieren dann nebeneinander. In deinem Header benötigst du nur Deklarationen (extern) und die zugehörigen Definitionen in EINEM der Quellfiles.

    PS: Aber ich würde dir empfehlen, komplett auf globale Variablen zu verzichten und alle Werte in ein struct zu packen - und dann diese struct's als Parameter/Rückgabewerte herumzureichen.

    PPS: Wenn du die Eingabe des Schiffsnamens in Kleinbuchstaben umwandelst (tolower()), kannst du einiges an Platz sparen - und kannst auch Eingaben wie "SCHLACHTSCHIFF" entgegennehmen.

    P3S: Und ich würde die komplette Datei einmal einlesen und in einer geeigneten Datenstruktur (map<>, set<>) unterbringen.



  • wenn ich nach cin >> in; in = tolwoer(in); mache, dann sagt mein compiler fehler string lässt sich nicht zu int convertieren. was muss ich machen 😕



  • tolower() arbeitet mit einem einzelnen Zeichen - die Funktion mußt du in einer Schleife (oder mit transform()) auf alle Zeichen der Eingabe anwenden).



  • ich krieg das irgendtwie net hin, kannst mir das mal als code zeigen?



  • cin>>eingabe;
    for(int i=0;i<eingabe.length();++i)
      eingabe[i]=tolower(eingabe[i]);
    
    //oder
    
    cin>>eingabe;
    transform(eingabe.begin(),eingabe.end(),tolower);
    

    (die letzte Variante könnte ein Problem mit der Überladungsauflösung haben - notfalls brauchst du eine Zwischenfunktion)

    PS: Aber bevor du dich um solche Kleinigkeiten kümmerst, solltest du erstmal dein Design überdenken.


Anmelden zum Antworten