Spielfeld mit unbegrenzter Höhe (dynamisch)

Joseph97

Grünschnabel
Hallo,
ich möchte ein Spielfeld mit 10 spalten und unbegrenzter Höhe in c programmieren.
hier ist mein code
Code:
typedef struct spielfeld{
//bin mir nicht sicher ob das richtig ist..
 int zeilen;
 int spalten;
 char **feld;
}spielfeld

spielfeld *create (){
    spielfeld *sf = malloc(sizeof(spielfeld));
    sf->spalten   = 10;
    .......         //was soll ich hier eingeben, damit die Zeilen dynamisch wachsen können

}

Also mein Ziel ist einfach nur, dass ich ein Spielfeld mit 10 Spalten, und beliebig viele Zeilen habe.
ich würde mich sehr freuen, wenn mir jemand helfen würde, mein code zu korrigieren oder zu vervollständigen.
Liebe Grüße.
 

Sempervivum

Erfahrenes Mitglied
C++ ist nicht mein Schwerpunkt aber dies schreit geradezu nach einem objektorientierten Ansatz: Das Spielfeld ist ein Objekt und wird im Konstruktor erzeugt. Dann gibt es eine Methode add, die jeweils eine Zeile hinzu fügt. Je nach Semantik können die Zeilen dann auch wieder Objekte sein und es kann weitere Methoden geben um den Ablauf des Spiels zu realisieren.
 

ComFreek

Mod | @comfreek
Moderator
@Sempervivum Steht im Originalpost nicht, dass C verwendet wird? Aber wenn C++ verwendet wird, sind rohe Pointer und malloc ein absolutes Nogo :)

@Joseph97 Was du brauchst ist eine Datenstruktur für ein dynamisch wachsendes Array. Dafür gibt es verschiedene Namen und Ausprägungen, aber im Allgemeinen läuft sowas unter den Namen "dynamic array", "list", "vector" in den gängigen Programmiersprachen. C bietet keine Standardimplementierung von irgendeiner dieser an. Deswegen musst du selbst Hand anlegen und das nachbauen.
Ad-hoc könntest du das zum Beispiel wie folgt tun:

C:
// missing return value check
// made sf a const pointer, you don't want to modify *the pointer* (not the contents it points to) anyway
// through the rest of the function create
spielfeld * const sf = malloc(sizeof(spielfeld));

// just some default values (ideally extract into constants -- magic numbers are an antipattern)
sf->spalten = 10;
sf->zeilen = 10;

// missing return value check
sf->feld = malloc(sizeof(**(sf->feld)) * sf->spalten * sf->zeilen);
Es gibt verschiedene Wege zweidimensionale Daten (wie die Felddaten) in einem eindimensionalen Speicher (das Speichermodell von C und von vielen Betriebssystemen) zu speichern. Kennst du diese? Weißt du, welcher sich hier besonders eignet?

Eine dieser Wege macht es sehr einfach eine Zeile hinzuzufügen. Dafür musst du einen neuen, größeren Speicher allokieren, die alten Daten rüberkopieren, den alten Speicher freigeben und dann den Pointer sf->feld einfach umsetzen.
 

Joseph97

Grünschnabel
@Sempervivum @ComFreek erstmal vielen Dank euch für die Antworten.

ich habe gerade mit deinem Code, das da oben steht versucht, den Speicher zu allokieren, jedoch habe wieder einen Speicherzugriff-Fehler bekommen. Außerdem habe ich mein code vom ersten Beitrag so vervollständigt

Code:
spielfeld *create (){
    spielfeld *sf = malloc(sizeof(spielfeld));
    sf->spalten   = 10;
    sf->zeilen    = 10;
    sf->feld      = malloc(sizeof(char*) * sf->zeilen);
    for(int i = 0; i< sf->zeilen ;i++){
        sf->feld[i] = malloc(sizeof(char) * sf->spalten);
    }

}

da habe aber auch Fehlermeldung bekommen.. Speicherzugriffsfehler (Speicherabzug geschrieben).woran könnte das liegen?
lg,
 

ComFreek

Mod | @comfreek
Moderator
Du sagst nicht, wo genau du den Speicherzugriffsfehler bekommst. Valgrind könnte dir da helfen. Der Code sieht erst einmal funktionsfähig aus.