Wskażnik do funkcji, warning: initialization from incompatible pointer type

0

Pytałem wcześniej o skrócenie kodu... skorzystałem ze sposobu podanego przez @n0name_l, jednak mam z nim pewien problem. Chcę napisać wskaźniki do funkcji zadeklarowanych gdzieś indziej (funkcje zewnętrznej biblioteki), ale dołączam niezbędny nagłówek do swojego pliku, jednak mam pewien warning z którym nie wiem jak sobie poradzić. Oto kod:

#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] = {outlibfun2, outlibfun2};

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

Ścieżki, argumenty, typedef i opcje kompilacji są w porządku - sprawdzałem i na 100% jest ok. Problem jest tylko, jeśli korzystam z funkcji zewnętrznej biblioteki. Jakieś pomysły?

Oto warning:

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

Linia 14 to linia:

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

0
void call(int which, VFUNCV* fun, int a, double b)

!=

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

W sumie to sie rozpisze.

Ten wskaznik do funkcji, moze wskazywac na dowolna funkcje zwracajace wartosc typu int i przyjmujaca 2 argumenty: typu int oraz typu double.
Ty natomiast starasz sie tam wrzucic funkcje przyjmujaca 3 argumenty. Stad tez to jest blad.

0

Ok, zmieniłem:

#include <stdio.h>
#include <stdlib.h>
#include "outlib.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] = {outfun1, outfun2};

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

Ale błąd nadal ten sam, przy linii:

VFUNCV fun[2] = {outfun1, outfun2};

.

0

Dobra, mam. W nowszej wersji biblioteki zamiast unsigned long użyli size_t a ja patrzałem na starą dokumentację ... dzięki raz jeszcze ;)

0

Nie rozumiesz kompletnie o co z tym chodzi, a nie za bardzo wiem jak to prosciej wytlumaczyc niz w poscie wyzej, wiec dam pare przykladow:

typedef void (*FUN1)(void);
void Funkcja1() {} 		// pasuje do wskaznika FUN1
typedef void (*FUN2)(int, double);
void Funkcja2(int a, double b) {} 		// pasuje do wskaznika FUN2
typedef int (*FUN3)(int, double);
int Funkcja3(int a, double b) {} 		// pasuje do wskaznika FUN3
0

@noname_l dziękuję, teraz już chyba rozumiem. poczytam o tym jeszcze gdzieś w internecie, dzięki!

1

w większości przypadków działa taka zasada:

jeśli funkcja wygląda tak:

void Foo(int a, double b)

to zmienna-wskaźnik na funkcję wygląda tak

void (*Foo)(int a, double b)

/czyli poprzedzamy „nazwę funkcji” gwiazdką i obejmujemy nawiasem/

a definicja typu wygląda tak

typedef void (*Foo)(int a, double b)

/czyli tak jak zmienna, tylko ze słowem typedef na początku/

0

@Azarien: dziękuję. Jeszcze mam pytanie odnośnie "narzutu". Czy szybciej jest wywołać funkcję "wprost", czy przez wskaźnik, czy nie ma to znaczenia? Tak na logikę to wg mnie wprost wołając jest szybciej, ale nie jestem przekonany, czy mam rację ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1