Передача переменной NAME в функцию - PullRequest
0 голосов
/ 13 июня 2011

Язык: 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 
);

Итак, как я уже сказал, мне просто нужно передать функции фактическое имя переменной. По крайней мере, я так думаю. На самом деле он устанавливает связь между текстовым полем в диалоге и переменной, в которой будет храниться ввод текстового поля. Я правильно разыменую и все, но я не думаю, что это правильный подход.

Спасибо за любую помощь. И людям, которые ответили на мой предыдущий вопрос, мои извинения за искажение проблемы.

Ответы [ 2 ]

3 голосов
/ 13 июня 2011

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
   }
} 
1 голос
/ 13 июня 2011

Вы не передаете правильную вещь в DDX_Text.Третий параметр - это ссылка на CString.Вы передаете адрес указателя.Так что вы, вероятно, должны сделать что-то вроде

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