本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Is there a way to initialize an array with non-constant variables? (C++)
号
我有以下代码:
vector> vinciP;
int myLines = -1;
myLines = drawPolyLineFile("vinci.dat", vinciP);
if (myLines > -1)
{
cout <
SUCCESS";
vec2 vPoints[myLines];
for (int i = 0; i < NumPoints; ++i)
{
vPoints[i] = vinciP[0][i];
}
}
我在"vec2 vpoints[mylines]行中得到一个错误,这表示表达式必须有一个常量值。我不明白为什么会有这个错误,有什么帮助吗?
是因为我的线可能是负数吗?IDK。
vector> vinciP可能不在VC++编译。对于便携性,将是一个更好的做法,vector> vinciP
vec2 vPoints[myLines];
因为EDCOX1的0Ω不是一个const表达式(也就是说,它在编译时不知道),所以上面的代码声明了一个在C++中不允许的可变长度数组。只有C99具有此功能。编译器可能将此作为扩展(但不是标准C++)。
这种常见问题的解决办法是:使用std::vector作为:
std::vector vPoints(myLines);
号
现在应该可以了。
GCC将此可用作C++模式的扩展。让我吃惊的是,这个特性并没有将其管理成C++。
在C99中引入了VLA,C++是基于C98的,在C99引入VLA的时候,C++已经有向量,所以他们从来没有迫切需要它。
Als,我不知道"C++是基于C98",我假设你指的是0x,也许我应该为这个问题创建一个单独的问题,但是STD::向量的存在并不能真正说服我VLAS的不可用性。
@ CaptainGiraffe:事实上,EDCOX1的0可用性可以在C++中提供很多倍,但是似乎有太多的工作要做才能使这些在C++中工作。下面是一个讨论这个问题的线索。
@CaptainGiraffe:不需要创建另一个主题:已经有人创建了这个主题。请参见:stackoverflow.com/questions/7458857/&hellip;
@ALS,非常相关的线索,谢谢。JS-李特又一次去营救了,不远了吗?是我的责任。我会在你的答复中提出一些反驳意见,但加起来我很好。
上面的c98是一个打字错误。C++是以C89为基础的。C++ 11采用了C99的一些特征,但没有VLAs。VLAs可能永远不会出现在C++中。考虑"无效FO(int(&;ARR)(10))";在C++中,数组的大小是其类型的一部分,并用于类型检查,而VLAs根本无法这样工作。
@Barnes是的(当然是C89)提供的链接使这些非C的复杂性非常清楚。谢谢。
是因为我的线可能是负数吗?不,这是因为myLines不是编译时常量。
说明:
vec2 vPoints[myLines];
创建一个可变长度的数组,其中myLines值将在运行时确定。在C++中不允许使用可变长度数组。这是C99中引入的一个特性,C++标准不支持它。一些C++编译器支持它作为一个扩展,但它仍然是非标准的一致性。
对于C++,数组的大小应该在编译时知道,因此必须是编译时常数。myLines不是编译时常量,因此是错误。
你应该使用一个STD::向量
因为静态数组需要一个静态(常量)大小,所以会出现这个错误。由于vPoints中的组件数量是动态的,因此考虑使用动态数组。或者最好还是坚持使用vector。
C++没有可变长度数组。数组的大小必须在编译时确定。EDOCX1的值(0)只在运行时知道,因此这不起作用。
要使数组只有在运行时才知道其大小,请使用std::vector。
std::vector vPoints(myLines);
号
vec2 vPoints[myLines];
数组大小必须是编译时常量。myLines不是编译时常量。相反,使用新的甚至更好的内存分配来使用std::vector。
使用new是错误的!不要使用new,学习没有new编程。这里不需要new!
+ 1,我知道EDOCX1,1,EDCOX1,6,C++。