2013-03-27 3 views
0

3 개의 행렬, 두 개의 행렬 및 결과 행렬을 전달하여 두 행렬을 더하는 함수를 작성하려고합니다. 구조체를 가진 행렬을 나타냅니다. 여기 내 코드가구조체에 대한 포인터를 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 *'입니다. 따라서 두 개의 인덱스를 사용할 수 없습니다. 대신에 ...'-> data [ii * m1-> columns + jj]'를 사용해야합니다. –

+0

사실. 나는 고칠 것이다. –

+0

도와 주셔서 감사합니다. 지금 행과 열 수표를 추가 할 것입니다. 그게 어려운 부분이기 때문에 먼저 포인터 작업을 먼저하고 싶었습니다. – Elena

관련 문제