[英]Comparator -1073741819 (0xC0000005)
我正在尝试使用其他方法比较数组中的数字。 我不确定如何称呼它,而是这样的:
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;
}
Comparator<int>
是一个函数指针类型,它需要2个int
并返回bool
。
这意味着comp
是指向函数的指针。 有什么作用? 您尚未告诉它要使用什么功能。 您需要将其指向如下函数:
bool compare_func(int a, int b) { return a < b; }
...
int main() {
Comparator<int> comp = compare_func;
我究竟做错了什么
comp
是一个未初始化的函数指针,很明显,在模板中调用它会导致崩溃。
另外,您正在传递以字节为单位的数组长度(由sizeof
返回),而函数则需要多个元素。
这种用于比较值的方法的名称是什么?
我猜是“访问冲突”。
要修复代码,您必须编写一个与函数指针的函数签名兼容的比较函数,并使用它来初始化comp
; 同样,通过将n
除以sizeof(int)
修复n
的初始化。
顺便说一句,泛型函数通常会为比较函数接受一个更通用的参数,以便允许库用户将任何可调用的对象(函数,函子,lambda, std::function
等)传递给模板。
您有两个问题:
第一:
int len = sizeof(arr);
该行将为您提供数组的大小*平台中int
的大小。 您只需要数组的大小。 因此,应将其除以int
的大小:
int len = sizeof(arr)/sizeof(int);
第二:
您的Comeratror没有面子。 但是,如果使用如下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;
}
sizeof
为您提供数组大小( 以字节为单位) 。 调用theHell()的len为36(9 intsá4字节)而不是9,因此在访问theHell()中的arr [10]时会遇到内存访问冲突错误。
要获取元素数量,必须使用sizeof(arr) / sizeof(arr[0])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.