2012-12-14 77 views
4

不確定什麼是「良好實踐」或被認爲更「正確」。我有一個數組,我想通過除namename []以外的名稱來訪問各個元素。我可以使用#defines或指針,也可能使用其他方式。重命名(混疊)數組元素C

例子:

#define value1 myarray[1] 

int myarray[SIZE]; 
value1 = 5; 

int myarray[SIZE]; 
int *ptr; 
ptr = &myarray[1]; 
*ptr = 5; 

在我看來,#定義路線比較簡單,使用更少的內存,但會帶來了一堆的問題,我不知道的。任何見解都會很棒,我希望儘可能遵守通用標準。

*編輯:也許還有更好的方法。我的最終目標是獲得將從外設端口發出的陣列。但是,數據由非常不同的數據集組成,並且單個數組名稱不代表所分配的數據。我的記憶非常有限,所以我想避免雙重存儲每個值。

+4

*聖maintinence噩夢,蝙蝠俠!* – dmckee

+0

爲什麼你想要那樣做?理性是什麼? – didierc

+5

我覺得,如果一個值需要一個不同於數組中所有其他值的標識,那麼該值不應該放在數組中。你能提供一個更具體的例子來證明你的想法的實用性嗎? – Kevin

回答

5

我提出了第三種選擇,通過例如:

#define VALUE1_IDX 1 

int myarray[SIZE]; 
myarray[VALUE1_IDX] = 5; 

的這種過度#1的優點是,它仍然明顯,你正在做使用myarray中,人和的優勢超過#2是一樣你說,避免指針。我懷疑,但沒有證實,通過優化,選項#2將沒有額外的內存使用,儘管它看起來很直觀。

我認爲最好的解決方案會因情況而異,我認爲你的兩個選擇中的任何一個都可以在正確的背景下辯護。

編輯:爲了迴應Kevin的評論,首先值得檢查的是,如果可以避免在未集體處理值時使用數組,我意識到肯定會遇到這種情況,例如,如果您閱讀了一條長信息,並想簡單地提取幾個關鍵值。

+0

這看起來很有希望,很明顯,不知道爲什麼我沒有想到它。保持數組的名稱一般,但使用描述性的索引值會得到我想要的結果。感謝您的輸入。 – abrand

1

union s是別名變量的另一種方式。但不要將此作爲建議。如果你依賴別名,它們是危險的(不可移植的)。您只應該使用它們來優化內存使用情況,以便您同時不需要的變量。

+0

工會不會讓你別名一個預先存在的變量。同樣,使用聯合來創建對象別名可能(取決於類型)違反了嚴格的別名規則,並且由於關於一次只有一個聯合成員處於「活動」狀態的規則,所以也是有問題的。 – bames53

0

你可以做這樣的事情

typedef enum 
{ 
    foo = 0; 
    // ... more named values 
    bar = SIZE; 
} Thing; 

int value[SIZE]; 
value[foo] = 5; 

Using an enum as an array index

2

爲什麼不引用?

int A[3]; 
int& a1=A[1]; 
1
enum {SIZE = 100}; 

struct Mapping { 
    int unused1; 
    int value1; 
    int unused2; 
}; 

Mapping& AsMapping(int(&array)[SIZE]) { 
    return *reinterpret_cast<Mapping*>(&array); 
} 

int arr[SIZE]; 
AsMapping(arr).value1 = 5; 
Mapping& values = AsMapping(arr); 
values.value1 = 5; 

這就需要旁邊沒有記憶,和優化應該能夠抹去一切。同時,它是合理可維護的。

在您的struct上設置對齊可能是您必須小心的要求。

0

非定義方法允許您在第二種情況下無法獲得的類型校正程度。

此外,任何健全的編譯器生成的實際代碼對於兩者都是相同的。

所有我會waaay更喜歡第二,因爲它是瞬間明顯發生了什麼事情。另一個問題是#define可能會導致您實際處理的區域範圍之外的問題。

其更合理的使用後者,因爲它意味着它不太可能someoen別人會來搞砸了,在以後有機會...