【发布时间】:2020-03-30 04:12:48
【问题描述】:
我目前正在开发一个程序,该程序使用模板函数从数字数组中获取模式。该代码将在我的 macOS 上使用 g++ 毫无问题地编译(即没有错误、警告等)。但是,当我运行代码时,我会在终端中得到以下输出:
Segmentation fault: 11
这是我的代码:
#include <stdexcept>
#include <cstdio>
#include <cstddef>
template<typename T>
T mode(const T* values, size_t length) {
if (length < 0) throw std::out_of_range{ 0 };
T result{};
int number = values[0];
int count = 1;
int countMode = 1;
for (int i = 1; i < length; i++) {
if (values[i] == number) {
countMode++;
}
else {
if (count > countMode) {
countMode = count;
result = number;
}
count = 1;
number = values[i];
}
}
if (sizeof(result) > 1) throw std::range_error{ 0 };
else {
return result;
}
}
int main() {
const int arr[] = { 1, 4, 1, 2, 7, 1, 2, 5, 3, 6 };
int arr_size = sizeof(arr) / sizeof(arr[0]);
const auto result = mode<int>(arr, arr_size);
printf("Mode = %d\n", result);
}
我得到了我的部分代码here
预期的输出是这样的:
"Mode = 1"
【问题讨论】:
-
length < 0永远不会为真,因为length是无符号类型。if (sizeof(result) > 1)应该检查什么?这将永远是正确的。 -
在调试器中运行您的程序(例如
gdb),它会告诉您发生分段错误的位置。如果您不明白为什么会在那个地方发生,请将此信息添加到您的问题中。 -
你这里使用的编译器是什么版本的?
-
代码编译不会有问题 -- 程序编译成功只意味着程序没有语法错误。它与程序是否有逻辑错误无关。如果程序编译正常是程序正常工作的唯一要求,那么就不会有错误这样的事情。还有how to debug small programs
-
你想完成什么?例如
int number = values[0]不是 T 吗?数组的第一个位置应该有什么特别的东西吗?
标签: c++ templates unix visual-studio-code g++