2013-03-27 4 views
0

Я пытаюсь написать функцию, которая добавляет две матрицы, передавая в три матрицы, две добавляемые и полученную матрицу. Я представляю матрицу со структурой. Вот мой кодПередача указателя на структуру функции в C

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
    int rows; 
    int columns; 
    double *data; 
}Mat; 

int Add(Mat *m1, Mat *m2, Mat **result); 

int main(){ 
    Mat m1,m2; 
    Mat *result = NULL; 

    m1.rows=2; 
    m1.columns=2; 
    double temp1[2][2] = {{1,2},{3,4}}; 
    m1.data = &temp1[0][0]; 

    m2.rows = 2; 
    m2.columns = 2; 
    double temp2[2][2] = {{1,1},{1,1}}; 
    m2.data = &temp2[0][0]; 

    Add(&m1,&m2,&result); 
    int ii,jj; 
    printf("\nresult\n"); 
    for(ii=0;ii<2;ii++){ 
    for(jj=0;jj<2;jj++){ 
     printf("%f ",*result->data++); 
     } 
    printf("\n"); 
    } 
    printf("%d\n ",result->columns); 

return 0; 
} 


int Add(Mat *m1, Mat *m2, Mat **result) 
{ 
    int ii,jj; 
    double new[m1->rows][m1->columns]; 
    int mat_size = (m1->rows)*(m1->columns); 
    Mat *temp = malloc(sizeof(int)*2+sizeof(double)*mat_size); 
    temp->rows = 2; 
    temp->columns = 2; 

    for(ii=0;ii<(m1->rows);ii++){ 
    for(jj=0; jj<(m1->columns);jj++){ 
     new[ii][jj] = *(m1->data++) + *(m2->data++); 
    } 
    } 
    temp->data = &new[0][0]; 
    *result = temp; 

} 

Проблема я имею в конце моей главной функции, когда я пытаюсь напечатать полученную матрицу. Он просто печатает 0. Я могу правильно напечатать столбцы и строки результата, но не данные. Может ли кто-нибудь помочь? Заранее спасибо

ответ

0

В вашей функции добавления есть несколько фундаментальных ошибок. Вот исправленная версия.

void Add(Mat *m1, Mat *m2, Mat **result) 
{ 
    int ii,jj; 
    int mat_size = (m1->rows)*(m1->columns); 
    Mat *temp = malloc(sizeof(Mat));   /* Allocate the matrix header */ 
    temp->rows = m1->rows; 
    temp->columns = m1->columns; 
    temp->data = calloc(mat_size, sizeof(double));  /* Allocate the matrix data */ 

    for(ii=0; ii<m1->rows; ii++) { 
    int row = ii*m1->columns; 
    for(jj=0; jj<m1->columns; jj++) 
     temp->data[row + jj] = m1->data[row + jj] + m2->data[row + jj]; 
     /* or something like that*/ 
    } 
     /* In any case, incrementing the data pointer is wrong */ 

    *result = temp; 
} 

Есть еще недостающие вещи. Нет никакой проверки на работоспособность, т. Е. Если размер матрицы совместим и нет проверок на ошибки распределения.

+0

'data' является' double * ', а не указателем на указатель или указателем указателя, поэтому вы не можете удалить два индекса. Вам нужно использовать ... '-> данные [ii * m1-> columns + jj]' вместо этого. –

+0

Действительно. Я починю это. –

+0

Благодарим вас за помощь. Теперь я добавлю строки и столбцы. Я просто хотел, чтобы сначала работа с указателем работала, потому что это трудная часть для меня. – Elena

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