2015-10-18 57 views
0

我試圖添加兩個二維矩陣,我有一些麻煩我猜的指針。算法本身顯然沒有問題,但我想把它作爲返回函數,到目前爲止我發現的所有解決方案都沒有這樣做。這是我的代碼,現在,它未能在函數調用:添加二維矩陣用C

#include <stdio.h> 

float **addMatrix(float **m1, float **m2, int x, int y){ 
    float m3[x][y]; 
    int i, j; 
    for (i=0;i<x;i++){ 
     for (j=0;j<y;j++){ 
      m3[i][j]=m1[i][j]+m2[i][j]; 
     } 
    } 
    return m3; 
} 

int main(){ 
    int x=3,y=3; 
    float m1[x][y], m2[x][y]; 
    float **m3 = addMatrix(m1, m2, x, y); 
    return 0; 
} 

Warnings: 
    In function 'addMatrix': 
    [Warning] return from incompatible pointer type 
    [Warning] function returns address of local variable [-Wreturn-local-addr] 
    In function 'main': 
    [Warning] passing argument 1 of 'addMatrix' from incompatible pointer type 
    [Note] expected 'float **' but argument is of type 'float (*)[(sizetype)(y)]' 
    [Warning] passing argument 2 of 'addMatrix' from incompatible pointer type 
    [Note] expected 'float **' but argument is of type 'float (*)[(sizetype)(y)]' 
+1

二維數組不是指針指針。 – EOF

+1

請參閱[數組](http://www.cplusplus.com/doc/tutorial/arrays/),「數組作爲參數」一節。 –

+0

你得到了什麼樣的編譯器警告和錯誤?在'main()'中,你不能以這種方式重新賦值'm3'。 –

回答

2

首先,值的陣列(例如int m1[3][3])不等同於指針數組以type int(例如int **m1;)。

接着,傳遞數組給一個函數時(而不是指針類型的數組),則必須通過每個維度除了行數。 (第一個)。所以你的情況,你可以通過他們的,addMatrix (float m1[3][3]...),或通過列addMatrix (float m1[][3]...)

的數量在您嘗試在C添加任何東西,你必須初始化或一組你所加在一起的價值。當你通過m1m2添加矩陣時,它們是未初始化的。 (它會像一盒巧克力)。初始化並呼籲addMatrix之前設置m1m2值。

你不能,除非你是返回一個指針的內存一個動態分配的內存塊的函數內返回本地創建一個數組。在C中的所有收益都是單值(它可以是一個單一的指針更復雜的東西)在這裏您return typeaddMatrix是錯誤的。您需要通過m3addMatrix來保存添加的結果。因此,回報也可能是void(或其他表示成功/失敗的其他單個值)。例如: -

void addMatrix (float m3[][3], float m1[][3], float m2[][3], int x) 

最後,我知道我可能已經忘記了什麼東西,除非你正在嘗試使用變長數組,你聲明的數組必須具有恆定值,而不是變量。要做到這一點,並有辦法來方便地改變整個代碼值的最簡單方法,就是在代碼的開頭以創建尺寸的#define

把所有的一起,你可以這樣做以下:

#include <stdio.h> 

#define DIMXY 3 

void addMatrix (float m3[][DIMXY], float m1[][DIMXY], float m2[][DIMXY], int x) 
{ 
    int i, j; 

    for (i = 0; i < x; i++) { 
     for (j = 0; j < DIMXY; j++) { 
      m3[i][j] = m1[i][j] + m2[i][j]; 
     } 
    } 
} 

int main() 
{ 
    int i, j, x = 3; 
    float m1[DIMXY][DIMXY] = {{0}}; /* always initialize arrays to zero */ 
    float m2[DIMXY][DIMXY] = {{0}}; 
    float m3[DIMXY][DIMXY] = {{0}}; 

    /* now fill m1 & m2 -- otherwise "what are you adding?" */ 
    for (i = 0; i < x; i++) 
     for (j = 0; j < DIMXY; j++) { 
      m1[i][j] = i + j + 1; 
      m2[i][j] = m1[i][j] + 4; 
     } 

    addMatrix (m3, m1, m2, x); 

    printf ("\n Printing m1\n\n"); 
    for (i = 0; i < x; i++) { 
     for (j = 0; j < DIMXY; j++) 
      printf (" %4.1f", m1[i][j]); 
     putchar ('\n'); 
    } 

    printf ("\n Printing m2\n\n"); 
    for (i = 0; i < x; i++) { 
     for (j = 0; j < DIMXY; j++) 
      printf (" %4.1f", m2[i][j]); 
     putchar ('\n'); 
    } 

    printf ("\n Printing m3 after addMatrix\n\n"); 
    for (i = 0; i < x; i++) { 
     for (j = 0; j < DIMXY; j++) 
      printf (" %4.1f", m3[i][j]); 
     putchar ('\n'); 
    } 


    return 0; 
} 

輸出

$ ./bin/arr_add_2d 

Printing m1 

    1.0 2.0 3.0 
    2.0 3.0 4.0 
    3.0 4.0 5.0 

Printing m2 

    5.0 6.0 7.0 
    6.0 7.0 8.0 
    7.0 8.0 9.0 

Printing m3 after addMatrix 

    6.0 8.0 10.0 
    8.0 10.0 12.0 
    10.0 12.0 14.0 

如果碰巧你的意圖是利用變長數組,那麼你的代碼看起來是這樣的:

void addMatrix (float m3[][3], float m1[][3], float m2[][3], int x, int y) 
{ 
    int i, j; 

    for (i = 0; i < x; i++) { 
     for (j = 0; j < y; j++) { 
      m3[i][j] = m1[i][j] + m2[i][j]; 
     } 
    } 
} 

int main() 
{ 
    int i, j, x = 3, y = 3; 
    float m1[x][y]; /* cannot initialize variable size objects */ 
    float m2[x][y]; 
    float m3[x][y]; 

    /* now fill m1 & m2 -- otherwise "what are you adding?" */ 
    for (i = 0; i < x; i++) 
     for (j = 0; j < y; j++) { 
      m1[i][j] = i + j + 1; 
      m2[i][j] = m1[i][j] + 4; 
     } 

    addMatrix (m3, m1, m2, x, y);