【问题标题】:Matrix variable not declared in this scope未在此范围内声明的矩阵变量
【发布时间】:2016-04-03 09:35:04
【问题描述】:

我知道已经提出过此类问题,但没有一个解决方案可以帮助我解决问题。 当从键盘按下一个键时,我想计算矩阵元素的总和,但程序给了我下一个错误:

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,a[i][j],s=0,n; VLA 不是标准 C++ BTW,而且您声明它的方式毫无用处。
  • 这甚至不是一个合适的 VLA。

标签: c++ matrix sum


【解决方案1】:

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

例如:

int i, j;

在上面的行中,变量i被声明之前变量j

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

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

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


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

【讨论】:

  • 我输入了int i,j,a[100][100],s=0,n;,它解决了我的问题。谢谢!
  • @Ionut 继续阅读我的答案,因为它仍然是错误的。它不会导致编译器错误,但应该给你警告。如果您没有收到警告,则启用更多警告,因为来自编译器的警告与修复实际错误一样重要。
【解决方案2】:

与第 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) 在运行时可能不会导致任何问题,但可能会导致不正确的数据检索并通过其他代码行进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多