未在此范围内声明的矩阵变量

Matrix variable not declared in this scope

本文关键字:变量 声明 范围内      更新时间:2023-10-16

我知道这种类型的问题已经提出,但没有一个解决方案帮助我。我想在从键盘敲击键时对矩阵的元素进行总和,但程序给了我下一个错误:

main.cpp|6|error: 'j' was not declared in this scope|
main.cpp|13|error: 'a' was not declared in this scope|
main.cpp|19|error: 'a' was not declared in this scope|

我的程序是:

#include <iostream>
using namespace std;
int main()
{
    int a[i][j],i,j,s=0,n;
    char x;
    cout<<"n=";
    cin>>n;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
        {
            cout<<"a["<<i<<"]["<<j<<"]=";
            cin>>a[i][j];
        }
    cout<<"Type:"<<x;
    if(x=='1')
    {
        for (i=1;i<=n;i++)
            for (j=1;j<=n;j++)
                s=s+a[i][j];
        cout<<s;
        cout<<"bla bla bla";
    }
    return 0;
}

怎么了?变量在程序开始时声明。提前感谢!

两个问题:第一个是关于你的错误,那就是变量是按照你在源代码中实际执行的顺序声明/定义的。

例如:

int i, j;

在变量i上方的行中,在变量j之前声明了变量。

第二个问题是,在初始化变量之前,您尝试使用变量ij。这意味着它们将具有不确定的值,并且在使用它们时会为您提供未定义的行为

第三点是C++没有可变长度数组,这意味着您实际上不能使用运行时变量声明数组(尽管某些编译器将其添加为不可移植的扩展(。

要解决上述所有问题,您需要使用std::vector(这是我推荐的(,或者使用 new[] 动态分配内存。


还有潜在的第四个问题,这是因为C++中的数组索引是从零开始的。因此,如果您有一个N元素数组,则有效索引从0N - 1(包括(。数组的循环从 1N,这意味着最后一个索引可能超出范围。

与第 6 行一样,错误在于我认为无处允许的部分int a[i][j](甚至在 JavaScript 或 Java 中也不行(,因此变量"i"和"j"只能是常量,如果您的语法必须如此,则在数组声明之前定义了它们的值。你可以选择动态数组声明

 int **a=new int[i];

然后对于所需矩阵的每一列,您可以

for(int z=;z<j;z++)
    a[z]=new int[j];

其中"i"和"j"不仅必须事先声明,而且必须以某种方式定义,如果您有内存限制

或者事先留出足够的空间,然后继续,我个人不喜欢,例如

int a[100001];

随后的错误是相对的,如果处理此问题,则会得到解决。

此外,当您

OutOfBounds(0 到 n-1 而不是 1 到 n(遍历矩阵时会遇到问题,这可能不会在运行时引起任何问题,但可能会导致不正确的数据检索和通过其他代码行进行操作。