Dynamischer Speicher



  • vielen Dank! es funktioniert, aber eine Frage hätte ich noch.
    Wieso wird in der Zeile wo malloc angewendet wird *9*9 geschrieben ?



  • mir fällt grad auf, dass ich nun im Programm keinen 2D-Array aufweise. Das war auch eine Bedingung der Aufgabenstellung.

    Gibt es eine Möglichkeit den 2D-Array und malloc gleichzeitig zu benutzen ?



  • Cobain schrieb:

    vielen Dank! es funktioniert, aber eine Frage hätte ich noch.
    Wieso wird in der Zeile wo malloc angewendet wird *9*9 geschrieben ?

    Das sollte das Array board ersetzen. Wie groß war board nochmal?

    Und es funktioniert nur, soweit du nicht auf board zugreifst.
    board ist nur noch drin, weil du ein malloc haben wolltest.
    Schau dir die Compilerwarnungen an. Irgendwas mit "Variable board wurde deklariert aber nie benutzt"

    board (aus deinem Beispiel)ist ein Speicherblock aus 9*9 = 81 int
    Wobei die Elemente mit dem höchsten Index am schnellsten wechseln.

    int board[REIHEN][SPALTEN]; 
    ..
     board[r][s] = 5;
    

    Statt eines 2D-Arrays kannst du auch ein 1D-Array nehmen und den Index selber berechnen:

    int board[REIHEN*SPALTEN]; 
    
     board[r*SPALTEN+s] = 5;
    

    Die Speicherbelegung für jedes erlaubte r und s ist identisch zum 2D-Array.

    Statt des Arrays kannst du auch einen Zeiger auf einen per malloc beschafften Speichers nutzen.

    int *board; 
    
     board = malloc(sizeof(*board)*REIHEN*SPALTEN);
    // Test auf Erfolg fehlt
     board[r*SPALTEN+s] = 5;
    

    REIHEN und SPALTEN kannst du bei malloc auch als Variablen nehmen. Früher waren #defines üblich.



  • Cobain schrieb:

    Gibt es eine Möglichkeit den 2D-Array und malloc gleichzeitig zu benutzen ?

    malloc beruht auf Zeigern. Daher ist es kein Array.
    Ein Array ist nach der Definition in Adresse und Größe nicht mehr änderbar.

    Du kannst auch ein Array mit Zeigern auf die Zeilen machen und dessen Elementen dann jeweils Speicher per malloc zuweisen.
    Der Zugriff sieht dann wie bei einem 2D-Array aus.
    Du kannst auch gleich das Zeilen-Array durch malloc ersetzen.
    Dann hast du aber mehrere, nicht zusammenhängende Speicherblöcke

    int *board[REIHEN];  // Zeilen-Array
    // oder
    int **board= malloc(sizeof(*board)*REIHEN);
    
    for(int i = 0;i<9;i++)
    {  board[i] = malloc(sizeof(**board)*SPALTEN);
    }
    
    board[r][s] = 5
    

    Du darfst aber das free nicht vergessen.
    Für jedes malloc ein free (am Besten in umgekehrter Reihenfolge).



  • Also ist es möglich, dass ich einen char 2D-Array initialisiere und die einzelnen variablen "spalte" und "reihe" dort abspeicher, richtig ?



  • Cobain schrieb:

    Also ist es möglich, dass ich einen char 2D-Array initialisiere und die einzelnen variablen "spalte" und "reihe" dort abspeicher, richtig ?

    😕



  • ich habe soeben meinen Gedankengang umgeplant. Ich habe vor einen 2D-Array in der main zu initialisieren. Dazu die Variablen "reihe" und "spalte" in der main als int zu deklarieren. Ich möchte dann pointer an den einzelnen Variablen zu einer Funktion hinleiten die dann per for schleife variablen "bearbeiten". Dabei soll noch parallel eine andere Funktion existieren die allein die Ausgabe macht.

    Ist es möglich einen pointer von der main zur funktion hinzuleiten oder geht dies nur anders rum ?



  • Cobain schrieb:

    Ist es möglich einen pointer von der main zur funktion hinzuleiten ...

    Das ist der übliche Weg.

    Cobain schrieb:

    oder geht dies nur anders rum ?

    Anders rum geht auch.
    Dabei mußt du aber aufpassen, dass du nicht auf Speicher zeigst, der nach dem Verlassen der Funktion ungültig wird.



  • Wie einen pointer von der main zur funktion leiten?

    wenn du schreibst:

    void funktion(int *zeiger)
    {
    //mach irgendwas
    }
    
    int main()
    {
    const int anzahlzeilen=9;
    const inst anzahlspalten=9;
    
    int *variable=(int*)malloc(sizeof(int)*anzahlzeilen*anzahlspalten);
    
    funktion(variable);
    
    free(variable);
    }
    

    hast du einen zeiger an die funktion übergeben.

    wenn du dann mit einer for-schleife alle elemente nacheinander ausgeben willst schreibst du z.b.

    for(i=0;i<9;i++)//Zeilen
    {
    for(j=0;j<9;j++)//Spalten
    {
    printf("%d\n",*(board+i*spalten+j);
    }
    }
    

    maxx+x).

    alles ganz einfach 😃



  • um einen Zeiger von einer Funktion zur main zu leiten schreibst du übrigens

    [code]
    int* funktion()
    {
    int *zeiger=(int*)malloc(sizeof(int));

    return zeiger;
    }

    int main()
    {
    int *zeiger;

    zeiger=funktion();

    //mach was

    free(zeiger);

    }



  • Danke für die Tipps! Ich habe ein neues Programm angefertigt und bräuchte grad etwas Hilfe dabei, wäre nett wenn man mir weiterhelfen könnte.
    Ich bin grad etwas ratlos wie ich nun den Pointer anwenden kann um meinen char 2D-Array auffüllen kann. Übrigens das Gerüst und die Ausgabe müssen beide Funktionen sein.

    Hier ist mein neuer Code

    #include <stdio.h>
    #include <stdlib.h>
    
    void Geruest() {
        int i;
        int j;
        char FELD[9][9];
    
    	for(j=0; j<9; j++) {
    
               for(i=0; i<9; i++) {
    
                    FELD[j][i];
    
                    if(i%2!=0) {
                            FELD[j][i]='|';
                    }
                    if((i%2!=0)&&(j%2==0)) {
                        FELD[j][i]='-';
                    }
                    if((i%2!=0)&&(j%2!=0)) {
                        FELD[j][i]='x';
                    }
    
               }
    	}
    }
    
    void Ausgabe() {
        int i;
        int j;
        char FELD[9][9];
    
        for (j=0; j<9; j++){
                for(i=0; i<9; i++){
                    printf("%c",FELD[j][i]);
    
                }
    
        }
    }
    
    int main() {
        char FELD[9][9];
    
        Ausgabe();
    
    	return 0;
    }
    


  • Du schreibst

    void Geruest(char FELD[9][])
    {
    //Hier soweit unverändert, bis auf die Tatsache, dass du kein lokales char FELD[9][9] hast 
    }
    
    void Ausgabe(char FELD[9][])
    {
    //Selbe Geschichte hier
    }
    
    int main()
    {
    char FELD[9][9];
    
    Geruest(FELD);
    Ausgabe(FELD);
    
    }
    

    wenn du es mit "richtigen" Zeigern machen willst, guck bisschen weiter unten, da habe ich dir erklärt, wie man array-schreibweise in zeiger-schreibweise umwandelt.



  • Ich habe es soeben versucht, aber es werden mir nun mehrere Fehler angezeigt.

    #include <stdio.h>
    #include <stdlib.h>
    
    void Geruest(char FELD[9][]) {
        int i;
        int j;
        char FELD[9][9];
    
    	for(j=0; j<9; j++) {
    
               for(i=0; i<9; i++) {
    
                    FELD[j][i];
    
                    if(i%2==0) {
                            FELD[j][i]='|';
                    }
    
                    if(i%2!=0) {
                        if(j%2==0) {
                            FELD[j][i]='-';
                        }
                        if(i%2!=0) {
                            FELD[j][i]='x';
                        }
                    }
    
               }
    	}
    }
    
    void Ausgabe(char FELD[9][]) {
        int i;
        int j;
    
        char FELD[9][9];
    
        printf("   0   1   2   3   4   5   6   7   8\n\n");
    
        for (j=0; j<9; j++){
    
                for(i=0; i<9; i++){
    
                    printf("%i  %c ",j,FELD[j][i]);
                    //printf("\n");
                }
                printf("\n\n");
        }
    }
    
    int main() {
    
        char FELD[9][9];
    
        Geruest(FELD[9][]);
        Ausgabe(FELD[9][]);
    
    	return 0;
    }
    


  • Was du da machst, ist auch falsch.

    #include <stdio.h>
    #include <stdlib.h>
    
    void Geruest(char FELD[9][]) {
        int i;
        int j;
        char FELD[9][9]; //Diese Variable existiert schon als Funktionsparameter, also weg damit
    
        for(j=0; j<9; j++) {
    
               for(i=0; i<9; i++) {
    
                    FELD[j][i];
    
                    if(i%2==0) {
                            FELD[j][i]='|';
                    }
    
                    if(i%2!=0) {
                        if(j%2==0) {
                            FELD[j][i]='-';
                        }
                        if(i%2!=0) {
                            FELD[j][i]='x';
                        }
                    }
    
               }
        }
    }
    
    void Ausgabe(char FELD[9][]) {
        int i;
        int j;
    
        char FELD[9][9]; //Diese hier auch
    
        printf("   0   1   2   3   4   5   6   7   8\n\n");
    
        for (j=0; j<9; j++){
    
                for(i=0; i<9; i++){
    
                    printf("%i  %c ",j,FELD[j][i]);
                    //printf("\n");
                }
                printf("\n\n");
        }
    }
    
    int main() {
    
        char FELD[9][9];
    
        Geruest(FELD[9][]); //richtig wäre Geruest(FELD);
        Ausgabe(FELD[9][]); //richtig wäre Ausgabe(FELD);
    
        return 0;
    }
    

    btw. hast du je nach System irgendwelchen Müll in nicht-initialisierten Variablen, Feldern, was auch immer drin stehen, weshalb ein

    for(i=0;i<9;i++)
    {
    for(j=0;j<9;j++)
    {
    FELD[i][j]=0;
    }
    }
    

    nicht verkehrt ist.



  • HansKlaus schrieb:

    void Geruest(char FELD[9][])
    

    Ne ne ne, so geht das nicht.
    Du kannst den ganz linken Index offen lassen. Alle anderen müssen bekannt sein.

    void Geruest(char FELD[][9])
    

    Warum das so ist, kannst du evtl bei https://www.c-plusplus.net/forum/p2481703#2481703 nachvollziehen.

    Cobain schrieb:

    int main() {
     
     
        char FELD[9][9];
     
        Geruest(FELD[9][]);
        Ausgabe(FELD[9][]);
     
     
        return 0;
    }
    

    Den Aufruf der Funktionen hat HansKlaus aber so nicht geschrieben.

    Auch den Scheiß mit dem lokalen Feld, das den gleichen Namen hat wie ein Parameter, kannst du nicht machen.



  • ich habe etwas weiter gemacht und der jetzige Code funktioniert und gibt mir geforderte tabelle aus. Das Problem, dass ich jetzt immer noch habe ist der Einsatz von "malloc" in meinem Code.

    #include <stdio.h>
    #include <stdlib.h>
    
    void Geruest(char FELD[9][9]) {
        int i;
        int j;
        //char FELD[9][9];
    
    	for(j=0; j<9; j++) {
    
               for(i=0; i<9; i++) {
    
                    FELD[j][i];
    
                    if(i%2==0) {
                            FELD[j][i]='|';
                    }
    
                    if(i%2!=0) {
                        if(j%2==0) {
                            FELD[j][i]='-';
                        }
                        if(j%2!=0) {
                            FELD[j][i]='x';
                        }
                    }
    
               }
    	}
    }
    
    void Ausgabe(char FELD[9][9]) {
        int i;
        int j;
    
        //char FELD[9][9];
    
        printf("   0   1   2   3   4   5   6   7   8\n\n");
    
        for (j=0; j<9; j++){
                printf("%i ",j);
    
                for(i=0; i<9; i++){
    
                    printf(" %c  ",FELD[j][i]);
                    //printf("\n");
                }
                printf("\n\n");
    
        }
    }
    
    int main() {
    
        char FELD[9][9];
    
        Geruest(FELD);
        Ausgabe(FELD);
    
    	return 0;
    }
    


  • Hier ist der Aufruf laut der gesamten Aufgabenstellung zu "malloc."

    "Der Aufbau des dynamischen Speichers soll mit malloc realisiert werden".



  • Cobain schrieb:

    ich habe etwas weiter gemacht und der jetzige Code funktioniert und gibt mir geforderte tabelle aus.

    Der Unterschied zu dem Code aus deinem Eröffnungspost ist, dass du jetzt ein char-Array hast.

    Cobain schrieb:

    Das Problem, dass ich jetzt immer noch habe ist der Einsatz von "malloc" in meinem Code.

    Wie das geht, habe ich schon geschrieben.
    Vieleicht wäre es jetzt doch mal an der Zeit, die genaue Aufgabenstellung zu zeigen.(nicht nur Auszüge)





  • Dann mach das doch, was in der Aufgabenstellung steht.

    Du musst dann nur deine 9en in den for -Schleifen durch DIM_ZEILE bzw DIM_SPALTE ersetzen.

    Nochmal langsam:

    Die #defines werden unter den #include in das Programm eingebaut.

    Da wo du in main das FELD[9][9] hast, kommt das malloc -Beispiel aus der Aufgabenstellung.
    Dann passt du noch die Parameter der Funktionen an.
    Die 9en nicht vergessen.


Anmelden zum Antworten