Problem mit 2d Array und pointern



  • Guten Tag 🙂
    Ich hab folgendes Problem:
    Ich soll im Zuge des Geusschen Eliminierungsverfahren ein Programm schreiben.
    Laut Sedgewick ist es am sinnvollsten dazu eine Matrix zu benutzen. Da ich unter zeitdruck stehe und es eh nicht so dick habe mit dem programieren :-x hab ich mir schnell eine Funktion besorgt die eine Matrix initialisiert und mir einein pointer zurückliefert genau wie ich es haben will:

    matrix.h

    double **initMatrix( unsigned int, unsigned int);
    void freeMatrix( double **);
    

    mein Programm in halbgekürzter Form ^^

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include "matrix.h"
    
    double **initMatrix ( unsigned int Zeilenzahl, unsigned int Spaltenzahl)
    {
      double **Matrix, *p; 
      int i;
    
                /* Zeiger auf Feld von Zeigern ( Zeilen )*/
      Matrix = ( double **) malloc
                          ( sizeof( double*) * Zeilenzahl);
    
                                   /* Zeiger auf Matrix, */
               /*zeilenweise hintereinander abgespeichert*/
      Matrix[0] = ( double *) malloc
             ( sizeof( double) * Zeilenzahl * Spaltenzahl);
    
                                   /* Zeiger auf 2.Zeile */
      p = Matrix[0] + Spaltenzahl;
                    /* Eintrag der Zeiger auf die Zeilen */
      for( i = 1; i < Zeilenzahl; i++, p += Spaltenzahl)
        Matrix[i] = p;
    
      return Matrix;
    }
    
    void freeMatrix( double **Matrix)
    { 
      free( *Matrix); 
      free( Matrix); 
    }
    
    main()
    {
    
      unsigned int numunknown, row, column, i,j,t;
      double **matrix;
    
      //Einlesen des linearen GLS
      printf("Bitte geben sie die Anzahl der unbekannten an!\n");
      scanf("%u",&numunknown);
    
      row=numunknown;       //Anzahl Zeilen der Matrix
      column=numunknown+1;  //Anzahl Spalten der Matrix
      matrix=initMatrix(row,column);
    
      printf("Bitte geben sie von links nach rechts und von oben nach unten\n");
      printf("die Faktoren der %u Variablen Zeilenweise und mit\n",numunknown);
      printf("Leerzeichen getrennt, ein.\n");
      for(i=0; i!=row; ++i)
      {
        for(j=0; j!=column; ++j)
        {
          scanf("%f",matrix[i][j]);
        }
        printf("\n");
      }
      system("pause");
    }
    

    ich bin mir eigentlich recht sicher das der zugriff auf das Feld auf die Art und Weise richtig ist (steht so ähnlich sogar auf der ursprünglichen Seite)
    Doch nach der Eingabe der ersten Zeile der Matrix wirft mir Windoof ein Adsress fehler.

    Kann mir das jmnd erklären bitte ?

    Vielen Dank 🙂



  • du schreibst

    p = matrix[0] + spaltenanzahl
    

    dabei hast matrix[0] als pointer.
    was versuchst du damit zu erreichen

    wenn ich mich nicht irre, bemächtigst du dcih selbstständig pointern (for-schleife), die dann missbrauchen willst.
    windows rückt diese pointer aber nicht freiwillig raus, d.h. du kannst nicht frei addressen wählen. dazu nutzt man malloc



  • also wie gesagt die initMatrix und die matrix.h hab ich von einer Uni-Seite das ist zwar kein garand für die richtigkeit ... aber denke eigentlich schon das dasfunktionieren sollte..
    wie gesagt ich selbst wüsste nicht wie man so eine Matrix initialisiert :-x



  • der code von der uni ist absolut mies. CamelCase ist imho einfach pervers und was die da mit der initialisierung der zeilenpointer anstellen ist einfach nur daemlich. ich kann nur hoffen, dass kein professor sowas geschrieben hat.
    meine version des matrixcodes von dieser uni...

    double **initmatrix(unsigned int zeilen, unsigned int spalten)
    {
    	double **matrix, *p; 
    	int i;
    
    	// speicher fuer die zeilenpointer
    	matrix = malloc(sizeof(double*) * zeilen);
    
    	// speicher fuer die eigentliche matrix
    	p = malloc(sizeof(double) * zeilen * spalten);
    
    	for(i = 0; i < zeilen; ++i)
    		matrix[i] = p + i*spalten; // laesst jeden zeilenpointer auf seinen bereich in der matrix zeigen
    
    	return matrix;
    }
    
    void freematrix( double **matrix)
    { 
    	free(*matrix); // eigentliche matrix
    	free(matrix); // zeilenpointer
    }
    


  • ich verlass mich mall auf dich und übernehm das einfach 🙂
    und guck gleich mal ob sich mein fehler damit erledigt hat ... danke schonmal

    hmm .. das sich die windoof commandline beim einlesen der ersten zeile aufhängt mit addressfehler bleibt leider trotzdem :-\



  • mach das:

    scanf("%f", **&**matrix[i][j]);



  • haha wie dumm .. das hatte ich doch schonmal probiert !! ...
    jetzt gehts 🙂 besten dank !!!11 👍 😃

    Also beim einlesen gibts jezz keine Fehler mehr .. doch trotzdem haut er mir bei der ausgabe nicht die eingegeben Zahlen aus sondern irgendwas ... mit verdammt vielen Nullen ^^

    printf("Bitte geben sie die Anzahl der Unbekannten an!\n");
      scanf("%u",&numunknown);
    
      row=numunknown;       /*Anzahl Zeilen der Matrix 
                              nur von 0 bis row-1 */
      column=numunknown+1;  /*Anzahl Spalten der Matrix
                              nur bis column-1 also bis numunknown*/
      matrix=initMatrix(row,column);
    
      printf("Bitte geben sie von links nach rechts und von oben nach unten\n");
      printf("die Faktoren der %u Variablen Zeilenweise und mit\n",numunknown);
      printf("Leerzeichen getrennt, ein.\n");
      for(i=0; i!=row; ++i)
      {
        for(j=0; j!=column-1; ++j)
        {
          scanf("%f",&matrix[i][j]);
        }
        printf("\n");
      }
      printf("Bitte geben sie den Loesungsvektor wie oben beschrieben an!\n");
      for(i=0; i!=row; ++i)
      {
        scanf("%f",&matrix[i][column-1]);
        printf("\n");
      }
    
     //Ausgabe des linearen GLS
      printf("Es folgt die Ausgabe des GLS in Matrixschreibweise:\n");
      for(i=0; i!=row; ++i)
      {
        printf("(");
        for(j=0,t=1; j!=column-1; ++j,++t)
        {
          printf("%.2f",(double)matrix[i][j]);
          if(t!=numunknown) printf("\t");
        }
        printf(")");
        printf("\t(x%d)",i+1); //Variablenvektor
        printf(" = (%.2f)",(double)matrix[i][column-1]); //Lösungsvektor
        printf("\n");
      }
    

    nur wieso ?



  • hilfe :>



  • probier mal %lf fuer ueberall, wo du mit doubles zu tun hast. koennte funktionieren.

    allein vom anschauen ist mir am code nichts aufgefallen. versuchs mal mit nem debugger oder lass dir ein paar variablen mit nem printf ausgeben.



  • ihr habt eindeutig zuwenig smilies .. ich brauch jezz ein was sich mit nem hammer auf den kopf schlägt oder so ...
    http://www.smilieworld.net/smilies/kranke_smilies/krank3.gif
    wie in 3 teufelsnamen machst du das ^^ ich find %lf nichtmal irgendwo bei google oder in meinen komischen c/c++ Büchern .. was macht das bitte ?!?!?

    naja werde wohl die double werte in floats umändern ... :-x





  • @c-rackwitz ich habe eine Frage zu der 7. Zeile deines Codes (bin gerade dabei mir C für Mikrocontroller Programmierung anzueignen): Wieso wird in der Klammer von sizeof ein * hinter den Datentyp geschrieben?

    Ich finde aktuell leider keine Erklärung dazu 😞 und würde mich über ein Feedback sehr freuen 🙂



    1. Es wird nicht gern gesehen, Threads von vor über 10 Jahren wiederzubeleben. Stelle deine Frage doch einfach neu.
    2. Es handelt sich nicht um ein 2d-Array, sondern um ein Array von Pointern auf Arrays¹. Wichtig ist, dass dein Array also Pointer enthält. Somit musst du Speicher für sizeof(pointer)*anzahl_elemente reservieren.

    ¹ ok, es sind genau genommen gar keine Arrays, sondern Pointer auf dynamisch reservierten Speicher


  • Mod

    Was @wob gesagt hat. Ich mache hier zu, aber lasse die Beiträge stehen, damit du die Antworten sehen kannst. Wenn Nachfragen bestehen: Neuer Thread. Und zwar vorzugsweise so, dass man den neuen Thread verstehen kann, ohne erst einen 13 Jahre alten anderen Thread lesen zu müssen. Du darfst davon ausgehen, das keiner der Nutzer aus diese Thread nach so langer Zeit noch aktiv sind, also spar es dir, sie persönlich anzusprechen.


Anmelden zum Antworten