Функционални указатели - извън библиотеката, предупреждение: инициализация от несъвместим тип указател

С ваша помощ най-накрая компилирах код с функционални указатели. Но сега бих искал да направя абсолютно същото, но за функции, които са от "външната" библиотека. typedef, аргументите, флаговете за компилация са 100% добре, получих това предупреждение САМО когато се опитам да извикам функция от външната библиотека (когато написах функция със същия прототип и се опитах да я извикам с този код, беше добре) . Някакви идеи?

#include <stdio.h>
#include <stdlib.h>
#include "libs/outlib.h"

typedef int (*VFUNCV)(int, double);

void call(int which, VFUNCV* fun, int a, double b)
{
    fun[which](a, b);
}

int main()
{
    VFUNCV fun[2] = {outlibfun1, outlibfun2};

    call(0, fun, 3, 4.5);
    return 0;
}

Внимание:

funargs.c: In function ‘main’:
funargs.c:14:5: warning: initialization from incompatible pointer type [enabled by default]
funargs.c:14:5: warning: (near initialization for ‘fun[0]’) [enabled by default]
funargs.c:14:5: warning: initialization from incompatible pointer type [enabled by default]
funargs.c:14:5: warning: (near initialization for ‘fun[1]’) [enabled by default]

И 14-ти ред:

VFUNCV fun[2] = {outlibfun1, outlibfun2};

Декларация от outlibfun: int outlibfun1(int, double);

ДРУГ НЕРАБОТЕЩ (ПРЕДУПРЕЖДЕНИЕ) ПРИМЕР:

#include <stdio.h>
#include <stdlib.h>
#include "libs/outlibz2.h"

typedef unsigned char* (*VFUNCV)(const unsigned char *, unsigned long, unsigned char *);

void call(int which, VFUNCV* fun, const unsigned char *a, unsigned long b, unsigned char * c)
{
    fun[which](a, b, c);
}

int main()
{
    VFUNCV fun[2] = {outlibfun1};

    call(0, fun, "b", 3, "a");
    return 0;
}

person ivy    schedule 07.08.2013    source източник
comment
Какъв е подписът на outlibfun1 и outlibfun2?   -  person Tony The Lion    schedule 07.08.2013


Отговори (2)


Ако вашата функция не е декларирана в същия източник и преди да присвоите указател на функция, имате нужда от extern декларация като

extern int outlibfun1( int, double );

Във вашия случай трябва да ги имате в libs/outlib.h

person Ingo Leonhardt    schedule 07.08.2013
comment
след добавяне на extern декларация получих това: funargs.c:9:23: error: conflicting types for ‘outlibfun1’ libs/outlib.h:114:16: note: previous declaration of ‘outlibfun1’ was here - person ivy; 07.08.2013
comment
Какво е ред 9? Така или иначе грешката показва, че има нещо нередно с декларацията на outlibfun1(). - person Ingo Leonhardt; 07.08.2013
comment
Потърсих MD4() в „моята“ заглавка (от 0.9.8.a) и открих, че вторият параметър е size_t вместо unsigned long. Това не е непременно същото. - person Ingo Leonhardt; 07.08.2013
comment
Е, вие инициализирате своя масив TEST_HMAC_FUN fun1[2] = {EVP_sha1, EVP_md5}, но EVP_sha1() и EVP_md5() са const EVP_MD *EVP_...(void), което е напълно различно от HMAC() и вашето typedef - person Ingo Leonhardt; 08.08.2013

Изглежда, че outlibfun1/outlibfun2 не споделят същия функционален подпис. Бихте могли да дадете техните определения, за да изясните нещата.

person nikpel7    schedule 07.08.2013