Глобальный многомерный массив не записывается в [vs c ++] - PullRequest
1 голос
/ 31 августа 2010

У меня есть глобальный многомерный массив, g_iAllData[MAX_LEN][MAX_WIDTH] используется в форме. Когда я пишу ему в функции: g_iAllData[iRow][iColumn]= iByte_Count;, я вижу в окне просмотра, что его содержимое не изменяется. Если я поместил массив в функцию, он работает нормально.

Есть ли что-то, что я пропускаю? Я объявляю его глобальным после того, как мои #include находятся вверху файла Form1.h. У меня есть несколько функций, которые вызываются нажатием кнопок, и мне нужно писать и читать из массива в каждой функции. Было бы проще сохранить его как глобальный, а не передавать его каждой функции.

ОБНОВЛЕНИЕ код:

ProgramName.cpp

#include "stdafx.h"
#include "Form1.h"  

Form1.h

#include <iostream>
#include <string>
...
#pragma once  

const int MAX_LEN = 4033;
const int MAX_WIDTH = 21;
int g_iAllData[MAX_LEN][MAX_WIDTH];    
...
namespace ProgramName{
// later on
ReadFile();  

void ReadFile (void)

g_iAllData[iRow][iColumn]= iByte_Count;

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

Ваш пример кода действительно подтверждает, что у вас есть проблема с объявлением переменной.

Как намекнул @Graham, правильный способ определения глобалов:

  • определить переменную в файле cpp
  • объявить переменную как extern в заголовочном файле

1012 * Т.е. *

//ProgramName.cpp

#include "stdafx.h"
#include "Form1.h"  

int g_iAllData[MAX_LEN][MAX_WIDTH];    

//Form1.h

#include <iostream>
#include <string>
...
#pragma once  

const int MAX_LEN = 4033;
const int MAX_WIDTH = 21;
extern int g_iAllData[MAX_LEN][MAX_WIDTH];    

Таким образом, компоновщик найдет определение глобальной переменной ровно в одной единице компиляции, а во всех других единицах компиляции, которые # включают заголовок, он сможет связать объявления extern с правильным определением переменной.

За исключением этого, могут происходить странные вещи: вы можете получать сообщения об ошибках зашифрованного компоновщика с жалобами на множественные определения переменных, или вы можете даже получить несколько разных переменных в вашем приложении вместо одной глобальной переменной - последняя объясняет, почему ваш метод не похоже, изменяет содержимое вашей переменной.

2 голосов
/ 31 августа 2010

Включаете ли вы Form1.h в другие файлы?Если это так, вам нужно использовать «extern» в других файлах.

0 голосов
/ 31 августа 2010

Если вы определили свой массив в файле заголовка (как показывает код), то каждый раз, когда вы включаете этот заголовок в модуль перевода, вы фактически определяете отдельную "копию" вашего массива. Это даже не должно компилироваться, так как вы определяете несколько экземпляров одного и того же внешнего объекта (нарушение ODR).

Если вам удалось как-то его скомпилировать (как?), То невозможно сказать, какой экземпляр g_iAllData вы модифицируете, и какой экземпляр отладчик показывает вам в окне просмотра. Это могут быть разные экземпляры, поэтому вы не видите изменений.

Объекты с внешней связью не должны быть определены в заголовочных файлах. Вам лучше пересмотреть свой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...