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.


Log in to reply