比较器-1073741819(0xC0000005)

时间:2016-05-17 06:00:29

标签: c++

我正在尝试使用其他方法比较数组中的数字。我不知道它是怎么称呼的,但就是这样:

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;
}

4 个答案:

答案 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])