未在此范围内声明的矩阵变量
Matrix variable not declared in this scope
我知道这种类型的问题已经提出,但没有一个解决方案帮助我。我想在从键盘敲击键时对矩阵的元素进行总和,但程序给了我下一个错误:
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
之前声明了变量。
第二个问题是,在初始化变量之前,您尝试使用变量i
和j
。这意味着它们将具有不确定的值,并且在使用它们时会为您提供未定义的行为。
第三点是C++没有可变长度数组,这意味着您实际上不能使用运行时变量声明数组(尽管某些编译器将其添加为不可移植的扩展(。
要解决上述所有问题,您需要使用std::vector
(这是我推荐的(,或者使用 new[]
动态分配内存。
还有潜在的第四个问题,这是因为C++中的数组索引是从零开始的。因此,如果您有一个N
元素数组,则有效索引从0
到N - 1
(包括(。数组的循环从 1
到 N
,这意味着最后一个索引可能超出范围。
与第 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(遍历矩阵时会遇到问题,这可能不会在运行时引起任何问题,但可能会导致不正确的数据检索和通过其他代码行进行操作。
- 在将变量声明为引用时,堆在释放后使用
- 静态变量声明和定义
- 在变量声明中使用 for 循环
- 向量索引变量声明(size_t 或 std::vector<DATATYPE>::size_type)
- C++ 类型类的变量声明不命名类型?
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- std::enable_if 更改成员 *变量* 声明/类型
- 在C++中,变量声明左侧的大括号是什么意思?
- 将变量声明为全局变量,然后声明为局部变量 -Shadowing-
- 命名空间内C++变量声明
- 将静态全局变量声明为内联有什么意义吗?
- 如何将一个变量声明为另一个变量的值
- 如何将迭代器变量声明为私有成员变量
- 没有变量声明为函数,但错误:二进制表达式的操作数无效
- 有没有人有书面证据来保证函数中参数的定义方式与普通变量声明相同?
- ClangTool 如何获取变量声明中模板参数的位置?
- 标准与显式自动推导变量声明
- C 静态变量声明怪异链接器错误
- 如何为数组成员变量声明 getter/setter
- 可视C++变量声明