Dynamischer Speicher



  • 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.



  • ich glaube ich habe mehrere Fehler gemacht aber versteh nicht so ganz welche.

    #include <stdio.h>
    #include <stdlib.h>
    
    #define GROESSE_FELD 4
    #define DIM_ZEILE GROESSE_FELD * 2 + 1
    #define DIM_SPALTE GROESSE_FELD * 2 + 1
    
    void spielGeruest(char **spielfeld){
     int i = 0, j = 0;
     for(i = 0; i < (DIM_ZEILE); i++){
     for(j = 0; j < (DIM_SPALTE); j++){
     if(!(i%2)){
     if(!(j%2)){
     spielfeld[i][j] = '|';
     }
     else{
     spielfeld[i][j] = '-';
     }
     }
     else{
     if(!(j%2)){
     spielfeld[i][j] = '|';
     }
     else{
     spielfeld[i][j] = 'x';
     }
     }
     }
     }
    }
    
    void ausgabeSpielfeld(char **spielfeld){
    
    int i,j;
    
        for(i=0;i<9;i++) {
                for(j=0;j<9;j++) {
                    printf(" %c ",spielfeld[i][j]);
                }
                printf("\n");
        }
    }
    
    int main () {
    
        int i;
        char spielfeld[DIM_ZEILE][DIM_SPALTE];
    
        char **Feld;
        Feld = (char**)malloc(sizeof(char*)* DIM_ZEILE);
        for(i=0;i<DIM_SPALTE;i++) {
        Feld[i] = (char*)malloc(sizeof(char)* DIM_SPALTE);
        }
    
        ausgabeSpielfeld(Feld);
    
    }
    


  • Cobain schrieb:

    ich glaube ich habe mehrere Fehler gemacht aber versteh nicht so ganz welche.

    Wie stellst du fest, dass da Fehler sind?



  • ich hab den Fehler gefunden! ich habe einfach nur vergessen die Funktionen in der main aufzurufen 😃

    Aufjedenfall Vielen Dank bei der Unterstützung ihr habt mir alle zusammen wirklich sehr weiter geholfen 👍


Anmelden zum Antworten