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; #endifcalcs.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"; } } ... ... #endifData/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 700Hauptprogramm:
#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 definiertLeider 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 0Mfg 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.