Hilfe bei C++ Programm (ungelöst)

C

Crymes

Guest
Hilfe bei C++ Programm (ungelöst)

Hallo,
Ich bin gerade dabei, ein Zahlenrate-Spiel von mir sauberer, strukturierter zu Schreiben.
Früher stand in meiner Main nur ein Funktionsaufruf, mit dem ich dann per return(Funktionsname) zur nächsten funktion gesprungen bin usw. .
Jetzt habe ich alles komplett neu geschrieben. (Auch ein paar Features geändert)
In der Main stehen die Funktionen (bis jetzt 3) und in den Funktionen ist dann der Code geschrieben, ich benutze aus Unfähigkeit nur globale Variablen zur Übergabe.
MEin Problem: Wenn ich in die Funktion kein return reinschreibe (Was auch?), öffnet und schließt sich das Programm als wenn nichts drin stehen würde.
Wenn ich die Funktionen mit void definiere kommt folgendes:
int stringumwandlung(void)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'void stringumwandlung(void).
Könnt ihr mir helfen?
 
Zuletzt bearbeitet:
AW: Problem mit den Funktionen bei C++

Wäre es auch möglich Code zu posten? Das würde sicherlich helfen.
 
AW: Problem mit den Funktionen bei C++

Sollte nun Funktionieren (zumindest tut es das bei mir) ;)

Dein Hauptproblem war, dass du vor einem Funktionsaufruf z.B. int geschrieben hast! Eine Funktion ruft man aber nicht mit einem Datentyp wie z.B. int auf.
Falsch:
Code:
int Zahlen()
Richtig:
Code:
Zahlen()
Habe außerdem noch paar Kleinigkeiten am Syntax verbessert sowie einen Fehler behoben in der Funktion "schwierigkeitsbestimmung()"
Wenn dort ein anderer Buchstabe angegeben wurde, dann blieb der Schwierigkeitsgrad bei 0! => Das Programm stürzt in den nachfolgenden Operationen ab. Habe daher einen Default-Wert festgelegt.

Falls noch was ist einfach melden :)

Edit// Code-Update:
- Die Globale Variable "abstand" von 0 auf 100 gesetzt. Verhindert Absturz bei einer Falscheingabe.
Anhang anzeigen Zahlenraten.zip
 
AW: Problem mit den Funktionen bei C++

Also erstmal danke, bei mir funktioniert deine Version, musste nur noch diesen komischen header stdafx.h hinzufügen.
Das einzigste, eas du am Code geändert hattest war doch der default abstand, oder? Sonst fallen mir keine Unterschiede auf.
Wenn ich diese Zeile bei mir per Copy and Paste einfüge, funktioniert es trotzdem nicht.
Kannst du mir die anderen Stellen noch zeigen, ich übersehe die irgendwie immer.:what:
 
AW: Problem mit den Funktionen bei C++

Okay, gleich als Beispiel die main()

Code:
int main()
{
    int schwierigkeitsbestimmung();
    int hauptspiel();
    
}

Du schreibst vor deinen Funktionsaufrufen "int" - das gehört da aber nicht hin sondern nur der Funktionsname!
Bei void hauptspiel() das gleiche:
Code:
int stringumwandlung();

Verstanden?^^
 
AW: Problem mit den Funktionen bei C++

Ja, ich habs mir beim einschlafen gedacht, dass dort der Fehler sein muss.
Weißt du, wie man ?,ä,ü,ö usw. in der Konsole anzeigen kann?
 
AW: Problem mit den Funktionen bei C++

Dü müsstest dann beim cout gleich den Ascii Code angeben und das noch als char casten!
ä = cout << (char)132 << endl;
ü = cout << (char)129<< endl;
ö = cout << (char)148 << endl;
 
AW: Problem mit den Funktionen bei C++

Ich glaub ich definiere mir am anfang die ascis als ae, ss usw. . Dann brauch ich beim schreiben nur den string anzugeben. Finds aber irgendwie blöd, dass das noch nicht genormnt ist.
 
AW: Problem mit den Funktionen bei C++

Oder so.
Aber ich glaube an der "Normung" wird sich erstmal nix ändern :schief:
 
