1

このようなパラメーターを期待する関数があります

void priqueue_init(priqueue_t *q, int(*comparer)(void *, void *))

任意の型の引数を取ることができるようにしたい。

別のファイルで、最初に typedef

typedef int (*comp_funct)(job_t*, job_t*);

そして渡したい機能は…

int fcfs_funct1(job_t* a, job_t* b)
{
  int temp1 = a->arrival_time;
  int temp2 = b->arrival_time;

  return (temp1 - temp2);
}

priqueue_init への呼び出し:

priqueue_init(pri_q, choose_comparator(sched_scheme));

そして最後に、私の choose_comparator 関数:

comp_funct choose_comparator(scheme_t scheme)
{
    if (sched_scheme == FCFS)
        return fcfs_funct1;

    return NULL;
}

priqueue_init の呼び出しでエラーが発生しました。

    libscheduler/libscheduler.c: In function ‘add_to_priq’:
libscheduler/libscheduler.c:125:3: error: passing argument 2 of ‘priqueue_init’ from incompatible pointer type [-Werror]
In file included from libscheduler/libscheduler.c:5:0:
libscheduler/../libpriqueue/libpriqueue.h:25:8: note: expected ‘int (*)(void *, void *)’ but argument is of type ‘comp_funct’

どこでハングアップしますか? priqueue_init が定義されているファイルは、タイプ job_t を認識していません。無効な引数を使用することが道だと思いました。

4

2 に答える 2

3

int (*comparer)(void *, void *)int (*comp_funct)(job_t*, job_t*)互換性のあるタイプではありません。一致するように変更するか、タイプキャストを追加してください。

ポインタ(void *そしてjob_t *あなたの場合)は同じサイズである必要はないので、コンパイラは正しくエラーを出しています。それらほとんどのマシンで同じサイズであるため、単純なタイプキャストで問題を解決できる可能性がありますが、潜在的な非移植性を導入することになります。

于 2013-10-23T21:46:47.523 に答える
2

関数型シグネチャと互換性を持たせるには、比較関数はvoid*パラメーターを取り、それらを内部でキャストする必要があります。

int fcfs_funct1(void* a, void* b)
{
  int temp1 = ((job_t*)a)->arrival_time;
  int temp2 = ((job_t*)b)->arrival_time;

  return (temp1 - temp2);
}
于 2013-10-23T21:48:44.980 に答える