2013-10-02 74 views
-1
#include <stdio.h> 

int main(void) 
{ 

    double roomdata[5][18][2],t; 

    scanf(" %lf",t); 
    roomdata[0] = t; // How Come this does not work? 
        // I get a error "Incompatible Types in Assignment" 
        // but both roomdata array and t are same type of double. 
} 

我想的值在指數分配給數組roomdata [0],但每次我嘗試,我得到一個錯誤的時間說,它在分配一個不兼容的類型,但我已經從初始化作爲雙打?我猜它與3D陣列有關,但我不確定。數組賦值用C

+8

你有一個3D數組。索引[0]是一個二維數組。也許你需要[0] [0] [0] – sashkello

+0

我試過,但也只是改變指數的值[0] [0] [0]不是一個索引[0] – user2671024

+2

@ user2671024你根本就」這樣做。在C中,數組不可分配。 – 2013-10-02 05:08:57

回答

4

應該

scanf(" %lf", &t); 
roomdata[0][0][0] = t; 
2

你應該在scanf

scanf(" %lf",t); ==> scanf(" %lf",&t); 
      ^     ^

通過地址,您應該使用合適的指數

roomdata[i][j][k] = t; 
0

我想你誤會陣列如何工作。你想要一個具有三個值的數組嗎?

double roomdata[3], t; 
roomdata[0] = 5; 
roomdata[1] = 18; 
roomdata[2] = 2; 
scanf(" %1f", &t); 
roomdata[0] = t; 
0

在評論你說「roomdata陣列和t相同類型的雙」,這就是你走到哪裏錯了。它們不是同一類型。 roomdata[0]是雙數組數組,而t只是雙精度數組。

爲避免混淆,即使語言允許,也不應在類似的語句中定義不同類型的變量。 INSEAD使用兩個語句:

double roomdata[5][18][2]; 
double t; 

另外,在C中,它是不可能分配給數組。換句話說,即使類型匹配,也不會編譯,即使類型匹配:roomdata[0] = roomdata[1];

您只能分配給單個數組元素,這意味着您必須給所有索引。因此,在你的代碼有問題,你可能希望這樣的:

roomdata[0][0][0] = t; 

如果你想在C到「分配」陣列,通常使用memcpy或創建自己的(可能是嵌套)for循環,或包裹陣列中的struct(因爲在C中可以指定結構)。例如,約for循環:如果你想分配t到「層」 roomdata[0][][],這是怎麼了:

int j, k; 
for (j=0; j<18; ++j) { 
    for(k=0; k<2; ++k) { 
     roomdata[0][j][k] = t; 
    } 
} 

此外,當你不問它,scanf(" %lf",t);是錯誤的,你必須通過指向要存儲值scanf的位置。此外,您應該始終檢查返回值scanf,或至少打印它,以便您可以注意到問題(請閱讀here的返回值部分)。所以這應該是

double t = 0.0; // initialize with a know value in case scanf fails 
int scannedCount = scanf(" %lf", &t); 
printf("(scanf returned %d, value of t=%f)\n", scannedCount, t); 

雖然roomdata聽起來你確實想讓它成爲房間內容的3維網格,以防萬一:如果你確實打算與一維雙陣列初始值5,2,18,那麼你會這樣做:

// initialize with 3 elements, array length is automatically set to 3 
double roomdata[] = { 5, 2, 18 };