0

我正在使用不同的函数在 C++ 中编程。我对局部和全局变量的声明和使用有疑问。有许多变量首先必须在 main 中使用,并且还需要在函数中使用。

所以,我声明了一些全局变量。我也想在外面分配一些内存main()

但现在代码似乎不起作用。请帮我解决这个问题。

我有:

int *mb = new int [c];  //declare variables before you use them
matrix *M = new matrix  [n+1+m];

当我使用上述两个变量作为全局变量时,我的代码不起作用。

这是我的代码的一部分:

int p=4, n=5, m=5;
int num;
struct matrix{
public:
int row;
int col;
int val;
};

int P(int k){
return k-1;
}

void M_to_C(){

int *mb,*mc,*mi;
double *mv;
int i, cur_col;
matrix*M;
cur_col=-1;
for(i=0; i<= num; i++) {
    cur_col=M[i].col;
    mb[cur_col]=i;
    mc[cur_col]=1;
    mi[i]=M[i].row;
    mv[i]=M[i].val;
}}

int main (int argc, char **argv){
int status = 0;

int project = 4; 
int employee = 5;
int time = 5; 

int empl [] = {2, 2, 2, 3};
int meet [] = {2, 4, 3, 3};

int NUMCOLS=n+m;

double *lb = new double [NUMCOLS];
double *ub = new double [NUMCOLS];
double *x  = new double [NUMCOLS];
int    *mb= new int [NUMCOLS];
int    *mc= new int [NUMCOLS];
char   *ctype = new char [NUMCOLS];

int **F = new int*[employee]; 
for(int a = 1; a <= employee; a++){     
    F[a] = new int [time];
    for(int b = 1; b <= time; b++){
        F[a][b]=rand()%2;
    }}

int NUMROWS=0;  

for(int i=1; i<=n; i++){        
    for(int j=1; j<=m; j++){ 
        for(int l=1; l<=p; l++) {
            if(F[i][j] ==0){            
                NUMROWS++;
                                    num++;
            }
        } 
    }
}

int    *mi= new int [2*NUMROWS+m];
double *mv= new double [2*NUMROWS+m];
matrix_entry *M = new matrix_entry  [num+1+m];

num=-1;
int row=-1;
for(int i=1; i <= n; i++) {
    for(int j=1; j <= m; j++) {
        for(int k=1; k <= project; k++) {
            if(F[i][j] ==0) {
                row++;
                num++;
                M[num].col=P(k); 
                M[num].row=row;
                M[num].val=-1;
            }}}}

M_to_C();
4

2 回答 2

3

您可以将它们定义为全局变量并这样填充它们main

int *mb;
matrix *M;

int main () {
    mb = new int [c]; 
    M = new matrix  [n+1+m];
    :
}

但我应该警告您,全局变量(以及短变量名,如mb,lbub)通常被认为是一个坏主意。

您最好根据需要通过将它们放在一个类中或将它们作为引用传递来限制它们的可访问性。

于 2013-05-14T08:45:42.107 回答
1

M_to_C()函数内部,您对未初始化的指针进行了一些操作M,所以基本上这是未定义的行为:

matrix*M;
cur_col=-1;
for(i=0; i<= num; i++) {
    cur_col=M[i].col; // access local uninitialized pointer M

为了修复它,您应该在使用它之前初始化 M 属性。在您的情况下,局部变量M隐藏全局变量。我建议将 M 传递给M_to_C()函数,以便它可以对现有对象进行操作:

void M_to_C(matrix * M)
于 2013-05-14T08:46:24.503 回答