Einen schönen guten Tag,
ich habe ein paar Fragen, die mir aufgekommen sind, als ich die Aufgabenstellung in Kapitel 5 lösen wollte.
Bei mir hat sich ein heimtückischer Käfer eingeschlichen, welchen in glücklicherweise inzwischen erkannt habe (Abgleich mit der Musterlösung). Allerdings sind mir daraus weitere Fragen aufgekommen, welche ich noch nicht befriedigend beantworten konnte. Von daher dieses Posting.
In der Aufgabe geht es darum ein Spielfeld (Array, erstellt aus einer Struktur) zu erzeugen, auszugeben und einzelne Felder zu bearbeiten.
Da ich bereits gute Vorkenntnisse aus LUA habe ist mir die Lösung nicht außerordentlich schwer gefallen (Tabels ähneln Arrays sehr).
Ich zeige euch einfach einige Teile aus meinen Quelltext, benenne den Fehler und komme dann zu meinen Fragen. Dies ist wahrscheinlich unüblich, aber lässt es mir keine Ruhe, denn ich möchte gerne wissen, wie diese Fehler entsprechend zukünftig besser vermeiden und erkennen kann.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
//Ich überspringe einfach mal den Header und die Präprozessor-Befehle, diese haben nichts mit meinem Problem zu tun.
// Struktur erstellen
struct S_Feld
{
char cName[10];
bool bBelegt;
};
// Konstanten erstellen
const int Breite = 10;
const int Hoehe = 5;
// Array erstellen
S_Feld A_Feld[Breite][Hoehe];
// Es folgt ein Menü, welches die einzelnen Funktionen ansteuert.
//Besetzen() besetzt ein Feld des Arrays mit Werten
void Besetzen()
{
int x = 0;
int y = 0;
do
{
cout << "X? ";
cin >> x;
cout << endl << "Y? ";
cin >> y;
cout << endl;
} while (x < 1 || x > Breite || y < 1 || y > Hoehe);
cout << "Womit? ";
cin.ignore();
cin.get(A_Feld[x - 1][y - 1].cName, 9);
A_Feld[x - 1][y - 1].bBelegt = true;
cout << endl;
};
//Array auf default rücksetzen
void kill()
{
for (int y = 0; y < Hoehe; y++)
{
for (int x = 0; x < Breite; x++)
{
A_Feld[x][y].bBelegt = false;
A_Feld[x][y].bBelegt = "";
};
};
cout << "Geloescht!" << endl;
};
|
Den Fehler findet Ihr in Zeile 55 (blödes Copy&Paste). Sollte eigentlich ein cName werden.
Nun zu meinen Fragen:
Ich hätte es ja verstanden, wenn meine Funktion kill() Probleme erzeugen würde, allerdings hat sie dies nicht. Dafür hat meine Funktion Besetzen() vollkommen durchgedreht.
Wenn ich über das Menü die Funktion Besetzen() angesteuert habe und ungültige Werte in die while-Schleife eingegeben habe, hat sich diese ordnungsgemäß wiederholt.
Das Kuriosum: Sobald ich gültige Werte eingegeben habe hat sich diese Schleife einfach in eine Unendlich-schleife verwandelt und mir in der Konsole (cin vollständig außer Acht gelassen) "X? " endl "Y? " endl "X? "... ausgegeben. Zu Beenden nur durch ein beherztes Schließen der Konsole.
Ich habe die Funktion durchsucht und durchsucht, aber habe einfach keinen Fehler gefunden, vor allem, da eine kopierte Schleife (Auslesen des Arrays) fehlerfrei funktionierte.
Dann, weil in der kill() auch etwas nicht stimmig war habe ich mir diese angeschaut und den Fehler erkannt, behoben und schubs war auch meine Besetzen() wie durch Zauberhand repariert.
Nun meine Fragen (wird nach so viel Text auch Zeit):
- Wie entstehen Fehler in einer Funktion, die fehlerfrei ist, wenn diese nicht im entferntesten mit einer fehlerhaften Funktion interagiert? In LUA kannte ich dies so, dass entweder die gesamte Datei nicht interpretiert wurde, oder die fehlerhafte Funktion nicht arbeitete, dafür alle anderen schon.
- Wie ist das eigentlich mit den Debugging allgemein? In LUA hatte ich bei Syntaxfehlern meist den oben beschrieben Ablauf während der Laufzeit mit einer mehr oder minder aussagekräftigen Fehlermeldung. Diese finde ich unter C++ ja während des Compilierens allerdings erhielt ich keine Fehlermeldung bei meinem fehlerhaften Code. Mir ist bewusst, dass ein automatisches Tool niemals alle Fehler erkennen kann, doch scheint hier etwas schwerwiegendes schief gelaufen zu sein. Gibt es da eine Trickkiste im Compiler, die mir noch nicht aufgefallen ist?
- Eigentlich wollte ich den Wert von cName löschen. Habe aber bis jetzt nicht herausgefunden wie. In LUA wäre die Zuweisung "cName = nil". Wie sieht das in C++ aus, kann man dort Werte löschen (nil oder null bzw void helfen nicht weiter)? Im Anschluss daran habe ich versucht die Variable mit einem Leerstring zu belegen, doch "" hat nicht funktioniert, '' warf im Compiler einen Fehler. Ist dieses Vorgehen, das Löschen von Werten, egal ob global oder lokal, in C++ üblich? In LUA war dies immer ein willkommenes Mittel um z.B. mit einer Boolean 3 Möglichkeiten abzudecken (true, false oder nil) Die fehlerhafte Zeile habe ich letzten Endes entfernt.
- In LUA sind "" und '' gleichbedeutend und zugleich ein nützliches Helferchen. print("Hallo Welt!") ist gleichbedeutend mit print('Hallo Welt!'). Kann allerdings für das Konstrukt: loadstring("print('Hallo Welt!')") [loadstring führt einen string als function aus] genutzt werden. Was sind die Unterschiede zwischen '' und "" in C++?
Auf jeden Fall danke für das Lesen dieses langen Postings und ich hoffe ich habe euch nicht überrannt bzw. meine Fragen nicht uneindeutig formuliert. Leider war der ganze Text nötig um einerseits meine Problemstellung und die Beobachtung zu schildern.
Ich hoffe Ihr könnt mir helfen und mein Verständnis für C++ durch eure Antworten zu verbessern.
Herzlichen Dank
Tinsus