2011-06-13 3 views
0

언어 : 비주얼 C++, MFC함수에 변수 이름을 전달

환경 : 비주얼 스튜디오

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

varCString에 대한 포인터 배열입니다.
var[j]CString에 대한 포인터입니다.
&var[j]CString에 대한 포인터의 포인터입니다.

이제 CString 개체를 전달해야합니다. 그래서 당신이 필요합니다

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

대신 C 배열의 std::vector을 사용하는 것이 좋습니다.그것은 다음과 같습니다

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

그것은해야하지 :

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

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

난 당신이 생성자에서 var 다시 한 번 변수를 선언하고 있다는 지적했습니다? :

// 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

+0

DDX_Text는 무엇을 찾고 있습니까? CString에 대한 참조를 찾고 있다면, 그렇지 않으면 var를 CString [] = { "m_strTop", "m_strLeft", ...}로 만들어야합니다. DDX_Text를 사용한 지 오래되었지만 제 3의 매개 변수가 무엇인지 기억하지 못합니다. – miked

+0

"변수 이름"은 무엇입니까? 귀하의 경우'DDX_Text'는'CDATAExchange :: m_bSaveAndValidate' 값에 따라'CString'에 대한 컨트롤 (editbox 또는 비슷한 것)의 값을 복사하거나 그 반대로 복사합니다. –

1

당신은 DDX_Text에 옳은 일을 통과하지 않는 :

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

나는 다음과 같은 필요한 가정합니다. 세 번째 매개 변수는 CString에 대한 참조입니다. 당신은 포인터의 주소를 전달하고 있습니다. 따라서 당신은 아마 뭔가를해야합니다.

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

쏴, 복사하고 틀린 것을 붙여 넣었다. 나는 그것을 var * [j]로 정확하게 가지고 있지만 여전히 정확하지 않다. – Jon