Проблема с массивом указателей - PullRequest
0 голосов
/ 13 июня 2011

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

Я хотел сделать свой обмен данными таким образом, потому что в некоторых моих файлах у меня более 75 переменных, и использование цикла значительно сокращает код и упрощает вещи.

IЯ знаю, что у меня проблема в том, что я просто передаю DDX_Text неправильные параметры, но я знаю, что он принимает CStrings.Тем не менее, я почти уверен, что не правильно ссылаюсь на них.

Любая помощь будет принята с благодарностью!

~ Jon

Ответы [ 6 ]

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

вместо

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, поэтому я предлагаю установить точку останова на этой строке и убедиться, что ваш массив инициализирован правильно. Если это так, то проблема в другом.

1 голос
/ 13 июня 2011

DDX_Text ожидает ссылку на CString.Однако &var[j] дает указатель (CString**).Вы должны вызывать его с помощью *var[j] (разыменовать указатель) - т.е. DDX_Text(pDX, i, *var[j]);.

edit: ваш цикл, вероятно, не выполняет то, что вы ожидаете.Условие for -loop (i <= 2010, j < 4) сравнивает i с 2010 годом, отбрасывает результат, сравнивает j с 4 и использует этот результат.Если вы хотите объединить условия, используйте && (логическое И), || (логическое ИЛИ) или ! (логическое НЕ).

Однако индексы, похоже, в порядке.

1 голос
/ 13 июня 2011

DDX_Text(pDX, i, &var[j]); отправляет адрес указателя, CString **.

Ваша функция DDX_Text запрашивает ссылку на значение.

Попробуйте вместо DDX_Text(pDX, i, *var[j]);.

1 голос
/ 13 июня 2011

Вам нужно разыменовать указатель CString:

DDX_Text(pDX, i, *var[j])
1 голос
/ 13 июня 2011
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 и ваши индексы i и j, я не уверен, чего вы пытаетесь достичь.

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

вместо

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

использование

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

Не используйте адрес (&var[j]) или разыменование (*var[j]). Просто используйте var[j].

...