Hallo,
Hab jetzt das 5te Kapitel über arrays und Strukturen durch, und wollte, um bisher Gelerntes zu festigen, ein kleines Programm zur "Verwaltung" einer Dvd Sammlung schreiben.
Das Problem ist das wenn ich jetzt die Auswahl tätige "Neue DVD hinzufuegen", das Programm sich in einer Endlosschleife aufhängt.
Teilweise hatte ich sogar das Problem dass das Programm nicht einmal mehr beendet werden konnte, bzw. der Prozess.
Hier einmal der Code:
|
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#include <iostream>
using namespace std;
// Hauptfunktion
int main()
{
// Strukturen
struct S_DVD
{
char Name[30];
char Lagerort[50];
bool bSet; // legt fest ob die DVD bereits besetzt ist
};
const int Groeße=10;
S_DVD Sammlung[Groeße]; // Sammlung bietet Platz für 10 DVDs
int Frei; // Wieviel Dvds können noch hinzugefügt werden?
// Für die MenueAuswahl
int Auswahl=0;
// Initialisiere Sammlung
for(int i=0;i<Groeße;i++)
Sammlung[i].bSet=false;
do
{
// Ausgabe des Menue
cout << ". . . DVD - Sammlung v.1.0 . . .\n\n";
cout << "1 - Neue DVD hinzufuegen" << endl;
cout << "2 - Sammlung anzeigen" << endl;
cout << "3 - Programm beenden" << endl;
cout << "Auswahl: ";
cin >> Auswahl;
cout << endl;
switch(Auswahl)
{
// Neue DVD
case 1:
{
Frei=0;
int Pos=0; // Der Index des letzten freien Elements wird hier abgespeichert
// Alle Elemente von Sammlung werden durchlaufen
// Es wird nach freien Plätzen gesucht
for(int i=0;i<Groeße;i++)
{
// Element noch frei?
if(!Sammlung[i].bSet)
{
// Letzter freier Platz wird genommen
Pos=i;
Frei++;
}
}
cout << "\nName der DVD: ";
cin.get(Sammlung[Pos].Name, 29);
cout << "Lagerort der DVD: ";
cin.get(Sammlung[Pos].Lagerort, 49);
cin.ignore();
cout << "Es sind noch " << Frei << " Plaetze frei" << endl;
} break;
// Sammlung anzeigen
case 2:
{
} break;
// Programm beenden
case 3:
{
cout << "Programm wird beendet..." << endl;
} break;
default:
cout << "Falsche Eingabe! \n";
}
} while(Auswahl != 3);
return 0;
}
|
Ich habe bewusst auf Funktionen verzichtet da es ich es so klein wie möglich halten wollte.
Also zu diesem case-Rumpf:
Es wird innerhalb des Arrays Sammlung nach noch nicht besetzten Feldern gesucht,
Die Anzahl an freien Feldern wird analog dazu mitgezählt und der Indexwert des letzten freien Elements(was in diesem Fall 9 ist, es sind ja alle noch unbesetzt)
wird der Variable Pos zugewiesen.
Ich weiß jetzt einfach nicht was das Problem ist, eigentlich müsste es ja funktionieren? Oder vertragen sich die 2 char Variablen in der Struktur nicht? Hab ich irgendetwas nicht beachtet?
Ich habe mir testweise die Groesse von Sammlung[0].Name ausgeben lassen und die war natürlich 30;
aber als ich den String des char arrays dann ausgab also cout << Sammlung[0].Name; wurden mir viel mehr als 30 Zeichen angezeigt
Auch habe ich das array 30 mal durchlaufen lassen und Leerzeichen zugewiesen also:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
for(int i=0;i<30;i++)
{
Sammlung[0].Name[i]=' ';
}
cout << "String: " << Sammlung[0].Name<<endl;
|
Als Ausgabe kamen die 30 Leerzeichen und die 50 (kryptische Zeichen) des char arrays Lagerort?
Also er hat mir die nicht initialisierte Sammlung[0].Lagerort mitausgegeben;
Ich weiß jetzt echt nicht genau was ich falsch mache?
Bitte um einen Tipp
mfg
Daniel