2014-11-05 2 views
-3
#include <iostream> 
#include <math.h> 
#include <stdio.h> 
#define column 3 
#define row 3 
#define share 3 

int matrix_multiplication(int left_matrix[][column], int right_matrix[][column], int result_matrix[][column], int rows, int cols, int shared); 

int A[][3] = { 
    {1, 2, 3}, 
    {4, 5, 6}, 
    {7, 8, 9} 
}, 
B[][3] = { 
    {1, 2, 3}, 
    {4, 5, 6}, 
    {7, 8, 9} 
}, C[3][3]; //initialize "hard coded" three matrices 

int main() { 
    matrix_multiplication(A, B, C, row, column, share); //passes address of each matrix to function 
    return 0; 
} 

int matrix_multiplication(int left_matrix[][column], int right_matrix[][column], int result_matrix[][column], int rows, int cols, int shared) { 
    int i, j, k; 

    for (i = 0; i < 3; i++) { 
     for (j = 0; j < 3; j++) {//stays within first column and row through first iteration 
      for (k = 0; k < 3; k++)//ensures inner dimensions match with variable k i.e. ixk * kxj =ixj or A*B=C 
       result_matrix[i][j] += right_matrix[i][k] * left_matrix[k][j]; //C programming has ability to perform matrix multiplication 
      //Adds result of each operation to C matrix i.e. += 
      printf("%d\t", result_matrix[i][j]); //matrix C is composed of rows(i) and columns(j) 
     }//new tab after each column iteration 
     printf("\n"); //new line for each row iteration 
    } 
    return 0; 
} 

Этот код является хорошим примером прохождения многомерных массивов к функции с использованием указателей и печати многомерных массивов после того, как mutliplication. Существует несколько способов указания указателей на компилятор. Я рекомендую увидеть «Правильный способ передачи 2-мерного массива в функцию». например:Передача двумерного массива в функцию в C

/*void display(int (*p)[numcols],int numRows,int numCols)//First method// 
void dispaly(int *p,int numRows,int numCols) //Second Method// 
void dispaly (int p[][numCols],int numRows,int numCols) //Third Method*/ 
+0

Двумерный массив - это 'int **', а не 'int *'. Какую ошибку вы получаете по линии умножения? –

+3

@JasonBaker Нет, 'int **' не является ** 2d ** массивом, это массив указателей. – d3L

+1

Вы не можете передавать 2d массивы через параметры в c или C++ в качестве простого параметра 'int arr [] []'. – Jay

ответ

1

Удалить переменную column, и добавить выше matrix_multiplication объявление функции:

#define column 3 

(Вы также можете переименовать column в COLUMNS.)

В C++ вам также может сделать это:

static const int column = 3; 

или, в C++ 11:

constexpr int column = 3; 

Идея всего этого является то, что все, кроме самого первого размер многомерного массива должно быть известно во время компиляции.


Чтобы исправить ошибку expected primary-expression before ']' token", изменить свое внутреннее назначение на что-то вроде этого:

result_matrix[i][j] += right_matrix[i][k] * left_matrix[k][j]; 

Также вы должны инициализировать result_matrix с 0s первым.


удалить также * из int *result_matrix[][column].

Большинство современных компиляторов отображают предупреждения, если вы передаете int вместо int*. Включите все предупреждения в своем компиляторе, перекомпилируйте, исправьте их и обновите свой вопрос, указав, что код примера компилируется без предупреждения.


Чтобы напечатать элемент матрицы, вы должны указать, какой элемент вы хотите напечатать:

printf("%d\t", result_matrix[i][j]); 

Я не могу поверить, что ваш компилятор не отображает предупреждение, когда вы опустили [i][j]. Предупреждения для вас: они указывают на возможные ошибки в вашем коде.

+0

Возможно, я не следую, я уже удалил переменную столбца и заменил ее директивой #define column 3 выше оператор прототипа функции. –

+1

'int * result_matrix [] [column]' также неверно, и 'printf ("% d \ t ", result_matrix);' смелый, но обреченный на провал. –

+0

Это была int * result_matrix [] [column]. Не могу поверить, что я пропустил это. 3X3 правильно печатает новую строку printf, но все значения - 4223008 в массиве 3X3. –

Смежные вопросы