tutorials.de Buch-Aktion 05/2012
Like Tree7Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von random-access
  • 1 Beitrag von random-access
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
1001
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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.
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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
    Code cpp:
    1
    
    struct struktur arr[4];
    (Statt 4 irgendeine Zahl)
    Das gehört in das geändert:
    Code cpp:
    1
    
    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:
    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:
    Code cpp:
    1
    
    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ß
    üäpöol bedankt sich. 

  3. #3
    random-access random-access ist offline Mitglied Silber
    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/
    üäpöol bedankt sich. 
    Gruß, random.

    Nützliche Beiträge bitte bewerten und geschlossene Themen auch als solche markieren.

    Zitat Zitat von Artpet Beitrag anzeigen
    Das Problem ist, je mehr ich suche so verwirrt bin ich es.
    Das sagt natürlich einiges aus ;D

  4. #4
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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
     

  5. #5
    random-access random-access ist offline Mitglied Silber
    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
    üäpöol bedankt sich. 
    Gruß, random.

    Nützliche Beiträge bitte bewerten und geschlossene Themen auch als solche markieren.

    Zitat Zitat von Artpet Beitrag anzeigen
    Das Problem ist, je mehr ich suche so verwirrt bin ich es.
    Das sagt natürlich einiges aus ;D

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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?
    üäpöol bedankt sich. 

  7. #7
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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.
    üäpöol bedankt sich. 

  9. #9
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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
     

  10. #10
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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
    üäpöol bedankt sich. 

  11. #11
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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.
     

  12. #12
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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ß
    üäpöol bedankt sich. 

  13. #13
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Wow!
    Super, jetzt funktioniert alles!

    Vielen herzlichen Dank.
    Falls in nächster Zeit damit nochmal Probleme auftreten sollten, melde ich mich wieder.
     

Ähnliche Themen

  1. [C#] Mehrdimensionales Array unbekannter größe benötigt
    Von meilon im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 25.01.07, 16:16
  2. VB.Net Arrays mit unbekannter Größe
    Von Timmeey im Forum .NET Datenverwaltung
    Antworten: 5
    Letzter Beitrag: 14.11.05, 21:04
  3. Array Zuweisung bei unbekannter Größe
    Von htp im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 24.09.05, 11:57
  4. Array unbekannter Größe
    Von donjunker im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 20.09.04, 12:46
  5. Java Array unbekannter grösse
    Von dadevelopa im Forum Java
    Antworten: 2
    Letzter Beitrag: 11.08.04, 20:58

Stichworte