(VC 2019) C++ return 语句在发布配置中被忽略,在调试中工作正常
(VC 2019) C++ return statement ignored in release configuration, works fine in debug
我有这段简单的代码:
#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);
}
为了解释,我想生成一个包含 $2n$ 个元素的列表的所有配对,例如
(12)(34)
(13)(24)
(14)(23)
映射采用 $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
..
(较长的序列类似)
要知道什么时候停止是什么时候打算增加的位置越界,这是由if (index == sequence.size() - 1) return true;
在函数sequence_increase
中提前一步确保的,这表明它不能再增加了。这将存储在函数对中的变量 quit 中,这应该会停止 while(!quit)
循环。
这是问题所在:程序在调试模式下运行良好(VC 2019),这是最后一些成功的输出:
如您所见,例程返回 true,while 循环结束,程序结束。
但是,在发布模式下,例程 sequence_increase 永远不会 returns 为真,因此它永远不会结束
我无法理解它。可能是什么原因?我怎样才能使它在发布配置上工作?谢谢。
问题是您从未return低于
的值
else
{
sequence[sequence.size() - index - 1] = 0;
sequence_increase(sequence, index + 1);
}
因为 Release模式在其下执行一个逻辑过程,你必须return sequence_increase(sequence, index + 1);
就像Johnny Mopp 说(感谢他分享技巧)结束循环到 return 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);
}
}
}
我有这段简单的代码:
#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);
}
为了解释,我想生成一个包含 $2n$ 个元素的列表的所有配对,例如
(12)(34)
(13)(24)
(14)(23)
映射采用 $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
..
(较长的序列类似)
要知道什么时候停止是什么时候打算增加的位置越界,这是由if (index == sequence.size() - 1) return true;
在函数sequence_increase
中提前一步确保的,这表明它不能再增加了。这将存储在函数对中的变量 quit 中,这应该会停止 while(!quit)
循环。
这是问题所在:程序在调试模式下运行良好(VC 2019),这是最后一些成功的输出:
如您所见,例程返回 true,while 循环结束,程序结束。
但是,在发布模式下,例程 sequence_increase 永远不会 returns 为真,因此它永远不会结束
我无法理解它。可能是什么原因?我怎样才能使它在发布配置上工作?谢谢。
问题是您从未return低于
的值 else
{
sequence[sequence.size() - index - 1] = 0;
sequence_increase(sequence, index + 1);
}
因为 Release模式在其下执行一个逻辑过程,你必须return sequence_increase(sequence, index + 1);
就像Johnny Mopp 说(感谢他分享技巧)结束循环到 return 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);
}
}
}