C++ struktur array mit unbekannter Größe

üäpöol

Erfahrenes Mitglied
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. :D
 
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
C++:
struct struktur arr[4];
(Statt 4 irgendeine Zahl)
Das gehört in das geändert:
C++:
struct struktur *arr;
Ohne Größenangabe.

Sobald du weißt, wieviel Spieler du hast, kommt der nächste Schritt.
Angenommen, die Anzahl steht im int spieleranz:
C++:
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:
C++:
free(arr);
Das am besten irgendwo am Ende des Programms aufrufen.
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ß
 
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
 
Hallo,

Erstmal: Ein Vektor ist eine abart einer Liste.

Code:
#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. :D

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:
[code=cpp]...dein Programm...[/code]
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. ;)

C++:
// 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:
C++:
// 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ß
 
Zuletzt bearbeitet:
Zurück