7Danke
ERLEDIGT
JA
JA
ANTWORTEN
12
12
ZUGRIFFE
1001
1001
EMPFEHLEN
-
Hallo Forum!

Ich schreibe gerade mit VS C++ Express ein Programm.
Ich habe das Problem, dass eine Struktur mit Daten über Spieler habe. Da ich aber nicht weiß wie viele Spieler mitspielen weiß ich nicht wie groß das "Struktur-Array" sein soll. Ich hab schon ewig gesucht finde aber nicht, was mir weiter hilft.
Dieses Problem ist (für mich alleine) nicht zu lösen.
Ich hoffe ich habe mich nicht zu schlecht ausgedrückt.
Vielen Dank und schönen Abend
üäpöol
PS: Ich bin neu im Forum und lerne erst C++, deshalb seit bitte nicht zu streng zu mir.
-
Willkommen bei tutorials.de

Du erfährst also erst während der Programmausführung, wie groß dein Array sein muss?
Folgende Unterschiede sind dazu nötig:
Ich nehme einmal an, deine struct heißt struktur und das Array arr.
Zum Anlegen hast du bisher sowas geschrieben
(Statt 4 irgendeine Zahl)Code cpp:1
struct struktur arr[4];
Das gehört in das geändert:
Ohne Größenangabe.Code cpp:1
struct struktur *arr;
Sobald du weißt, wieviel Spieler du hast, kommt der nächste Schritt.
Angenommen, die Anzahl steht im int spieleranz:
Code cpp:1 2 3
int spieleranz; ... arr = (struct struktur *) malloc( (sizeof(struct struktur) * spieleranz );
Und noch ein letzer Schritt: Sobald du das Array nicht mehr brauchst, musst du das dem Betriebssystem noch mitteilen. Geht in diesem Fall (mit malloc etc) nicht automatisch.
Ist aber ganz einfach:
Das am besten irgendwo am Ende des Programms aufrufen.Code cpp:1
free(arr);
Danach darfst du jedenfalls das Array nicht mehr verwenden, das ist dann weg.
(Man kann mit malloc wieder ein neues anlegen, aber ist in dem Fall egal).
Gruß
-
22.02.11 09:44 #3
- Registriert seit
- Apr 2008
- Beiträge
- 99
Hallo,
es gibt noch eine andere Möglichkeit, dein Problem zu lösen.
Den vector.
Der Vorteil davon ist, dass du dich nichtmehr direkt um die Speicherverwaltung kümmern musst, da du nicht auf Pointer zurückgreifen musst. Wenn es dich interessiert schau dir doch einfach mal folgenden Link an.
http://www.cplusplus.com/reference/stl/vector/
-
Hallo,
erstmal danke für eure Hilfe.
Aber ich verstehe nicht wie ich das Vektoren machen soll.
Ich brauch ja einen konstanten Wert.
Und die 1. Lösung versteh ich leider auch nicht
.
Wie kann man eine Struktur benennen und dann noch ein Array "dranhängen".
Wahrscheinlich mach ich Anfängerfehler.
Ich hoffe ihr helft mir nochmal.
Viele Grüße
üäpöol
-
23.02.11 14:42 #5
- Registriert seit
- Apr 2008
- Beiträge
- 99
Hallo,
Erstmal: Ein Vektor ist eine abart einer Liste.
Code :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
#include <vector> #include "MyClass.h" int main () { //erzeugt einen leeren Vektor. std::vector<MyClass> vectorMyClassElemente; //erzeugt eine instanz deiner Klasse. MyClass spieler_a; MyClass spieler_b; //Fügt die erzeugte instanz deiner Klasse zum Vektor hinzu. vectorMyClassElemente.push_back(spieler_a; vectorMyClassElemente.push_back(spieler_b; //für alle Instanzen in diesem vector for(int vectorIndex = 0; vectorIndex < vectorMyClassElemente.size(); ++vectorIndex){ //Führe 'funktionA()' aus vectorMyClassElemente.at(vectorIndex).funktionA(); } //leere den Vector vectorMyClassElemente.clear(); }
Für alle Methoden der Klasse Vektor schaust du dir im Bestfall nochmal den oben geposteten Link an.
Für weitere Fragen stehe ich gern zur Verfügung
-
Und was meinst du mit "benennen und ein Array dranhängen"?
Der Variablenname in meinem Beispiel ist arr.
Die einzelnen Strukturen bekommst du über arr[0], arr[1], arr[2]...
Wieviel das sind, kannst wie gezeigt je nach Bedarf ändern.
Oder wolltest du was ganz Anderes wissen?
-
Hallo,
ich glaub ich hab mich zu kompliziert ausgedrückt. Ich werde mal spezieller:
Ich programmiere ein Progamm, das auslost welcher Spieler gegen welchen Spieler spielt.
Ich frage wieviele Spieler, wieviele Runden gegeneinander spielen.
Ich habe ein Struktur in der Spielername, Punktzahl und nochmal eine andere Art Punkte gespeichert werden.
Also habe ich eine Struktur namens Spielerdaten.
Ich weiß aber nicht wieviele Spieler mitspielen.
Deshalb habe ich mir überlegt ein Array dafür zu verwenden. Ich weiß aber nicht wie ich´s genau verwenden muss.
Ich hoffe ich hab mir jetzt ein bisschen klarer ausgedrückt.
Viele Grüe und vielen herzlichen Dank
üäpöol
-
Dann haben wir es schon richtig verstanden.
Du hast ein Array von dem du beim Codeschreiben noch nicht weißt, wie groß es sein soll.
Erst zur Laufzeit, wenn das Programm nach der Spieleranzahl fragt, erfährst du das.
Also, ob du jetzt den Vector oder meine malloc-Methode verwendest, ist ziemlich egal.
Bei meinem müsstest du eben statt "struct struktur" "struct Spielerdaten" nehmen und statt arr eventuell einen anderen Variablennamen, den du dir aussuchen kannst.
Wenn du deinen Programmcode einmal zeigen würdest, könnten wir dir genau sagen, was du ändern müsst.
Gruß
PS: Falls du deinen Code hier reinstellst, bitte Codetags verwenden:
[cpp]...dein Programm...[/cpp]
Das macht das Ganze leichter lesbar.
-
OK, dann mach ich das.
Wahrscheinlich wird der Code zwar Grauen eregend sein, aber ich bin ja auch erst Anfänger.
Code cpp: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
// Schweizersystem_Auslosungsprogramm.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <iostream> #include <string> #include <Windows.h> #include <vector> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { // Variablen int rundenanzahl; int spieleranzahl; // Strukturen struct Spielerdaten { string name; int elo; int punkte; int buchholz; }; // Start cout << "Ausslosungsprogramm zur Auslosung des Schweizersystems" << endl; cout << "Wie viele Spieler spielen mit? "; cin >> spieleranzahl; cout << endl << "Wie viele Runden werden gespielt? "; cin >> rundenanzahl; cout << endl << endl << endl; system("PAUSE"); Spielerdaten Spieler; for (int a = 0; a < spieleranzahl; a++) { cout << endl << endl << "Name des Spielers: " << endl; cin >> Spieler[a].name; cout << endl << "Elo des Spielers: " << endl; cin >> Spieler[a].elo; } cout << "Startrangliste:" << endl << endl << endl; Sleep(3000); // Sortierung for(int i=spieleranzahl-1; i>0; i--) { for (int j=0; j<i; j++) { if (Spieler[j].elo<Spieler[j+1].elo) { int Spieler_1 = Spieler[j].elo; Spieler[j].elo = Spieler[j+1].elo; Spieler[j+1].elo = Spieler_1; } } } for (int i=0; i < spieleranzahl; i++) { cout << Spieler[i].elo << endl; } // Ende getchar(); system("PAUSE"); return 0; }
Ich hoffe es hilft.
Viele Grüße und nochmals vielen Dank
üäpöol
-
Hier mit malloc/free:
Code cpp: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
// Schweizersystem_Auslosungsprogramm.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <iostream> #include <string> #include <Windows.h> #include <vector> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { // Variablen int rundenanzahl; int spieleranzahl; // Strukturen struct Spielerdaten { string name; int elo; int punkte; int buchholz; }; // Start cout << "Ausslosungsprogramm zur Auslosung des Schweizersystems" << endl; cout << "Wie viele Spieler spielen mit? "; cin >> spieleranzahl; cout << endl << "Wie viele Runden werden gespielt? "; cin >> rundenanzahl; cout << endl << endl << endl; system("PAUSE"); Spielerdaten *Spieler;//ÄNDERUNG Spieler=(Spielerdaten *)malloc(sizeof(Spielerdaten)*spieleranzahl);//NEUE ZEILE for (int a = 0; a < spieleranzahl; a++) { cout << endl << endl << "Name des Spielers: " << endl; cin >> Spieler[a].name; cout << endl << "Elo des Spielers: " << endl; cin >> Spieler[a].elo; } cout << "Startrangliste:" << endl << endl << endl; Sleep(3000); // Sortierung for(int i=spieleranzahl-1; i>0; i--) { for (int j=0; j<i; j++) { if (Spieler[j].elo<Spieler[j+1].elo) { int Spieler_1 = Spieler[j].elo; Spieler[j].elo = Spieler[j+1].elo; Spieler[j+1].elo = Spieler_1; } } } for (int i=0; i < spieleranzahl; i++) { cout << Spieler[i].elo << endl; } // Ende free(Spieler) //NEUE ZEILE getchar(); system("PAUSE"); return 0; }
Die Änderungen hab ich mit Kommentaren markiert.
Zwei Zeilen, da wo vorher "Spielerdaten Spieler;" stand, und eine ziemlich am Schluss.
GrußGeändert von sheel (23.02.11 um 17:23 Uhr) Grund: Ergänzung unter dem Code
-
Hallo,
leider funktioniert der Code nicht.
Funktioniert er bei euch?
Sobald ich den Spielernamen eingeben will, macht er nicht weiter und meldet Zugriffsverletzung.
Ich verzweifle noch an diesem Programm.
-
Mein Fehler. Habe übersehen, dass in der struct ein String ist
Die neuen Zeile sind nochmal geändert:
Code cpp: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
// Schweizersystem_Auslosungsprogramm.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <iostream> #include <string> #include <Windows.h> #include <vector> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { // Variablen int rundenanzahl; int spieleranzahl; // Strukturen struct Spielerdaten { string name; int elo; int punkte; int buchholz; }; // Start cout << "Ausslosungsprogramm zur Auslosung des Schweizersystems" << endl; cout << "Wie viele Spieler spielen mit? "; cin >> spieleranzahl; cout << endl << "Wie viele Runden werden gespielt? "; cin >> rundenanzahl; cout << endl << endl << endl; system("PAUSE"); Spielerdaten *Spieler;//ÄNDERUNG Spieler=new Spielerdaten[spieleranzahl];//NEUE ZEILE for (int a = 0; a < spieleranzahl; a++) { cout << endl << endl << "Name des Spielers: " << endl; cin >> Spieler[a].name; cout << endl << "Elo des Spielers: " << endl; cin >> Spieler[a].elo; } cout << "Startrangliste:" << endl << endl << endl; Sleep(3000); // Sortierung for(int i=spieleranzahl-1; i>0; i--) { for (int j=0; j<i; j++) { if (Spieler[j].elo<Spieler[j+1].elo) { int Spieler_1 = Spieler[j].elo; Spieler[j].elo = Spieler[j+1].elo; Spieler[j+1].elo = Spieler_1; } } } for (int i=0; i < spieleranzahl; i++) { cout << Spieler[i].elo << endl; } // Ende delete[] Spieler;//NEUE ZEILE getchar(); system("PAUSE"); return 0; }
new und delete machen im Prinzip das Gleiche wie malloc und free, führen aber auch Konstruktoren und Destruktoren von Klassen aus.
Gruß
-
Wow!

Super, jetzt funktioniert alles!
Vielen herzlichen Dank.
Falls in nächster Zeit damit nochmal Probleme auftreten sollten, melde ich mich wieder.
Ähnliche Themen
-
[C#] Mehrdimensionales Array unbekannter größe benötigt
Von meilon im Forum .NET DatenverwaltungAntworten: 2Letzter Beitrag: 25.01.07, 16:16 -
VB.Net Arrays mit unbekannter Größe
Von Timmeey im Forum .NET DatenverwaltungAntworten: 5Letzter Beitrag: 14.11.05, 21:04 -
Array Zuweisung bei unbekannter Größe
Von htp im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 24.09.05, 11:57 -
Array unbekannter Größe
Von donjunker im Forum VisualStudio & MFCAntworten: 2Letzter Beitrag: 20.09.04, 12:46 -
Java Array unbekannter grösse
Von dadevelopa im Forum JavaAntworten: 2Letzter Beitrag: 11.08.04, 20:58





Zitieren


Login






