Wskaźnik do funkcji w strukturze.

Wskaźnik do funkcji w strukturze.
HI
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 2 lata
0

Witam,

Mam takie pytanie, czy jest możliwe zadeklarowanie takiej struktury?

Kopiuj
typedef struct Device_Parameters
{
     int test1;
     int test2;
     ...
     unsigned char ttest;
     void (*functrion)(unsigned int parameter, Device_Parameters* device);
} Device_Parameters;

Jak widać w strukturze znajduje się wskaźnik na funkcję, w której jednym z parametrów jest wskaźnik na tworzoną strukturę.
W chwili obecnej problem rozwiązałem pośrednio:

Kopiuj
typedef struct Device_Parameters
{
     int test1;
     int test2;
     ...
     unsigned char ttest;
     void (*functrion)(unsigned int parameter, unsigned char* device);
} Device_Parameters;

i później w wywołaniu funkcji:

Kopiuj
Device_Parameters Device;
...
Device.Function(tmp, (unsigned char*) &Device);

i samej funkcji:

Kopiuj
void Function1(unsigned int mens, unsigned char* test)
{
     Device_Parameters* device = (Device_Parameters*) test;
     ...
}

Może dałoby się to jakoś uprościć?

Dziękuję i pozdrawiam,
Hiob.

edytowany 1x, ostatnio: HIOB
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Yep, da sie.

Kopiuj
struct Device_Parameters;

typedef void (*function)(unsigned int parameter, struct Device_Parameters* device);
 
typedef struct Device_Parameters
{
     int test1;
     int test2;
     unsigned char ttest;
     function func;
} Device_Parameters;
 
void func(unsigned int a, Device_Parameters* dev)
{
    return;
}
 
int main()
{
    Device_Parameters dev = {10, 20, 15, func};
    dev.func(10, &dev);
    
    return 0;
}

http://ideone.com/iLivLR

Swoja droga, calkiem ciekawy pomysl na imitacje klas :)

edytowany 1x, ostatnio: n0name_l
HI
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 2 lata
0

Dziękuję za bardzo szybką odpowiedź.
Niestety w wyniku kompilacji otrzymuje następujący błąd:

Libraries/Device.h:69: warning: 'struct Device_Parameters' declared inside parameter list
Libraries/Device.h:69: warning: its scope is only this definition or declaration, which is probably not what you want

Kopiuj
typedef void (*Function1)(unsigned int parameter, struct Device_Parameters* device);
edytowany 1x, ostatnio: HIOB
n0name_l
podaj wersje gcc albo inaczej, z kompatybilnoscia do jakiego standardu to kompilujesz?
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
1

Pytanie niewazne, tez moj gcc cos nie trawil tego kodu.

Dodaj na samej gorze cos takiego:

Kopiuj
struct Device_Parameters;

To musi dzialac, bo przelecialem wszystkie standardy od C89 ;>

HI
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 2 lata
0

Działa! :)

Kopiuj
typedef struct Device_Parameters
{
     int test1;
     int test2;
     ...
     unsigned char ttest;
     void (*function)(unsigned int parameter, struct Device_Parameters* device);
} Device_Parameters;

Mógłbys mi wyjaśnić co daje to "struct"?

edytowany 1x, ostatnio: HIOB
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

W skrocie to:
prog.c:1:50: error: unknown type name ‘Device_Parameters’

Co znaczy tyle, ze nazwa ta nie jest znana "w srodku" struktury, bo definiujesz ja poza cialem, wiec trzeba dodac struct.

edytowany 1x, ostatnio: n0name_l
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:15 minut
1

Twój problem wynika z tego, że bezmyślnie dajesz "typedef struct" zamiast samego "struct" nie wiedząc, co ten typedef robi.

edytowany 1x, ostatnio: Azarien
HI
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 2 lata
0

Kolega Azarien chyba jeszcze śpi :)

n0name_l -> wszystko działą i jest ok, chodziło mi o tą linię i co w tym przypadku daje to "struct":

Kopiuj
void (*function)(unsigned int parameter, struct Device_Parameters* device);
edytowany 2x, ostatnio: HIOB
n0name_l
Dokladnie to co napisalem. Jak usuniesz struct to dostaniesz blad, ze nie ma takiej nazwy Device_Parameters, bo jej po prostu w tym zasiegu nie ma.
Azarien
Pytanie "co daje struct" zdradza ze 100% pewnością, że nie wiesz co daje typedef.
_13th_Dragon
@HIOB, kolega @Azarien nie śpi, jedynie można by się nie zgodzić z oceną liczbową "... ze 100% pewnością ...", bo powiedziałbym że z 200% pewnością ;) Ale to już semantyka.
HI
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 2 lata
0

Mój błąd. Zwracam honor! :)

Dziękuję i pozdrawiam!
Hiob.

edytowany 1x, ostatnio: HIOB
Azarien
to jeszcze popraw to functrion :-)
HI
masz mieć :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.