Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Wskaźnik do funkcji w języku C

Awatar użytkownika
maxipalia
-
-
Posty:63
Rejestracja:30 lip 2004, o 17:41
Lokalizacja:Gdańsk
Kontaktowanie:
Wskaźnik do funkcji w języku C

Postautor: maxipalia » 17 maja 2005, o 11:00

czy ktos mi moze powiedziec jak bedzie wygladac w języku C:
1) delkaracja wskaźnika funkcji,
2) przypisanie wartosci do tego wskaźnika,
3) no i wykonanie takiej (wskazywanej) funkcji

plz help :D
Ostatnio zmieniony 27 mar 2007, o 14:16 przez maxipalia, łącznie zmieniany 1 raz.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: pomocy dla zawinietego ludka :P

Postautor: pajaczek » 17 maja 2005, o 12:56

czy ktos mi moze powiedziec jak bedzie wygladac w języku C:
1) delkaracja wskaźnika funkcji,
2) przypisanie wartosci do tego wskaźnika,
3) no i wykonanie takiej (wskazywanej) funkcji

plz help :D

Kod: Zaznacz cały

1) int (*p_fun) (); // wskaznik na funkcje bezargumentowa, zwracajaca int 2) p_fun = nazwa_funkcji; // jak wiadomo, nazwa funkcji jest tez adresem jej poczatku, nazwa tablicy jest adresem jej pierwszego elementu, i wogole w C, nazwa jest poczatkiem danej struktury 3) if (p_fun) // if tak sobie, zeby sprawdzic czy pointer wogole na cos wskazuje (*p_fun) ();

Awatar użytkownika
maxipalia
-
-
Posty:63
Rejestracja:30 lip 2004, o 17:41
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: maxipalia » 17 maja 2005, o 13:37

Dzięki wielkie ... :D

[ Dodano: 17-05-2005, 14:50 ]
co mam zrobić żeby było elegncko (kompilator sie burzy : "illegal conversion pointer to integer")

int32 AktualnieWykonywanaFunkcja=0;
void JakasFunkcja (void)
{
//... blebleble...
AktualnieWykonywanaFunkcja = JakasFunkcja
}



z góry dzięki

Awatar użytkownika
ACeK
-
-
Posty:1522
Rejestracja:30 mar 2003, o 19:35
Lokalizacja:Kielce

Postautor: ACeK » 17 maja 2005, o 14:31

:) Info o wskazniku znajdziesz :arrow: tu

A tu masz przyklad jak dziala i jak mozna uzywac przyklady z ksiazki (Teach Yourself C in 21 Days) listing 9.1

Kod: Zaznacz cały

/* Demonstrates basic pointer use. */ #include <stdio.h> /* Declare and initialize an int variable */ int var = 1; /* Declare a pointer to int */ int *ptr; main() { /* Initialize ptr to point to var */ ptr = &var; /* Access var directly and indirectly */ printf("\nDirect access, var = %d", var); printf("\nIndirect access, var = %d", *ptr); /* Display the address of var two ways */ printf("\n\nThe address of var = %d", &var); printf("\nThe address of var = %d\n", ptr); puts ("\nPress Enter to end program "); getchar(); // ACeK return 0; }
listing 9.2

Kod: Zaznacz cały

/* Demonstrates the relationship between addresses and */ /* elements of arrays of different data types. */ #include <stdio.h> /* Declare three arrays and a counter variable. */ int i[10], x; float f[10]; double d[10]; main() { /* Print the table heading */ printf("\t\tInteger\t\tFloat\t\tDouble"); printf("\n================================"); printf("========================="); /* Print the addresses of each array element. */ for (x = 0; x < 10; x++) printf("\nElement %d:\t%lo\t%ld\t\t%ld\t\t%lx", x, &i[x], &f[x], &d[x], &i[x]); printf("\n================================"); printf("=========================\n"); puts ("\nPress Enter to end program "); getchar(); // ACeK return 0; }
listing 9.3

Kod: Zaznacz cały

/* Demonstrates using pointer arithmetic to access */ /* array elements with pointer notation. */ #include <stdio.h> #define MAX 10 /* Declare and initialize an integer array. */ int i_array[MAX] = { 0,1,2,3,4,5,6,7,8,9 }; /* Declare a pointer to int and an int variable. */ int *i_ptr, count; /* Declare and initialize a float array. */ float f_array[MAX] = { .0, .1, .2, .3, .4, .5, .6, .7, .8, .9 }; /* Declare a pointer to float. */ float *f_ptr; main() { /* Initialize the pointers. */ i_ptr = i_array; f_ptr = f_array; /* Print the array elements. */ for (count = 0; count < MAX; count++) printf("%d\t%f\n", *i_ptr++, *f_ptr++); puts ("\nPress Enter to end program "); getchar(); // ACeK return 0; }
:wink:
:D

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 17 maja 2005, o 16:10

