Matrix in Funktionen übergeben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Matrix in Funktionen übergeben

    Hi,
    bin neu in C und würde gerne einen Gauss-Algorithmus implementieren. Leider scheitert es bereits an dem Problem, eine Matrix als 2-dimensionales Array zu ergzeugen, mit Daten zu füllen und auszugeben. Mein Code sieht so aus (poste nur die Routinen, die dafür relevant sind):


    Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. double **matrix;
    4. int m,n;
    5. double** InitMatrix(int rows, int cols){
    6. double **t;
    7. int i;
    8. t=malloc(rows * sizeof(double*) + rows * cols * sizeof(double));
    9. for(i=1; i<=rows; i++)
    10. t[i]= (double*) &t[rows +cols*i];
    11. //*t[i]= (double*) t + rows +cols*i;
    12. return t;
    13. }
    14. void PrintMatrix(double **pmatrix)
    15. {
    16. int i,j;
    17. printf("\n");
    18. for(i=1; i<=m; i++)
    19. {
    20. printf("[");
    21. for(j=1;j<=n;j++)
    22. printf(" %.3f ",pmatrix[i][j]);
    23. printf("]\n");
    24. }
    25. printf("\n");
    26. }
    27. int main()
    28. {
    29. m=4;
    30. n=4;
    31. matrix=InitMatrix(m+1,n+1);
    32. matrix[1][1]=1;
    33. matrix[1][2]=2;
    34. matrix[1][3]=3;
    35. matrix[1][4]=4;
    36. matrix[2][1]=5;
    37. matrix[2][2]=7;
    38. matrix[2][3]=9;
    39. matrix[2][4]=1;
    40. matrix[3][1]=3;
    41. matrix[3][2]=8;
    42. matrix[3][3]=1;
    43. matrix[3][4]=2;
    44. matrix[4][1]=4;
    45. matrix[4][2]=6;
    46. matrix[4][3]=8;
    47. matrix[4][4]=2;
    48. PrintMatrix(matrix);
    49. free(matrix);
    50. return 0;
    51. }
    Alles anzeigen


    Das Programm wird fehlerfrei compiliert, allerdings erscheint die folgende Matrix auf dem Bildschirm:

    [ 5 2 0 0 ]
    [ 5 7 0 0 ]
    [ 3 8 0 0 ]
    [ 4 6 8 2 ]

    Offenbar werden also einige Werte korrekt übernommen, andere nicht. Ich bin mir ziemlich sicher, dass es an der Initialisierung der Matrix liegt. Da ist irgendwas falsch. Die auskommentierte Zeile hatte ich zuerst verwendet und die sollte ja eigentlich auch richtig sein oder? Mit der geht es allerdings überhaupt nicht. Dann kommt zur Laufzeit ein Fehler ("DAMAGE: after normal Block #42 at...").

    Benutze VC++6 Pro unter Win XP. Habe das Programm einem Kumpel gegeben, bei dem der Fehler angeblich nicht auftritt. Habe es dann noch einem anderen Kumpel gegeben, der hat denselben Fehler. Irgendeine Feinheit nicht beachtet, die compilerabhängig unterschiedlich behandelt wird???
  • Probiers mal so (Indizes sind immer 0-based!):

    Quellcode

    1. #include <stdlib.h>
    2. #include <stdio.h>
    3. void SetValue(double** pmatrix, unsigned int row, unsigned int col, double d)
    4. {
    5. pmatrix[row][col] = d;
    6. }
    7. double GetValue(double** pmatrix, unsigned int row, unsigned int col)
    8. {
    9. return pmatrix[row][col];
    10. }
    11. double** InitMatrix(unsigned int rows, unsigned int cols)
    12. {
    13. // allocate all rows
    14. double** t = (double**) malloc(rows * sizeof(double*));
    15. // allocate all columns for each row
    16. for (unsigned int r = 0; r < rows; ++r)
    17. {
    18. t[r] = (double*) malloc (cols * sizeof (double));
    19. // set the initial value
    20. for (unsigned int c = 0; c < cols; ++c)
    21. SetValue (t, r, c, 0.0);
    22. }
    23. return t;
    24. }
    25. void PrintMatrix(double** pmatrix, unsigned int rows, unsigned int cols)
    26. {
    27. unsigned int r,c;
    28. printf("\n");
    29. for(r=0; r<rows; r++)
    30. {
    31. printf("[");
    32. for(c=0;c<cols;c++)
    33. printf(" %.3f ",GetValue (pmatrix, r, c));
    34. printf("]\n");
    35. }
    36. printf("\n");
    37. }
    38. void FreeMatrix (double** pmatrix, unsigned int rows)
    39. {
    40. unsigned int r;
    41. for (r = 0; r < rows; ++r)
    42. free (pmatrix[r]);
    43. free (pmatrix);
    44. }
    45. int main()
    46. {
    47. unsigned int r=4;
    48. unsigned int c=4;
    49. double** matrix=InitMatrix(r,c);
    50. SetValue (matrix, 0, 0, 1);
    51. SetValue (matrix, 0, 1, 2);
    52. SetValue (matrix, 0, 2, 3);
    53. SetValue (matrix, 0, 3, 4);
    54. SetValue (matrix, 1, 0, 5);
    55. SetValue (matrix, 1, 1, 7);
    56. SetValue (matrix, 1, 2, 9);
    57. SetValue (matrix, 1, 3, 1);
    58. SetValue (matrix, 2, 0, 3);
    59. SetValue (matrix, 2, 1, 8);
    60. SetValue (matrix, 2, 2, 1);
    61. SetValue (matrix, 2, 3, 2);
    62. SetValue (matrix, 3, 0, 4);
    63. SetValue (matrix, 3, 1, 6);
    64. SetValue (matrix, 3, 2, 8);
    65. SetValue (matrix, 3, 3, 2);
    66. PrintMatrix(matrix, r, c);
    67. FreeMatrix(matrix, r);
    68. return 0;
    69. }
    Alles anzeigen


    Das ganze solltest du aber lieber in C++ machen :)
  • In C++ könnte das ganze so aussehen:

    Quellcode

    1. #include <stdlib.h>
    2. #include <stdio.h>
    3. #include <assert.h>
    4. template <class T>
    5. class Matrix
    6. {
    7. private:
    8. const size_t m_rows, m_cols;
    9. T** m_values;
    10. public:
    11. Matrix (size_t rows, size_t cols)
    12. : m_rows (rows),
    13. m_cols (cols)
    14. {
    15. // allocate all rows
    16. m_values = (T**) malloc (m_rows * sizeof(T*));
    17. // allocate all columns for each row
    18. for (size_t r = 0; r < m_rows; ++r)
    19. m_values[r] = (T*) malloc (m_cols * sizeof (T));
    20. }
    21. virtual ~Matrix ()
    22. {
    23. for (size_t r = 0; r < m_rows; ++r)
    24. free (m_values[r]);
    25. free (m_values);
    26. }
    27. void setValue (size_t row, size_t col, const T& aValue)
    28. {
    29. assert (row < m_rows && col < m_cols);
    30. m_values[row][col] = aValue;
    31. }
    32. const T& getValue (size_t row, size_t col)
    33. {
    34. assert (row < m_rows && col < m_cols);
    35. return m_values[row][col];
    36. }
    37. void print ()
    38. {
    39. size_t r,c;
    40. printf("\n");
    41. for(r=0; r < m_rows; r++)
    42. {
    43. printf("[");
    44. for(c=0;c < m_cols;c++)
    45. printf(" %.3f ", getValue (r, c));
    46. printf("]\n");
    47. }
    48. printf("\n");
    49. }
    50. };
    51. int main()
    52. {
    53. Matrix<double> *m = new Matrix<double> (4, 4);
    54. m->setValue (0, 0, 1);
    55. m->setValue (0, 1, 2);
    56. m->setValue (0, 2, 3);
    57. m->setValue (0, 3, 4);
    58. m->setValue (1, 0, 5);
    59. m->setValue (1, 1, 7);
    60. m->setValue (1, 2, 9);
    61. m->setValue (1, 3, 1);
    62. m->setValue (2, 0, 3);
    63. m->setValue (2, 1, 8);
    64. m->setValue (2, 2, 1);
    65. m->setValue (2, 3, 2);
    66. m->setValue (3, 0, 4);
    67. m->setValue (3, 1, 6);
    68. m->setValue (3, 2, 8);
    69. m->setValue (3, 3, 2);
    70. m->print ();
    71. delete m;
    72. return 0;
    73. }
    Alles anzeigen