2010-04-09 106 views
0

假設我有一個隨機布爾型二維數組,名爲'lattice',並且有一個名爲'list'的1D數組,它列出了二維數組中所有零的地址。這是怎樣的數組定義:如何返回C中多維數組元素的索引?

define n 100 
bool lattice[n][n]; 
bool *list[n*n]; 

填充的0和1格後,我的零的地址存儲在列表:

for(j = 0; j < n; j++) 
{ 
    for(i = 0; i < n; i++) 
    { 
     if(!lattice[i][j]) // if element = 0 
     { 
      list[site_num] = &lattice[i][j]; // store address of zero 
      site_num++; 
     } 
    } 
} 

我如何提取的x,y座標數組中每個零的值?換句話說,有沒有辦法通過引用它的地址來返回一個數組元素的索引?

編輯:我需要使代碼儘可能高效,因爲我正在做很多其他複雜的東西與更大的數組。所以一個快速的方法來完成這將是偉大的

回答

1

一種解決方案是將(x, y)映射到自然數(例如z)。

z = N * x + y 
x = z/N (integer division) 
y = z % N 

在這種情況下,你應該使用int list[N * N];

另一種解決方案是隻存儲座標,當你發現一個零,是這樣的:

list_x[site_num] = x; 
list_y[site_num] = y; 
site_num++; 

或者你可以定義一個struct兩個int s。

+0

我猜測第二種方法更快,因爲沒有涉及到算術? – Eddy 2010-04-09 16:09:40

-1

如何提取數組中的每個零的x,y座標?換句話說,有沒有辦法通過引用它的地址來返回一個數組元素的索引?
你不能。就那麼簡單。如果你需要這些信息,你需要把它和有問題的數組一起傳遞。你可能希望注意到,可變長度數組是C99的一個特性。編輯:除非你做了一個宏(yuck!)),你可能希望注意到可變長度數組是一個C99特性。

+0

我真的希望誰低估會留下評論爲什麼。 – 2010-04-09 15:58:30

+0

不是我的投票,但如果你知道數組的起點和分配的大小(實際上知道除第一個索引以外的所有大小就足夠了),你可以從指針指向一個元素。 – dmckee 2010-04-09 17:10:19

+0

@dmckee:是的,這是正確的。看起來,OP正在尋找獲得數組大小的定義,儘管在包含數組的塊之外。沒有辦法只問C是什麼數組被定義爲。 – 2010-04-09 17:18:42

1

那麼,這是可能的一些指針算術。

你有你的格子的第一個元素的地址和列表中所有零字段的地址。你知道布爾的大小。通過從零場地址中減去第一個元素地址併除以bool的大小,就可以得到一個linar索引。這個線性指數可以通過使用模和除法計算成2-dim指數。

但是,爲什麼不在地址列表中存儲2-dim索引而不是地址?你需要這個地方還是索引?
而且你應該考慮轉動周圍的for循環(外循環i,內循環j)。

+0

我只需要索引。所以在列表中存儲x,y座標將是最快的方式嗎? 順便說一下,bool的工作在C99標準 – Eddy 2010-04-09 15:52:51

+0

是的,我只是將i * n + j存儲在整數數組中。你對C99是正確的,謝謝你指出 - 我編輯了我的答案。 – tanascius 2010-04-09 15:56:14

0
struct ListCoords 
{ 
    int x, y; 
} coords[n*n]; 

for(i = 0; i < site_num; i++) 
{ 
    int index = list[i] - &lattice[0][0]; 
    coords[i].x = index % n; 
    coords[i].y = index/n; 
} 

我可能會有%和/運營商倒退您的需求,但這應該給你的想法。