Dzięki wielkie ... :D

[ Dodano: 17-05-2005, 14:50 ]
co mam zrobić żeby było elegncko (kompilator sie burzy : "illegal conversion pointer to integer")

int32 AktualnieWykonywanaFunkcja=0;
void JakasFunkcja (void)
{
//... blebleble...
AktualnieWykonywanaFunkcja = JakasFunkcja
}



z góry dzięki
AktualnieWykonywanaFunkcja, jak widac jest typu int32, a Ty probujesz jej przypisac pointer. To nic ze defacto (przy architekturze jakiej domyslam sie ze uzywasz) jest to zapisane w takiej samej liczbie, ale kompilator sie przyburzy. Mozesz sprobowac to rzutowac, wowczas sie nie przyburzy, ale:
a ) rob to jak wiesz co robisz
b ) ladniej bedzie zmienic typ zmiennej AktualnieWykonywanaFunkcja

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 17 maja 2005, o 19:45

A tu masz przyklad jak dziala i jak mozna uzywac przyklady z ksiazki (Teach Yourself C in 21 Days) listing 9.1
Ale kolega pytal o wskazniki do FUNKCJI, a tu ich nie widac ;). Pajaczek wyjasnil podstawy.

Awatar użytkownika
ACeK
-
-
Posty:1522
Rejestracja:30 mar 2003, o 19:35
Lokalizacja:Kielce

Postautor: ACeK » 17 maja 2005, o 20:41

:oops:

Kod: Zaznacz cały

/* Demonstration of declaring and using a pointer to a function.*/ #include <stdio.h> /* The function prototype. */ double square(double x); /* The pointer declaration. */ double (*p)(double x); main() { /* Initialize p to point to square(). */ p = square; /* Call square() two ways. */ printf("%f %f\n", square(6.6), p(6.6)); puts ("\nPress Enter to end program "); getchar(); // ACeK return(0); } double square(double x) { return x * x; }

Kod: Zaznacz cały

/* Using a pointer to call different functions. */ #include <stdio.h> /* The function prototypes. */ void func1(int x); void one(void); void two(void); void other(void); main() { int a; for (;;) { puts("\nEnter an integer between 1 and 10, 0 to exit: "); scanf("%d", &a); if (a == 0) break; func1(a); } return(0); } void func1(int x) { /* The pointer to function. */ void (*ptr)(void); if (x == 1) ptr = one; else if (x == 2) ptr = two; else ptr = other; ptr(); } void one(void) { puts("You entered 1."); } void two(void) { puts("You entered 2."); } void other(void) { puts("You entered something other than 1 or 2."); }
:oops:
:P

tdolata
-
-
Posty:18
Rejestracja:6 gru 2004, o 10:56
Lokalizacja:Poznań

Postautor: tdolata » 19 maja 2005, o 08:01

Zrobiłeś błąd deklarując wskaźnik na funkcję jako 'int32'.
Zrób tak 'void (*AktualnieWykonywanaFunkcja)()' to zadeklaruje zmienna AktualnieWykonywanaFunkcja odpowiedniego typu.
Jeśli dalej będziesz miał jakieś problemy to zdefiniuj nowy typ: 'typedef void (*FuncPtr_t)();'.
Wtedy wskaźnik na funkcje deklarujesz: 'FuncPtr_t AktualnieWykonywanaFunkcja;' i po kłopocie.
Dzięki wielkie ... :D

[ Dodano: 17-05-2005, 14:50 ]
co mam zrobić żeby było elegncko (kompilator sie burzy : "illegal conversion pointer to integer")

int32 AktualnieWykonywanaFunkcja=0;
void JakasFunkcja (void)
{
//... blebleble...
AktualnieWykonywanaFunkcja = JakasFunkcja
}



z góry dzięki

Awatar użytkownika
maxipalia
-
-
Posty:63
Rejestracja:30 lip 2004, o 17:41
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: maxipalia » 19 maja 2005, o 11:16

wielkie dzięki wam wszystkim ...
a co do zmiennej AktualnieWykonywanaFunkcja to jest ona potrzebna tylko i wyłącznie do przekazania informacji o miejscu w którym pojawił się błąd - stąd takie uproszczone zrzutowanie

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości