我正在尝试使用其他方法比较数组中的数字。我不知道它是怎么称呼的,但就是这样:
template<typename T>
using Comparator = bool(*)(T, T);
我的代码得到了构建,但是当我启动它时,它在这一行崩溃了:
if(comp(arr[i], arr[i+1])){
错误消息:-1073741819(0xC0000005)
我做错了什么以及这种比较值的方法的名称是什么?
#include <iostream>
using namespace std;
template<typename T>
using Comparator = bool(*)(T, T);
template<typename T>
void theHell(T arr[], int len, Comparator<T> comp){
for(int i = 0; i < len - 1; i++){
if(comp(arr[i], arr[i+1])){
cout << "pice of code" << endl;
}
}
}
int main()
{
int arr[] = { 1, 3 ,3 ,4, 4, 67, 5, 32, 4};
Comparator<int> comp;
int len = sizeof(arr);
theHell(arr, len, comp);
return 0;
}
答案 0 :(得分:3)
Comparator<int>
是一个函数指针类型,需要2 int
s并返回bool
。
这意味着comp
是指向函数的指针。什么功能?你还没告诉它使用什么功能。你需要将它指向一个类似的函数:
bool compare_func(int a, int b) { return a < b; }
...
int main() {
Comparator<int> comp = compare_func;
答案 1 :(得分:1)
我做错了什么
comp
是一个未初始化的函数指针,显然你在模板中调用它时会崩溃。
此外,您传递的数组长度以字节为单位(由sizeof
返回),而您的函数需要许多元素。
这个比较值的方法的名称是什么?
“访问违规”,我想。
要修复代码,必须编写与函数指针的函数签名兼容的比较函数,并使用它来初始化comp
;另外,通过将n
除以sizeof(int)
来修复std::function
的初始化。
顺便提一下,泛型函数通常接受比较函数的更通用的参数,因此允许库用户传递任何可调用的函数(无论是函数,函子,lambda,id
,...)到模板。
答案 2 :(得分:1)
你有两个问题:
<强>首先强>
int len = sizeof(arr);
此行将为您提供数组的大小*您平台中int
的大小。你只需要你的数组大小。因此,您应该将其除以int
:
int len = sizeof(arr)/sizeof(int);
<强>第二强>
你的追随者没有任何定义。但是,如果您使用std::function
,可能会更好:
#include <iostream>
#include <functional>
template<typename T>
void theHell(T arr[], int len, std::function<bool(int,int)> comp){
for(int i = 0; i < len - 1; i++){
if(comp(arr[i], arr[i+1])){
cout << "pice of code" << endl;
}
}
}
int main()
{
int arr[] = { 1, 3 ,3 ,4, 4, 67, 5, 32, 4};
auto comp=[](auto a,auto b){return a<b;};
int len = sizeof(arr)/sizeof(int);
theHell(arr, len, comp);
return 0;
}
答案 3 :(得分:0)
sizeof
为您提供数组(以字节为单位)。使用len(36intsá4字节)而不是9来调用theHell(),因此在访问地狱()中的arr [10]时会出现内存访问冲突错误。
要获取必须使用的元素数量sizeof(arr) / sizeof(arr[0])