C++ (VC 2019)C++;return语句在版本配置中被忽略,在调试中可以正常工作
我有一段简单的代码:C++ (VC 2019)C++;return语句在版本配置中被忽略,在调试中可以正常工作,c++,function,return,visual-studio-debugging,C++,Function,Return,Visual Studio Debugging,我有一段简单的代码: #include <iostream> #include <vector> bool sequence_increase(std::vector<int>& sequence, const int& index) { if (index >= sequence.size()) return true; if (sequence[sequence.size() - index - 1] < 2
#include <iostream>
#include <vector>
bool sequence_increase(std::vector<int>& sequence, const int& index) {
if (index >= sequence.size()) return true;
if (sequence[sequence.size() - index - 1] < 2 * index) {
sequence[sequence.size() - index - 1]++;
return false;
}
else {
if (index == sequence.size() - 1) return true;
else {
sequence[sequence.size() - index - 1] = 0;
sequence_increase(sequence, index + 1);
}
}
}
void pairing(std::vector<int> list, const std::vector<int>& sequence) {
std::vector<int> list_copy;
for (int i = 0; i < sequence.size(); i++) {
int a, b; a = list[0];
list.erase(list.begin());
b = list[sequence[i]];
list.erase(list.begin() + sequence[i]);
std::cout << "(" << a << ", " << b << ")";
}
std::cout << std::endl;
}
void pairings(const int& n) {
std::vector<int> list(2*n);
std::vector<int> seq; seq.resize(n);
for (int i = 0; i < 2 * n; i++) list[i] = i + 1;
bool quit = false;
while (!quit) {
int index = 0;
std::cout << "sequence: ";
for (auto& s : seq) std::cout << s << " "; std::cout << std::endl;
std::cout << "pairing: ";
pairing(list, seq);
quit = sequence_increase(seq, index);
std::cout << "quit? " << quit << std::endl;
}
}
int main() {
pairings(2);
}
映射以$n$数字的顺序进行,其中$n-k$位置上的数字仅上升到$2k-1$(或者,在我的代码中,从0到$2k-2$)。然后在函数void pairing中将这个数字序列转换成一个唯一的配对,据我所知,这很好
为了生成序列中所有可能的组合,我自己使用函数bool sequence_increase,它取一个普通序列,并将其增加1
320 -> 400
(此处结尾处的0已达到其最大值,之前为2,因此它将其归零,并将3增加到4)
序列是这样的
000
010
020
100
110
120
200
..
(较长的序列类似)
知道何时停止是指当预期的增加位置超出范围时,如果(index==sequence.size()-1)返回true,则可以提前一步确保停止函数序列中的code>增加
,表示不能再增加。这将存储在函数对中的变量quit中,这将在(!quit)
循环时停止
问题是:该程序在调试模式(VC 2019)下运行良好,下面是最后一些成功的输出:
如您所见,例程返回true,结束while循环,程序结束
但是,在释放模式下,例程序列_increase永远不会返回true,因此它永远不会结束
我不能把我的头绕在它周围。原因可能是什么?我如何在发布配置上实现这一点?谢谢。问题是,您从未在下返回值
else
{
sequence[sequence.size() - index - 1] = 0;
sequence_increase(sequence, index + 1);
}
由于释放模式在该模式下执行逻辑过程,因此您必须返回sequence\u increase(sequence,index+1)代码>正如约翰尼·莫普(Johnny Mopp)所说的那样(感谢他分享这个技巧),结束循环返回true
建议
因此,请更改为使用此选项:
bool sequence_increase(std::vector<int>& sequence, const int& index) {
if (index >= sequence.size()) return true;
if (sequence[sequence.size() - index - 1] < 2 * index) {
sequence[sequence.size() - index - 1]++;
return false;
}
else {
if (index == sequence.size() - 1) return true;
else {
sequence[sequence.size() - index - 1] = 0;
sequence_increase(sequence, index + 1);
return sequence_increase(sequence, index + 1);
}
}
}
bool序列\u增加(标准::向量和序列,常量int和索引){
if(index>=sequence.size())返回true;
if(sequence[sequence.size()-index-1]<2*index){
sequence[sequence.size()-index-1]+;
返回false;
}
否则{
if(index==sequence.size()-1)返回true;
否则{
sequence[sequence.size()-index-1]=0;
顺序增加(顺序,指数+1);
返回序列_增加(序列,索引+1);
}
}
}
“原因可能是什么?”-未定义的行为可能是原因。例如,并非bool sequence\u increase()
中的所有路径都返回bool
值。您需要返回递归调用的结果:return sequence\u increase(sequence,index+1)代码>打开你的编译器警告,gcc有很多关于你的代码的东西要告诉你:(最后一个是最有趣的一个)或者更好的是,把它们当作错误对待,顺便说一句,VC 2019用默认设置报告问题。是的,没错。在此上下文中,将部件重写为else{sequence[sequence.size()-index-1]=0;return sequence_increase(sequence,index+1);}index==sequence.size()-1
触发警告,当sequence
没有元素时,它将导致问题(但无论如何,在这种情况下,上面的行已经有UB)
bool sequence_increase(std::vector<int>& sequence, const int& index) {
if (index >= sequence.size()) return true;
if (sequence[sequence.size() - index - 1] < 2 * index) {
sequence[sequence.size() - index - 1]++;
return false;
}
else {
if (index == sequence.size() - 1) return true;
else {
sequence[sequence.size() - index - 1] = 0;
sequence_increase(sequence, index + 1);
return sequence_increase(sequence, index + 1);
}
}
}