全局多维数组未写入[vs c ++]

时间:2010-08-31 14:26:13

标签: c++ visual-studio-2008 multidimensional-array global-variables

我有一个全局多维数组,g_iAllData[MAX_LEN][MAX_WIDTH]在表单中使用。当我在函数中写入它时:g_iAllData[iRow][iColumn]= iByte_Count;我可以在监视窗口中看到它的内容没有被更改。如果我把数组放在函数中,它工作正常。

有什么我想念的吗?我在Form1.h文件顶部的#include后声明它是全局的。我有多个按下按钮调用的函数,我需要在每个函数中写入和读取数组。将它保持为全局而不是将其传递给每个函数会更容易。

更新代码:

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 个答案:

答案 0 :(得分:2)

您是否也将Form1.h包含在其他文件中?如果是这样,您需要在其他文件中使用“extern”。

答案 1 :(得分:2)

您的代码示例确实证实您的变量声明存在问题。

正如@Graham暗示的那样,定义全局变量的正确方法是:

  • 在cpp文件中定义变量
  • 在头文件
  • 中将变量声明为extern

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

这样链接器将在一个编译单元中找到全局变量的定义,并且在#include头部的所有其他编译单元中,它将能够将extern声明链接到正确的变量定义

除非这样,否则可能会发生奇怪的事情:您可能会收到抱怨多个变量定义的神秘链接器错误消息,或者您甚至可能在应用程序中获得多个不同的变量而不是一个全局变量 - 后者解释了为什么您的方法没有似乎改变了变量的内容。

答案 2 :(得分:0)

如果在头文件中定义了数组(如代码所示),那么每次在翻译单元中包含该标题时,都可以有效地定义数组的单独“副本”。这甚至不应该编译,因为您正在定义同一外部对象的多个实例(违反ODR)。

如果你设法以某种方式编译它(如何?),那么就无法说明你正在修改哪个g_iAllData实例以及调试器在监视窗口中显示哪个实例。可能是不同的实例,这就是您没有看到更改的原因。

不应在头文件中定义具有外部链接的对象。你最好重新考虑你的方法。