2015-02-07 46 views
0

我真的不明白爲什麼我繼續得到這個錯誤「數組類型」雙[10] [10] [10]是不可分配的「」 我試着傳遞一個數組裏面,它仍然沒有似乎工作使用結構的c中的矩陣乘法

我不允許這樣做。什麼是替代方案?感謝您的幫助

#define MAX 10 
//structures usually defined at top along with function prototypes 
typedef struct { 
    unsigned int row; 
    unsigned int col; 
    double array [MAX][MAX]; 
}Matrice; 

Matrice lire_matrice(void); 
Matrice multiplication(Matrice a, Matrice b); 
void affiche_matrice(Matrice m); 

int main(int argc, const char * argv[]) { 
    //insert code here... 


    Matrice m1 = lire_matrice(); 
    Matrice m2 = lire_matrice(); 
} 

Matrice lire_matrice(void){ 
    unsigned int row,col; 

    printf("Enter row which must be smaller or equal to %d ", MAX); 
    scanf("%d",&row); 

    printf ("Enter col which must be smaller or equal to %d",MAX); 
    scanf("%d",&col); 

    double table[row][col]; 
    int i; 
    int j; 
    double input; 
    for(i = 0; i < row; i++){ 
     for(j= 0; i < col;j++){ 
      printf("M[%d,%d] =",i,j); 
      scanf("%lf",&input); 
      table[i][j]= input; 
     } 
    } 

    Matrice m; 



    m.array = table; <<**ERROR ARRAY TYPE DOUBLE[10][10] IS NOT ASSIGNABLE**>> 
    m.row = row; 
    m.col = col; 


    return m; 

} 
+0

默認情況下,數組不可複製。您應該實現將數據從一個結構複製到另一個結構的方法或函數。 – Jepessen 2015-02-07 12:08:19

+0

歡迎計算器,您的問題似乎是雙*陣列的https://stackoverflow.com/questions/3755459/question-on-equating-arrays-in-c – 2015-02-07 12:13:45

回答

1

C-FAQ

對於二維數組一樣

int數組[NROWS] [NCOLUMNS]

到數組的引用的類型是指針NCOLUMNS

的陣列

更改爲:

typedef struct { 
    unsigned int row; 
    unsigned int col; 
    double (*array)[MAX]; 
}Matrice; 

或者保留原樣和

memcpy(m.array, table, sizeof table); 
1

數組中C是恆定的指針到第一個元素。在行m.array = table;你想改變這個常量指針指向m.array到內存位置。這在C中是不允許的。你必須有可能的解決方案。

1.)在結構矩陣中,您定義了數組元素作爲指向數組的指針。一種可能(但不是唯一的)的解決方案是以下內容:

typedef struct { 
    unsigned int row; 
    unsigned int col; 
    double *array; 
} Matrice; 

它可以參考元件(I,J)上的情況下 - i爲行索引,y是列索引 - 基質的以下的方法:

Matrice m; 
double table[row][col]; 
m.array = &table[0][0]; 
double elem = m.array[j + i * col]; 

我從來沒有在這個解決方案不工作,但根據改變曼的筆記這種解決方案可能會導致不確定的行爲環境中工作。即m.array將指向table[0]的第0個元素,這是一個包含col元素的數組。編譯器可能「使用」此信息(即m.array指向具有col元素的數組),但程序使用m.array作爲具有row * x col元素的數組。這可能導致未定義的行爲。但是我在這裏留下了這個解決方案,因爲「實際上」它運作良好。

更好的方案是,如果還table是一個1維陣列:

Matrice m; 
double table[row * col]; 
m.array = &table[0]; 
double elem = m.array[j + i * col]; 

2)另一種可能的解決方案是,你實現的方法,其拷貝由雙[] []「表」的元件到矩陣數組。

+0

'一個重複=表[0] [0]; '在實踐中它的工作原理,但沒有定義的行爲,[看看]你提供的(http://stackoverflow.com/questions/25303647/accesing-a-2d-array-using-a-single-pointer) – 2015-02-07 12:53:08

+0

問題是關於數組末尾的dereferenicing規則。但在幾個問題中寫道,2d數組存儲在連續的內存區域中,並且可以像我的代碼一樣處理它(http://stackoverflow.com/questions/7784758/cc-multidimensional-array-internals/7785116#7785116或http://stackoverflow.com/questions/1242705/performance-of-2-dimensional-array-vs-1-dimensional-array)。因此,我認爲我的解決方案的工作是正確的,但我的選擇很有意思。你能解釋我的意思嗎? – 2015-02-07 15:29:54

+0

我問了這個問題,並不是關於數組尾部的解引用規則,而是關於使用單個指針訪問2D數組,從'table [1] [0]'解除引用到'table [MAX] [MAX] '使用一個指向2D數組開頭的指針就是UB,你只能從'table [0] [0]'解除引用到'table [0] [MAX]',閱讀更多關於這一點[在這個線程](http://stackoverflow.com/a/7787436/1606345) – 2015-02-07 17:28:32