AW: Problem mit den Funktionen bei C++

So hab jetzt ein fettes Problem: Ich rufe ja eineig Funktionen in der Main auf, bis ich zu einer Funkltion komme, an der gefragt wird, ob man vielleicht nochmal spielen möchte oder den Schwierigkeitsgrad ändern möchte etc. .
Wenn man da was auswählt (ich springe aus der Funktion mit retourn in eine andere) läuft das Programm noch einm einziges mal durch, bevor es sich beendet. Ich glaube, es liegt daran, dass die main funktion dann zu Ende ist und den Pointer (heist das so?) nicht wieder an den Anfang setzt.

Kennt jemand abhiolfe ohne den kompletten code umzukrempeln??:hail:

Anbe der Quellcode:Anhang anzeigen 513034
 
AW: Problem mit den Funktionen bei C++

Spring doch einfach neu zur main, dann ist die auch nicht zuende :P
 
AW: Problem mit den Funktionen bei C++

Aber wenn ich direkt das spiel noch einmal spielen will?
Gibts da keine möglichkeit?
 
AW: Problem mit den Funktionen bei C++

Ein paar grundsätzliche Dinge vorab:

Standard-Includes, die vom System/Compiler bereitgestellt werden, solltest du mittels #include <header> (bspw. #include <string> oder #include <stdio.h> - also mit den spitzen Klammern) einbinden.

Wenn du eine Funktion schon mit Rückgabetyp definierst, solltest du auch was zurückgeben - wenn du nichts zurückgibst, nimmt der halt irgendetwas und das ist immer Käse.
Code:
[B]int[/B] main()
{
    // ...
    [B]return 0;[/B] // oder ein anderer Statuscode

    // ...
}
Code der Form
Code:
[B]void[/B] caller()
{
    // ...
    return myFunction(); // Prototyp: [B]void[/B] myFunction();

    // return <Wert>; macht bei einer void Funktion an sich schon wenig Sinn.
}
ist auch verwirrend, da myFunction nichts zurück gibt, ergo das Statement was anderes macht, als es dem Leser suggerieren mag. Abgesehen davon ruft man mit return keine Funktion auf, sondern verlässt sie (und gibt ggf. einen Wert zurück -> bei non-void Funktionen). Auch wenn es eine Zeile mehr code ist, würde ich das aus Lesbarkeitsgründen so schreiben (ich habe das ehrlich gesagt bei void Funktionen auch noch nicht anders gesehen):
Code:
void caller()
{
    // ...
    myFunction(); // Funktion aufrufen
    return; // caller verlassen

    // ...
}
Zumal du dir bei solchen Abfragen das return eh sparen kannst:
Code:
void caller()
{
    if (condition == A)
    {
        callA();
    }
    else if (condition == B)
    {
        callB();
    }
    else
    {
        callDefault();
    }
}
Sinnvoll wäre ein return hier z. B.:
Code:
void theFunc()
{
    int testvalue = doMagicCalc();

    if (testvalue == TV_A)
    {
         // mach was
         handleA();
         return; // Funktion theFunc() vorzeitig verlassen
    }

    // alle anderen Fälle (bei sowas kurzem könnte man auch ein else nutzen und das obige return einfach weglassen)
    everythingElse();
}
Nun zu deiner eigentlichen Frage:
Code:
// includes spar ich mir mal...

int main()
{
    bool bExit = false;

    while (!bExit)
    {
        bExit = abfrage(); // alles andere wird in der Funktion geregelt
    }

    return 0;
}

