Aufruf von "unbekannten" Funktionen
-
wenn du funktion A in Funktion B verwenden willst, muss Funktion A bereit vor dem Funktionrumpf B bekannt sein! d.h. entwededer du schreibt alle deine funktionen über der Main-funktion, weil diese ja die Funktionen kennen muss, oder du macht "forward- deklaration" der funktion, also den Funktionsprototyp (ohne rumpf) über das main..
-> Siehe @isiprimax
P.S.: deine CPU Funktion würde ich in BOT unbennen;) Und mach dein Bot bischen schlauer;)
-
Noch ein paar Anmerkungen:
char feld[2][2];ist etwas zu klein für ein Tic-Tac-Toe-Feld (die Zahlen dort geben die Größe des Feldes an und nicht den maximalen Index)- anstelle deiner goto-Konstruktionen solltest du ordentliche Schleifen verwenden (ebenso würde ich wechselweise beide Zug-Funktionen aus dem Hauptprogramm heraus aufrufen)
- und 9x den selben Code zu schreiben ist auch kein guter Stil - berechne die Ziel-Indizes lieber aus den übergebenen Werten (CPU -
zufall/3undzufall%3, Human -eingabe[0]-'A'undeingabe[1]-'1') - außerdem hast du zwar eine Variable 'sieg', aber niemand prüft nach, ob die Siegbedingungen erfüllt sind (und da die Variable mit false initialisiert wird, kommst du nichtmal in die Spiel-Schleife)
- PS: globale Variablen sind böse - und system()-Aufrufe sollte man weitgehend vermeiden
-
Danke erstmal für die Antworten.
Das Problem mit den Aufrufen konnte ich tatsächlich mit Hilfe von isiprimax lösen.
Aber warum ist mein Feld zu klein?
Ich könnte natürlich ein drei Dimensionales Feld mit char feld[2][2][2] initialisieren aber zwei Dimensionen reichen doch auch oder?Ich habe schließlich für jeden Punkt ein Feld oder?
cout<<" A B C \n"; cout<<" +---+---+---+\n"; cout<<"1 | "<<feld[0][0]<<" | "<<feld[1][0]<<" | "<<feld[2][0]<<" |\n"; cout<<" +---+---+---+\n"; cout<<"2 | "<<feld[0][1]<<" | "<<feld[1][1]<<" | "<<feld[2][1]<<" |\n"; cout<<" +---+---+---+\n"; cout<<"3 | "<<feld[0][2]<<" | "<<feld[1][2]<<" | "<<feld[2][2]<<" |\n"; cout<<" +---+---+---+\n";
-
Hab die Frage selber beantworten können ...
Ist ja klar:Mit feld[2][2] wird ein Array von 0 bis 1 erstellt (2),
richtig ist es aber mit 3 Feldern:
feld[3][3]
-
Erloeser schrieb:
Ich könnte natürlich ein drei Dimensionales Feld mit char feld[2][2][2] initialisieren aber zwei Dimensionen reichen doch auch oder?
Ja, zwei Dimensionen reichen aus - aber bitte mit drei Elementen in jeder Richtung

-
CStoll schrieb:
Noch ein paar Anmerkungen:
- PS: globale Variablen sind böse - und system()-Aufrufe sollte man weitgehend vermeiden
Wieso sind globale Variablen böse?
Ps: Auch Anfänger bin.
-
Weil sie global sind
Das bedeutet letztendlich, daß die Werte zusammenhangslos in deinem Programm herumschwirren - und bei größeren Projekten niemand mehr einen Überblick hat, was wohin gehört. In vernünftigen Programmen ist es besser, mit lokalen Variablen zu arbeiten und diese notfalls als Parameter an andere Funktionen weiterzugeben.
-
Und wie Realisiere ich dann zb eine Variabele die in allen Teile des Programms haben will.
zb.: char *version = "Bla Bla v 1.0";
-
In einer seperaten Header-Datei kannst du die globalen Variablen definieren:
(bla_globals.hpp)
#ifndef BLABLA_GLOBALS_HPP #define BLABLA_GLOBALS_HPP const char* VERSION = "Bla Bla v 1.0"; #endifund dann in dein Hauptprogramm einbinden und nutzen:
(main.cpp)
#include <iostream> using namespace std; #include "bla_globals.hpp" int main(int argc, char** args) { cout << "Programm : " << VERSION << endl; return 0; }Trotzdem sollte man Globale Variablen sehr sehr sehr sparsam einsetzen. Und ich habe in meiner Anfangszeit (rückblickend) noch nie einen Grund gefunden, diese einzusetzen.
Grüße...
Heiko
-
Es gibt wenige Ausnahmen, wo man wirklich eine global verfügbare Variable sinnvoll einsetzen könnte (aus meiner Praxis fällt mir nur das "CWhateverApp theApp;" ein, das einem MFC vorsetzt) - und in den meisten Fällen bist du mit einem Singleton besser beraten.