dynamische 2d matrix, code korrigieren bitte



  • z. 5 und 62 sollten schon erstmal gleich sein, und das array würd ich dann auch gleich als "int **" übergeben und das "%i" hab ich jetzt auch nicht in erinnerung und würd da eher "%d" nehmen, kann aber sein das ich da falsch lieg?

    was bekommst du für ne fehler meldung?

    lg lolo



  • sry kpl. wieso das 2x gepostet wurde, ist mir sehr peinlich:(



  • Hallo,

    ich habe das in Zeile 5 jetzt korrigiert, es kommt aber noch immer nicht das raus was ich will. Irgendwie krieg ich immer zufällige Zahlen in die Ausgabe. Ich habe einfach mal einen Screenshot mit Ausführung und Fehlern / Warnungen gemacht.

    http://www.bilder-space.de/show_img.php?img=edabaf-1265488758.jpg&size=original



  • hm also bei mir gehts ohne probleme?

    du hast das auch so geändert?

    int Ausgabe(int zeileA, int spalteA, int A[][spalteA])
    int Ausgabe(int zeileA, int spalteA, int **A)
    

    😕



  • mein Code schaut jetzt wie folgt aus:

    #include <stdio.h>
    #include <stdlib.h>
    
    int matrixA();
    int Ausgabe(int zeileA, int spalteA, int A[][spalteA]);
    
    int main()
    {
    
        printf("\tMatrixMultiplikation v.1.0\n\n");
        printf("Bitte Groesse der Matrix A eingeben:\n");
    
        matrixA();
    
        system("PAUSE");
        return 0;
    
    }
    
    int matrixA()
    {
        int i;
        int y;
    
        int spalteA;
        int zeileA;
    
        int **matrixA;
    
        printf("Zeilen A:");
        scanf("%i",&zeileA);
        getchar();
    
        printf("\nSpalten A:");
        scanf("%i",&spalteA);
        getchar();
    
        matrixA = (int**) malloc(zeileA * sizeof(int*));
    
        for (i=0; i<zeileA; i++)
        {
            matrixA[i] = (int*) malloc(spalteA * sizeof(int));
        }
    
        printf("Werte bitte zeilenweise eingeben!\n");
    
        for (i=0; i<zeileA; i++)
        {
            printf("\nZeile %i:",(i+1));
    
            for (y=0; y<spalteA; y++)
            {
            scanf("%i",&matrixA[i][y]);
            }
        }
    
        Ausgabe(zeileA, spalteA, matrixA);
    
        return 0;
    }
    
    int Ausgabe(int zeileA, int spalteA, int A[][spalteA])
     {
        printf("\nAusgabe der Matrix A \n");
    
        int i,y;
    
        for (i=0; i<zeileA; i++)
        {
            printf("\nZeile %i:",(i+1));
    
            for (y=0; y<spalteA; y++)
            {
            printf("( %i )",A[i][y]);
            }
        }
        printf("\n\n");
        return 0;
     }
    

    komischer Weise will er jetzt nur noch Zeilen und Spalten einlesen, nach den Einträgen fragt er nicht mehr und ausgeben tut er erst recht nichts....



  • ich bin überfragt...



  • danke dir trotzdem, denn einen Fehler konnten wir ja ausbessern 😉 außerdem heißt das für mich, dass ich zumindest keinen allzu groben Schnitzer habe 😃



  • 👍



  • Die Signatur

    int Ausgabe(int zeileA, int spalteA, int A[][spalteA]);
    

    ist falsch.

    Richtig wäre:

    int Ausgabe(int zeileA, int spalteA, int** A);
    

    😉



  • herzlichen dank, genau das war der Fehler! Jetzt bin ich aber dennoch verwirrt, denn ich hatte folgendes gefunden gehabt:

    http://openbook.galileocomputing.de/c_von_a_bis_z/011_c_arrays_009.htm#mj556ba85ff5cddc85b2f38765b20c2288

    und dem wollte ich das ein wenig nachempfinden...wieso hat das dort geklappt, bei mir aber nicht?

    /* md_array3.c */
    #include <stdio.h>
    #include <stdlib.h>
    #define DIM1 5
    #define DIM2 5
    
    void function(int feld[][DIM2], int dim1) {
       int i, j;
    
       for(i = 0; i < dim1; i++) {
          for(j = 0; j < DIM2; j++) {
             printf("%d; ", feld[i][j]);
          }
          printf("\n");
       }
       printf("\n");
    }
    
    int main(void) {
       int val[DIM1][DIM2];
       int i, j;
    
       for(i = 0; i < DIM1; i++)
          for(j = 0; j < DIM2; j++)
             val[i][j] = i+j;
    
       function(val, DIM1);
       return EXIT_SUCCESS;
    }
    

    Das ist der Beispielcode woher ich das hatte

    EDIT:

    noch ein kleines Zitat dazu:

    Da eine aufgerufene Funktion keinen Speicher für ein Array bereitstellt, muss die gesamte Größe des Arrays (erste Dimension) nicht angegeben werden – weshalb hier die (Dimension) Zeile weggefallen ist. Allerdings müssen die weiteren Dimensionen (zweite, dritte etc.), wie im Beispiel mit SPALTE, immer mit angegeben werden.



  • In deinem Testcode hast du das Array während der Laufzeit! so angelegt:

    matrixA = (int**) malloc(zeileA * sizeof(int*));
    
        for (i=0; i<zeileA; i++)
        {
            matrixA[i] = (int*) malloc(spalteA * sizeof(int));
        }
    

    Zur Compilezeit! waren die Arraydimensionen nicht bekannt. Du konntest dem Compiler keine 2.Dimension bekannt machen.
    Er hat dir die Fehlermeldung gegeben, das er für die zweite Dimension einen konstanten (bekannten) Ausdruck erwartet.
    Der Compiler arbeitet mit int** (= 2.Dimension unbekannt)

    Im Beispiel aus deinem Buch wurde das Array so angelegt:

    #define DIM1 5
    #define DIM2 5
    
    ...
       int val[DIM1][DIM2];
    ...
    

    Zur Compilezeit! sind die Arraydimensionen bekannt.
    Der Compiler kennt nun den Zeigertyp int feld[][DIM2], denn DIM2 ist eine Konstante.

    Der Compiler als Profi wählt bei Ausgaben statt int[][DIM2] die Schreibweise int(*)[DIM2] für den Zeiger.
    Du kannst es dir leichter machen indem du

    typedef int(*Ptr)[DIM2];
    

    schreibst.
    😉



  • herzlichen dank für die ausführliche erklärung!

    Wilma schrieb:

    Der Compiler als Profi wählt bei Ausgaben statt int[][DIM2] die Schreibweise int(*)[DIM2] für den Zeiger.
    Du kannst es dir leichter machen indem du

    typedef int(*Ptr)[DIM2];
    

    schreibst.
    😉

    wenn ich

    typedef int(*Ptr)[DIM2];
    

    schreibe, was passiert dann genau? ich dachte mit typedef definiere ich nur synonyme?!


Anmelden zum Antworten