2011-06-13 68 views
0

語言: C++,MFC問題的指針數組

問題:我試圖傳遞一個函數一些指針中包含的陣列內的變量,但是編譯器不似乎不同意我的做法。這裏是我的代碼:

頭文件:

CString m_strTop; 
CString m_strLeft; 
CString m_strRight; 
CString m_strBottom; 

CString *var[4]; 

源文件: 構造函數()

CString *var[4] = { 
    &m_strTop 
, &m_strLeft 
, &m_strRight 
, &m_strBottom 
}; 

源文件: 的DoDataExchange()

void FSC_3DPersp::DoDataExchange(CDataExchange* pDX) 
{ 
    CSAPrefsSubDlg::DoDataExchange(pDX); 

    for(int i = 2001, j = 0; i <= 2004, j < 4; i++, j++) 
    { 
     DDX_Text(pDX, i, &var[j]); // 'i' is the ID of the textbox 
    } 
} 

- DDX_TEXT期待什麼 -

void AFXAPI DDX_Text(
    CDataExchange* pDX, 
    int nIDC, 
    CString& value 
); 

我想做我DataExchange這種方式,因爲在我的幾個文件,我有向上的75個變量,使用循環可以顯着地壓縮代碼,並簡化事情。

我知道我遇到的問題是我只是給DDX_Text提供了錯誤的參數,但我知道它需要CStrings。但是,我很確定我沒有正確引用它們。

任何幫助將不勝感激!

〜喬恩

+0

什麼是錯誤信息? – StevieG 2011-06-13 15:00:10

+0

我修復瞭解引用錯誤,但是現在我的程序在代碼到達for循環時崩潰。我收到以下錯誤:「訪問衝突讀取位置0x000000a3」。也許我的索引不正確?我不知道還有什麼可以... – Jon 2011-06-13 15:08:08

+0

你有75個控件的對話框?你真的想完成什麼?對於循環而言,可能會引起眉毛,就像我對CRect的字符串表示一樣。 – AJG85 2011-06-13 15:21:39

回答

2

而不是

DDX_Text(pDX, i, &var[j]); 

使用

DDX_Text(pDX, i, *(var[j])); 

正如你已經有間接的級別那裏。

關於這一點:

for(int i = 2001, j = 0; i <= 2004, j < 4; i++, j++) 

我不知道你是否意識到,你設定的條件出現將意味着正確的,因爲這是逗號操作是如何工作的。您應該將左邊的一個留下,因爲當j < 4表達式正確時,它將永遠不會是錯誤的,或者使用運算符更清晰。

我假設你使用Visual Studio做MFC編程,所以我建議在該行設置一個斷點並確保你的數組已經正確初始化。如果是,那麼問題就在別的地方。

+0

這編譯我的代碼,但現在它代碼到達這一點時崩潰。我收到以下錯誤:「訪問衝突讀取位置0x000000a3」。也許我的索引不正確? – Jon 2011-06-13 15:05:48

+0

喬恩,我編輯了我的答案。 – 2011-06-13 15:31:27

+0

好,趕上Tamas。這確實爲我未來留下了很多,但由於某種原因它仍然崩潰。 – Jon 2011-06-13 15:37:37

1
DDX_Text(pDX, i, &var[j]); // 'i' is the ID of the textbox 

應該

DDX_Text(pDX, i, *var[j]); // 'i' is the ID of the textbox 

雖然,看着你的for循環,你的指數ij,我不確定你正在努力完成的任務。

+0

這編譯我的代碼,但現在它在代碼達到此點時崩潰。我收到以下錯誤:「訪問衝突讀取位置0x000000a3」。也許我的索引不正確? – Jon 2011-06-13 15:05:35

1

您需要dereference CString的指針:

DDX_Text(pDX, i, *var[j]) 
+0

這編譯我的代碼,但現在它代碼達到這一點時崩潰。我收到以下錯誤:「訪問衝突讀取位置0x000000a3」。也許我的索引不正確? – Jon 2011-06-13 15:06:04

+0

@Jon:你想要做什麼?現在它只會在值i:2001 - 2004和j:0 - 3之間循環。 – GWW 2011-06-13 15:08:10

+0

我的錯誤...我實際上簡化了我的代碼在這裏發佈。我一定忘記了改變數字。它應該初始化文本框之間的數據交換(使用從2001開始的編號ID)以及用於存儲它們的變量(數組中的變量)。 – Jon 2011-06-13 15:15:22

1

DDX_Text(pDX, i, &var[j]);發出了一個指針的地址,一個CString **。

您的DDX_Text函數要求對該值進行引用。

嘗試用DDX_Text(pDX, i, *var[j]);代替。

+0

這編譯我的代碼,但現在它代碼達到這一點時崩潰。我收到以下錯誤:「訪問衝突讀取位置0x000000a3」。也許我的索引不正確? – Jon 2011-06-13 15:05:40

1

DDX_Text預計參考CString。但是,&var[j]會生成一個指針(CString**)。您應該用*var[j](取消引用指針)來調用它 - 即DDX_Text(pDX, i, *var[j]);

編輯: 您的循環可能不會做你期望的。 for -loop條件(i <= 2010, j < 4),比較i到2010,拋出結果,比較j到4並使用該結果。如果要合併條件,請使用&&(邏輯與),||(邏輯或)或!(邏輯NOT)。

但是,指數似乎沒有問題。

+0

這編譯我的代碼,但現在它代碼達到這一點時崩潰。我收到以下錯誤:「訪問衝突讀取位置0x000000a3」。也許我的索引不正確? – Jon 2011-06-13 15:05:56

+0

請參閱Tamas迴應。 :) – 2011-06-13 16:07:23

0

而不是

DDX_Text(pDX, i, &var[j]); 

使用

DDX_Text(pDX, i, var[j]); 

不要使用地址的(&var[j])或解除引用(*var[j])。只需使用var[j]即可。