我试图编译,但我得到这些错误:
1>.\item.cpp(123) : warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
1>.\commands.cpp(1372) : error C2057: expected constant expression
1>.\commands.cpp(1372) : error C2466: cannot allocate an array of constant size 0
1>.\commands.cpp(1372) : error C2133: 'buffer' : unknown size
第123行item.cpp
if((bool)random_range(0, 1))
第1372行commands.cpp
if(money < changeSexPrice)
{
char buffer[70 + changeSexPrice];
sprintf(buffer, "You do not have enough money. You need %d gold coins to change your sex.", changeSexPrice);
player->sendCancel(buffer);
return false;
}
任何想法?
答案 0 :(得分:2)
您的问题是char buffer[70 + changeSexPrice];
。在进行堆栈分配时,win32编译器需要一个常量表达式。
我不确定你为什么要添加changeSexPrice,因为你只使用缓冲区来打印int。我敢打赌,如果你选择char buffer[1024]
这样的东西,那么你将有足够的需求。
编辑:根据评论(非常好)。
如果使用len 1024的固定大小缓冲区,请使用snprintf。在Visual Studio中,这是sprintf_s。您的代码将更改为:
sprintf_s(buffer, 1024, "You don't have enough money ...", yourValueHere);
或者,Mark B presents an answer也不需要你自己的内存分配。
答案 1 :(得分:1)
声明基于堆栈的可变长度数组是gcc扩展(也可能是其他扩展)。使用ostringstream
进行格式化:
if(money < changeSexPrice)
{
std::ostringstream os;
os << "You do not have enough money. You need " << changeSexPrice << " gold coins to change your sex.";
player->sendCancel(os.str().c_str()); // This assumes that sendCancel doesn't take ownership of its parameter.
return false;
}
答案 2 :(得分:0)
if((bool)random_range(0, 1))
更好地写下:
if(random_range(0, 1) == 1)
这更清晰,警告将消失。