Arraywert falsch sowieso "Programm wird geschlossen"[Anfaenger!]
-
Edit:
Aktuell: mein letzter Post: http://www.c-plusplus.net/forum/viewtopic-var-p-is-920978.html#920978
class schachbrett { public: enum status{BELEGT, NICHT_BELEGT}; schachbrett(){ for(int i=0; i < 8; i++) { for(int j=0; j < 8; j++) { brett[i][j] = NICHT_BELEGT; } } } // expected unqualified-id at end of input private: status brett[8][8]; }So.. wie man sieht hab ich n Array den ich schlicht und einfach im Konstruktor füllen will. Auch ein Semikolon hinter dem schließenden
};bringt den Fehler.
PS: ich wurde mich wieso ich net schon in der Header Datei den Array, sowie status füllen kann. In meinem (veralteten) Buch funzt das (also das Deklarieren im Header). So brauch ich doch dann garkein
.Achso, ich beschäftige mich mit dem Problem der Acht Damen und das ist mein erster Code dies bezüglich. :>
-
Hallo,
Am Ende der Klassen-Deklaration hast du ein Semikolon vergessen ;).Also:
class schachbrett { // ... }; // <= Hier das Semikolon.PS: ich wurde mich wieso ich net schon in der Header Datei den Array, sowie status füllen kann. In meinem (veralteten) Buch funzt das (also das Deklarieren im Header). So brauch ich doch dann garkein
.Du kannst sehr wohl im Header dein Array initialisieren. Oder was willst du damit sagen?
Gruß Caipi
-
Oh mein Gott... Danke. Das ist mir jetzt aber peinlich.
Wieso der Compiler dann nur auf ne andere Zeile verweist hmm. :>Ich will damit sagen, naja mehr fragen, für was ich die Header dann brauche, wenn ich eh alles in der cpp drin hab.
-
Die Header brauchst du, wenn dein Programm nicht nur aus einer einzigen monolithischen CPP-Datei besteht. Dann müssen schließlich auch die anderen Dateien wissen, wie deine Schachbrett-Klasse aussieht und damit du nicht immer die Deklaration komplett hinschreiben musst, inkludierst du den Header, in dem der ganze Kram drin steht.
-
Tut mir ja leid mit so'nem scheiss zu nerven, aber ihc such seit ner geschlagener Stunde den Fehler..
Beim compilen von problem_dame.cpp (der main) kommt:
[Linker error] undefined reference toSchachbrett::Schachbrett()' [Linker error] undefined reference toSchachbrett::ausgeben()'Aber wieso? ich hab se doch implementiert:
problem_dame.cpp
#include "schachbrett.h" int main() { Schachbrett schachbrett; schachbrett.ausgeben(); return 0; }Schachbrett.h
class Schachbrett { public: enum status{BELEGT, NICHT_BELEGT}; Schachbrett(); void ausgeben(); private: status brett[8][8]; };Schachbrett.cpp
#include <iostream> using namespace std; class Schachbrett { public: enum status{BELEGT, NICHT_BELEGT}; Schachbrett() { for(int i=0; i < 8; i++) { for(int j=0; j < 8; j++) { brett[i][j] = NICHT_BELEGT; } } } void ausgeben(){ for(int i=0; i < 8; i++) { for(int j=0; j < 8; j++) { std::cout << brett[i][j]; } } return; } private: status brett[8][8]; };
-
Hallo,
Sorry, aber ich glaube, das du das Konzept der Header noch nicht wirklich verstanden hast.Man splittet die meisten Klassen in einen sog. Header (Endung *.h, *.hh, *.hpp) und eine Datei, die die Implementationen beinhaltet (Endung *.cpp).
D.h. in deinem Beispiel folgendes:
// schachbrett.hpp - Das hattest du soweit richtig. class Schachbrett { public: enum status{BELEGT, NICHT_BELEGT}; Schachbrett(); void ausgeben(); private: status brett[8][8]; }; // schachbrett.cpp - Hier nur die Implementationen der Methoden. D.h. Schachbrett::Schachbrett() { for(int i=0; i < 8; i++) { for(int j=0; j < 8; j++) { brett[i][j] = NICHT_BELEGT; } } } void Schachbrett::ausgeben(){ for(int i=0; i < 8; i++) { for(int j=0; j < 8; j++) { std::cout << brett[i][j]; } } return; }Deine main-Modul ist korrekt so. Jetzt compilierst und linkst du das ganze: (Falls du den g++ verwendest, dann mit dem folgenden Aufruf:
g++ -Wall -pedantic -o schachbrett schachbrett.cpp main.cpp(Wobei deine Module dann schachbrett.cpp und main.cpp heißen müssen ;))).
Du fragst dich wahrscheinlich warum die Aufteilung in Header und Implementation?
Nun Wenn du beispielsweise in deinem Hauptprogramm ein Objekt der Klasse Schachbrett anlegen möchtest, braucht der Compiler Informationen zu selbigem. Diese Informationen bekommt er aus dem Header, den du ja per Präprozessor vor dein Hauptprogramm inkludierst. Du könntest statt der Header-inkludierung natürlich auch direkt vor die Definition eines Schachbrett-Objekts die Deklaration der Klasse Schachbrett einfügen. Allerdings müsstest du das dann in jedem Modul tun, in welchem du die Klasse Schachbrett benutzen möchtest. => Packe den ganzen Kram in einen Header und inkludiere diesen dort, wo du ihn brauchst. Die Implementations-Datei wird später dann (einmal) hinzugelinkt....Gruß Caipi
-
Dennoch kommt jetzt ein Compiler Fehler (Ich nutze Dev C++ auf Windows):
Schachbrett' has not been declared sowieNICHT_BELEGT' undeclared (first use this function)
etc.. wenn ich die schachbrett.cpp compilen will.
Der Code wie du ihn gepostet hast. Also die schachbrett.cpp Datei genau so wie oben.Edit: Ah.. ich hab nicht gewusst, dass ich die #include "schachbrett.h" ebenfalls in der cpp Datei einfuegen muss. Was eigentlich logisch istim Nachhinein.
Wenn ich jedoch die Main.cpp compilen will, kommt noch der gleiche Fehler zu beginn..
[Linker error] undefined reference to `Schachbrett::Schachbrett()'
-
Du musst entweder die .cpp's zu Objekten übersetzen, _ohne_ zu linken, weil sonst der Linker versucht auch die Klassen aufzulösen die in anderen .cpp-Dateien definiert sind:
g++ -c -o schachbrett.o schachbrett.cpp g++ -c -o main.o main.cpp g++ -o schach main.o schachbrett.oOder, wie Capipi schrieb _alle_ .cpps in einem Lauf (ohne Parameter -c) angeben:
g++ -o schach main.cpp schachbrett.cpp
-
Danke.
Wie ich schon zuvor erwähnte, ich nutze kein Linux und arbeite entsprechend nicht mit einer shell, sondern Dev-C++ auf Windows. Aber dank euch bin ich auf die Idee gekommen, die einzelnen Dateien in ein Projekt zusammenzufassen um "_alle_ .cpps in einem Lauf" zu compilieren.

Nun bin ich im Laufe des Programmieren dch auf 2 weitere Probleme gestoßen. Das Programm funktioniert soweit gut, auch wenn einiges net schön geschrieben ist (siehe class Dame - gibt's da andere möglichkeiten für eine for-Schleife einmal beim Start eine lokale Variable zu initialisieren?).
Jedoch treten 2 Fehler auf die ich mir nicht erklären kann.- Das Feld 56 bzw. 7h, d.h. brett[7,8] wird fehlerhaft angezeigt. Das Feld besitzt den unheimlichen Wert 4460608. Dabei sollten nur 0,1,2 entsprechend der enum status vorhanden sein. Der Array brett befindet sich in der Klasse Schachbrett.
Achtung! Dieser Fehler scheint(!) nur mit der Methode schachbrett.draw() aufzutreten. Also sobald die methode aufgerufen wurde, hat das Feld diesen bizarren Wert. - Nachdem ich Reihe sowie Spalte eingegeben hab und die anschließenden methoden ausgerufen werden, also draw() oder ausgeben() (je nachdem wie ausgeklammert) wird das Programm mit folgendem fehler Geschlossen:
problem_dame.ex.exe [sic!] hat einen Fehler verursacht und wird geschlossen.
Man beachte den Ausspruch ex.exe

Der Quelltext: http://paste.ubuntuusers.de/522
Hat jemand ne Idee?
Edit: ich weiß das es column heißt

- Das Feld 56 bzw. 7h, d.h. brett[7,8] wird fehlerhaft angezeigt. Das Feld besitzt den unheimlichen Wert 4460608. Dabei sollten nur 0,1,2 entsprechend der enum status vorhanden sein. Der Array brett befindet sich in der Klasse Schachbrett.
-
@dasreen: Du schreibst über die Grenzen deines Arrays hinaus! Merke: Wenn du ein Array schachbrett[8][8] definierst, dann gehen seine Indizes von 0 bis 7. D.h. der vom Stack reservierte Speicher für das Array befindet sich zwischen schachbrett[0][0] und schachbrett[7][7]. Aller Speicher, der sich hinter schachbrett[7][7] oder vor schachbrett[0][0] befindet, gehört nicht zu dem Array und wird vielleicht sogar von einem anderen Programm o.ä. verwendet. => Das kann zu sehr bösen Überaschungen führen :)...
Siehe auch in der C++-FAQ: Thread Arrays und Pointer.
Gruß Caipi
-
Manchmal frag ich mich wie solche Fehler passieren können. :>
Vielen Dank!
-
Doch schon wieder zwickt mir ein Problemchen. Ich möchte mit einer Methode den Wert von dem brett Array wieder geben. So in etwa:
Status Schachbrett::getStatus(int row, int colomn){ return brett[row][colomn]; }Doch meckert der Comipiler, dass Status kein type sei. Doch hab ich doch grad noch in der header-Datei
enum Status{NICHT_BELEGT, BELEGT, LADY};Muss ich also Status extra als class bezeichnen, um sie als Rückgabewert zu gebrauchen?
-
Schachbrett::Status Schachbrett::getStatus(int row, int colomn){ return brett[row][colomn]; }Beser so?
-
Ja, wunderbar

-
ich suche Leute die [cpp] gut können. Ich arbeiter nämlich gerade bei einer eigenen Internetplattform, meine Emailadresse ist: tolsome@gmx.de
P.S.: Sry, ich weiss das gehört jetzt net hierrein, aber ich such echt dringend Leute!
-
Gast231 schrieb:
P.S.: Sry, ich weiss das gehört jetzt net hierrein, aber ich such echt dringend Leute!
Ich liebe diese "Ausrede"
Wenn du weißt, daß es nicht hierher gehört, dann such dir doch die Stelle, wo es hingehört (etwas weiter unten gibt es ein Board "Projekte" dafür).