435,106 Members | 2,474 Online + Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,106 IT Pros & Developers. It's quick & easy.

C function multiplying matrices using dynamic allocation

 P: 1 I have the following definition Expand|Select|Wrap|Line Numbers typedef struct matrix_t {     int rows, columns;     Complex** nextElement;// TODO: Add fields }*Matrix; and I have to implement Expand|Select|Wrap|Line Numbers /**  * Performs matrix multiplication. Computes matrix1 * matrix2 and stores the  * result in a newly-created matrix.  * Usage example:  *   * int main()  * {  *      Matrix matrix1 = ...;  *      Matrix matrix2 = ...;  *      Matrix result = NULL;  *  *      matrixMultiply( matrix1, matrix2, &result );  *      // result now points to a newly  *      // created matrix that contains  *      // the product of the matrices.  *  *      ...  *      matrixDestroy( result );  *      ...  * }  *   * Generally, matrix1 * matrix2 does not equal to matrix2 * matrix1.  *  A new matrix is created, and the caller is responsible for freeing it.  * @param matrix1 - First matrix to multiply; should NOT be modified.  * @param matrix2 - Second matrix to multiply; should NOT be modified.  * @param result - A newly-created matrix that contains the result of the  * multiplication will be created, and result will point to it. (You can look at  * it as if this is how this function returns the resulting matrix)  * @return One of the following, in decreasing priority:  *      MATRIX_SUCCESS - Success.  *     MATRIX_NULL_ARGUMENT - Either matrix (or both), or result, is NULL.  *     MATRIX_BAD_DIMENSIONS - Matrices do not have compatible  *             dimensions; that is, number of columns of \p matrix1 is different  *             than the number of rows of \p matrix2.  */   MatrixResult matrixMultiply( Matrix matrix1, Matrix matrix2, Matrix* result ); and that's my buggy code so far: Expand|Select|Wrap|Line Numbers MatrixResult matrixMultiply(Matrix matrix1, Matrix matrix2, Matrix* result) {     if (matrix1 == NULL || matrix2 == NULL) {         return MATRIX_NULL_ARGUMENT;     }       if ((matrix1->columns != matrix2->rows)) {         return MATRIX_BAD_DIMENSIONS;     }     result = malloc(sizeof(struct matrix_t));     if (result == NULL) {         return MATRIX_NULL_ARGUMENT;     }       result->columns = matrix1->columns;     result->rows = matrix1->rows;       result->nextElement = (Complex**) malloc(matrix1->rows * sizeof(Complex*));     if (result->nextElement == NULL) {         free(result);         return MATRIX_NULL_ARGUMENT;     }       for (int i = 0; i < matrix1->rows; ++i) {         int acc = 0;         for (int j = 0; j < matrix2->columns; j++) {             acc = acc + (complexMultiply(matrix1->nextElement[i][j],                     matrix2->nextElement[j][i]));             while (j == matrix2->columns) {                 result->nextElement[i][j] = acc;             }         }     }       return MATRIX_SUCCESS; } I can't seem to get it to compile. Probably the whole memory allocation is amiss. What should I do? Mar 27 '11 #1 