对于游戏策划者,我需要生成所有可能的猜测。
我想将它们放在list<char[]>
中。
我仍然收到关于push_front
的错误。
有人可以帮我吗?
void Mastermind::genereercodes (int getal, list<char[]> mogelijkeGok)
{
char gok[aantGaatjes+1]; //aantGaatjes is an integer
for (int i = 0; i < aantGaatjes; i++){
gok[i] = (getal % aantKleuren) + '0'; //aantKleuren is an integer
getal = getal / aantKleuren;
} // for
mogelijkeGok.push_front (&gok);
} // genereercodes
这是我得到的错误:
mastermind.cc: In member function ‘void Mastermind::genereercodes(int,std::__cxx11::list<char []>)’:
mastermind.cc:200:32: error: no matching unction for call to ‘std::__cxx11::list<char []>::push_front(char *)[(((Mastermind*)this)->Mastermind::aantGaatjes + 1)])’
mogelijkeGok.push_front (&gok);
答案 0 :(得分:1)
您无缘无故使用C样式数组。有两种可能的替代:std::array
和std::vector
。既然我们知道:
用户需要放弃aantGaatjes的值,因此在程序运行之前您不知道该值。
这只会在桌上留下std::vector
。需要修复的另一件事是使用输出参数,除了在代码中未正确完成之外,无论如何都是不好的做法。然后,代码变为:
std::vector<char> Mastermind::genereercodes (int getal)
{
std::vector<char> gok(aantGaatjes+1);
for (char& e : gok) {
e = (getal % aantKleuren) + '0';
getal = getal / aantKleuren;
}
return gok;
}
这不处理追加到列表,也不需要这样做。拥有该列表的呼叫者可以像这样简单地调用它:
mogelijkeGok.push_front(genereercodes(getal));
答案 1 :(得分:0)
您的代码有几个问题;删除不相关的行:
void Mastermind::genereercodes (int getal, list<char[]> mogelijkeGok)
{
char gok[aantGaatjes+1]; // (1)
mogelijkeGok.push_front (&gok); // (2), (3)
}
除非aantGaatjes
是一个编译时间常数,否则您将创建一个所谓的“可变长度数组”。这是在C99中引入的(在我和其他人的眼中是严重的错误),但是它不是有效的C ++。尽管有些编译器支持它作为扩展(例如,GCC)。
依靠编译器扩展使您的代码不可移植,另一个编译器可能不会提供相同的支持,因此除非您别无选择,否则不要使用扩展。
此行的第一个问题是您用&gok
生成的指针类型:它将是指向特定长度数组(char(*)[SomeLength]
)的指针,而不是char的指针。如果需要后者,则只需将数组本身作为参数传递,它会自动衰减为指针(但由于(3),我不会明确显示!)。
gok
是局部变量,因此在退出函数时将立即被销毁。然后,列表中剩下的就是指向很久以前已失效的某个对象的指针,即i。 e。悬空的指针,使用它会导致不确定的行为!
要解决第三个问题,您需要创建一个具有动态存储持续时间的数组,即。 e。 char* gok = new char[...];
。这将同时解决第一个问题。 但是 ,然后您需要在以后的某个时间进行适当的销毁,否则将导致内存泄漏。但是,有两种数据类型可以自动执行此操作:std::vector
和std::array
。 (实际上,还有更多,但是这两个是最常用的。)
如果产生的所有数组的长度都相同,则可以使用std::array
,否则需要使用std::vector
。您还将更改数据结构,因此您的函数可能如下所示:
void Mastermind::genereercodes (int getal, std::list<std::vector<char>> mogelijkeGok)
{
std::vector<char> gok;
gok.reserve(aantGaatjes+1); // not absolutely necessary, but prevents re-allocations
// so always good idea to use if you know size in advance
for (int i = 0; i < aantGaatjes; i++)
{
gok.push_back(getal % aantKleuren + '0');
getal /= aantKleuren;
// ^ effectively does the same, but less to write and better to read...
}
mogelijkeGok.push_front(std::move(gok)); // move semantics, prevents unnecessary copy
}
进一步优化,避免移动:
mogelijkeGok.emplace_front();
std::vector<char&> gok = mogelijkeGok.front();
gok.reserve(aantGaatjes+1);
// rest as was, but no push_front, of course...
如果您选择std::array
,则应该使用优化的变体,因为std::array
无法移动其内部数组,充其量不能移动其数组元素(在特定情况下,但是),因此您总是在推到最前面时复制阵列。
答案 2 :(得分:-6)
您要在char数组列表中添加对char数组的引用:
void Mastermind::genereercodes (int getal, list<char[]> mogelijkeGok)
{
char gok[aantGaatjes+1]; //aantGaatjes is an integer
...
mogelijkeGok.push_front (&gok);
}
应为:
void Mastermind::genereercodes (int getal, list<char[]> mogelijkeGok)
{
char gok[aantGaatjes+1]; //aantGaatjes is an integer
...
mogelijkeGok.push_front (gok);
}