2011-06-13 94 views
0

語言:的Visual C++,MFC傳遞變量名的功能

環境: Visual Studio 2005中

所以我張貼了類似的問題,但我認識到,我是問錯誤的問題。我試圖用一個循環來調用幾個不同變量的函數,但是在這個過程中的某個地方,程序崩潰了。

簡化的代碼在下面,但我認爲它實際上更容易解釋它。我有一個函數將CString作爲參數。我有幾個變量我希望提供給這個函數,所以我把他們的名字放到一個數組中,我試圖通過這種方式將它們傳遞給函數。

//下面的代碼是什麼,我也有,但它不工作//

頭文件:

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 
}; 

源文件: theFunction()

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

    for(int i = 2001, j = 0; i <= 2004; i++, j++) 
    { 
     // THE LINE BELOW IS WHERE THINGS GO WONKY, SPECIFICALLY AT &var[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 
); 

所以就像我說的,我只需要給函數提供變量的實際名稱。至少我想。實際上做的是在對話框中的文本框和文本框的輸入將被存儲的變量之間建立連接。我正確地解除引用和一切,但我不認爲這是正確的方法。

謝謝你的幫助。對於回答我上一個問題的人,我很抱歉歪曲了這個問題。

回答

3

var是指向CString的指針數組。
var[j]是指向CString的指針。
&var[j]是指向CString的指針的指針。

現在您需要通過CString對象。因此,你需要:

DDX_Text(pDX, i, *var[j]); // dereference a pointer to CString. 

考慮使用std::vector而不是C數組。這將是:

std::vector<CString> var(4); 
... 

DDX_Text(pDX, i, var[j]); // pass a CString object 

我注意到,你在構造函數中聲明變量再次var

CString *var[4] = { // this declares new temporary variable, 
        // it doesn't initialize one from the header file 
    &m_strTop 
, &m_strLeft 
, &m_strRight 
, &m_strBottom 
}; 

不應該是什麼? :

var[0] = &m_strTop; 
var[1] = &m_strLeft; 
var[2] = &m_strRight; 
var[3] = &m_strBottom; 

我想你需要以下條件:

// header file 
class myClass 
{ 
    std::vector<CString> var_; 
    ... 
}; 

// source file 
myClass::myClass() : var_(4) 
{ 
    ... 
} 

void myClass::theFunction(CDataExchange* pDX) 
{ 
    CSAPrefsSubDlg::DoDataExchange(pDX); 

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

拍攝,複製和粘貼錯誤的東西。我把它正確地作爲* var [j],但它仍然無法正常工作。這不是存儲在我感興趣的變量中的信息,而是變量的實際名稱。我是否需要創建一個變量名稱的CString數組? – Jon 2011-06-13 16:21:47

+0

什麼是DDX_Text尋找?如果它正在尋找對CString的引用,那麼否,否則,你需要使var爲CString [] = {「m_strTop」,「m_strLeft」,...};自從我使用DDX_Text已經很久了,我不記得它是什麼,因爲它是第三個參數 – miked 2011-06-13 16:23:51

+0

什麼是「變量名稱」?在你的情況下,'DDX_Text'根據'CDataExchange :: m_bSaveAndValidate'的值將控件的值(編輯框或類似的東西)複製到'CString'中,反之亦然。 – 2011-06-13 16:26:11

1

你沒有通過正確的事情到DDX_TEXT。它的第三個參數是對CString的引用。你正在傳遞一個指針的地址。所以你應該做點像

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

拍攝,複製和粘貼錯誤的東西。我把它正確地作爲* var [j],但它仍然不正確。 – Jon 2011-06-13 16:20:40