2012-09-14 36 views
0

我想將一個二維數組傳遞給函數,但它始終引發此錯誤。我的代碼如下:無效的類型int [int]數組下標

void initialize_centroids(int *,int,int);(Initialization) 

initialize_centroids(centroid[0],noofcentroids,newnoofvar);(inside my main) 

void initialize_centroids(int *carray,int p,int q) 
{ 
    int i,j; 
    for(i=0;i<p;i++) 
    { 
     for(j=0;j<q;j++) 
     { 
      carray[i][j]=i; 
     } 
    } 

    return; 
} 
+0

「拋出這個錯誤所有的時間」?你需要做的第一件事(特別是有人在做CS大師時)是理解編譯時錯誤的不同之處 - 它不是「拋出」的,當然如果你還沒有完全消除錯誤和運行時錯誤。當然'int *'不是「一個二維數組」。 –

回答

1

你傳遞一個指針爲int(int*),但你要使用兩個標。它是二維數組嗎?然後參數必須是一個指針的指針爲int:int**

void initialize_centroids(int**, int, int); 

int centroid[][] = .... // wherever this comes from 
initialize_centroids(centroid, noofcentroids, newnoofvar);(inside my main) 



void initialize_centroids(int** carray, int p, int q) 
{ 
    int i,j; 
    for(i=0;i<p;i++) 
    { 
     for(j=0;j<q;j++) 
     { 
      carray[i][j]=i; 
     } 
    } 

    return; 
} 
+0

沒有得到你..所以我應該在我的函數初始化爲int **。試過這​​個,但我得到了一個更多的錯誤。無法將參數â1**轉換爲** **â€「initialize_centroids(int **,int,int)â – Teja

+0

您是否可以編輯該評論以便可讀? –

+0

無法將int(*)[100]轉換爲int **作爲參數â1â至'void initialize_centroids(int **,int,int) – Teja

1

不要去參考centroid傳遞時做只會通過你的第一行。這樣做:

initialize_centroids(centroid, noofcentroids, newnoofvar); 

然後,你需要在這裏使用正確的類型:

void initialize_centroids(int **carray, int p, int q) 

你的陣列大概是一個int**。這意味着它是一個指向內存中的位置的指針,其中包含一組指針int*。這些指針中的每一個(我都假設)引用已經分配了數組的一行的內存。現在

,一旦你這樣做carray[i]獲得這些指針中的一個已選擇行i。你現在有一個int*這意味着它指向一個int的數組。

最後,carray[i][j]選擇來自j列上i行一個特定的整數。

[編輯]

理論什麼可能是想錯了......你不可以在動態意義上分配一個二維數組,或者實際上它可能是一維數組,你應該使用跨度等。這裏有一個解決方案,您可以使用它動態分配二維數組,並將其索引爲carray[i][j]

注意:過去由於對齊問題,有些人因爲這種方法而對我感到不安,但我從來沒有遇到過問題。我認爲他們只是有一個脾氣暴躁的一天。對於那些擔心對齊的人來說,很容易進行調整,但對於這個例子來說太複雜了。現在

int** allocate_array2d(int rows, int cols) 
{ 
    int i, **arr, *data; 
    arr = (int**)malloc(rows * sizeof(int*) + rows*cols*sizeof(int)); 
    data = (int*)(arr + rows); 
    for(i = 0; i < rows; i++) { 
     rows[i] = data; 
     data += cols; 
    } 
    return arr; 
} 

void free_array2d(int** arr) { 
    free((void*)arr); 
} 

,在主:

int** centroid = allocate_array2d(noofcentroids, newnoofvar); 
initialize_centroids(centroid, noofcentroids, newnoofvar); 

[更多...]

Okay.Yes我分配的內存這樣的心[100] [100] - Bobby 11 分鐘前

在這種情況下,你應該聲明:

void initialize_centroids(int carray[100][100], int p, int q) 
{ 
    //... 
} 

沒必要用我的動態數組例如

+0

我也是這樣做的,但仍然出現錯誤。 – Teja

+0

哦,看起來你已經在棧上聲明瞭數組,並且正在使用它,就像它在堆中聲明一樣。該陣列是否具有固定尺寸(* ie *硬編碼)尺寸?我將發佈代碼進行動態分配。 – paddy

+0

好的,是我分配的內存像這個質心[100] [100] – Teja

相關問題