bool abfrage() // Achtung: Deklaration auch auf bool statt void ändern!
{
    // wenn die Funktion true zurück gibt, wird beendet (s. o.)
    string wahl="";

    cout << endl << "W" << ae << "hlen sie bitte zwischen folgenden Optionen:" << endl << endl; 
    cout << "noch einmal Spielen:            n" << endl << "In Punkteliste einschreiben:    e" << endl << "Punkteliste ansehen:            a" << endl << "Schwierigkeitsgrad neu w" << ae << "hlen:  s" << endl;
    cout << "Beenden: x" << endl; // neu
    cin >> wahl;
    
    if (wahl == "n")
    {
        hauptspiel();
        return false; // nicht beenden
    }
    else if (wahl == "e")
    {
        speichern();
        return false; // nicht beenden
    }
    else if (wahl == "a")
    {
        liste();
        return false; // nicht beenden
    }

    else if (wahl == "s")
    {
        schwierigkeitsbestimmung();
        return false; // nicht beenden
    }
    else if (wahl == "x")
    {
        return true; // beenden
    }
    else
    {
        cout << fehler << endl << endl;
        return abfrage(); // hier wird abfrage rekursiv aufgerufen!!!
    }
}
Du solltest evtl. noch sinnvolle Standardwerte (z. B. für die Schwierigkeit) eintragen, da man in dem Beispiel jetzt die Schwirigkeitsabfrage einfach überspringen kann. Ich habe den Code jetzt so aus dem Kopf runtergesemmelt, daher ist das nicht getestet. Müsste aber als grobe Richtung erst mal helfen ;)
 
Zuletzt bearbeitet:
AW: Problem mit den Funktionen bei C++

Jetzt hab ich mal ne blöde frage: Du hast boolexit doch auf false gesetzt, die while schleife wird dann ausgeführt, wenn der bool true ist.
Aber das ist er doch gar nicht?????
 
AW: Problem mit den Funktionen bei C++

Ich habe das jetzt so programmiert, dass er, wenn die funktion zum ersten mal ausgeführt wird als erstes schwierigkeit, dann hauptspiel aufruft. Nur wird ab einem gewissen Zeitpunkt nur noch schwierigkeitsbestimmung aufgerufen.

Falls ihr noch geduld mit mir habt: Hier ist der Code Anhang anzeigen 513140
 
AW: Problem mit den Funktionen bei C++

Jetzt hab ich mal ne blöde frage: Du hast boolexit doch auf false gesetzt, die while schleife wird dann ausgeführt, wenn der bool true ist.
Aber das ist er doch gar nicht?????
Der Operator ! negiert den Wert (NOT-Operator):
Code:
bool bExit = false;
if (!bExit)
{
    // !(false) ergibt true und !(true) ergibt false
}
Ich werde zu deinem Code mal was ausführlicheres schreiben und dann den Code hochladen, dass wird mir hier sonst als Post zu unübersichtlich. Ich nehme jetzt mal an, du lernst momentan C++. Auf wie viel Wissen kann ich denn zurückgreifen? Davon hängt nämlich ab, wie ausführlich ich das erklären muss, ich möchte ja schließlich, dass du dabei was lernst und nicht wie der Ochs vorm Berg stehst ;)

Update: Ich habe dir jetzt mal ein paar Kommentare in deinen Code geschrieben, siehe Anhang. Wenn du absolut nicht mehr weiter weißt, ich habe auch eine funktionierende und recht saubere Lösung hier. Sag dann einfach Bescheid und ich lade die auch hoch.
 
Zuletzt bearbeitet:
AW: Problem mit den Funktionen bei C++

1. Das eigentliche Problem meiner letzten Frage war also, dass ich nur = anstatt == geschrieben habe.....da wär ich nich draufgekommen, ich dachte das wäre nur bei strings nötig.

2. Ich werde jetzt mal probieren das Programm entsprechend deiner Tipps umzuschreiben, da arbeite ich mich noch mal in die Rückgabewerte von Funktionen ein, habe mich bisher immer davor gedrückt.

3. Danach habe ich vor noch ne Punkteliste zu Implmentieren , so vielleicht mit vergleichsdatei oder verschlüsselung, damit niemend einfach einen Wert in der Liste ändert (eigentlich nur zur Übung und zum Spaß an der Freude)

4.Danach - das wo ich immer gescheitert bin - das gante in eine clr Anwendung zu übertragen .

Werde jetzt mit dem Überarbeiten erstmal etwas länger brauchen, da noch ein paar Arbeiten anstehen, ich meld mich aber dann wieder.

Bis hierhin schonmal vieln Dank ! :daumen:
 
Zurück