繁体   English   中英

比较器-1073741819(0xC0000005)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM