Keil C: function pointers array

Feb 18, 2004 4 Replies

Hello, All!



ðÏÍÏÇÉÔÅ ÎÁÞÉÎÁÀÝÅÍÕ.
ëÁË ÏÂßÑ×ÉÔØ ÓÁÂÖ? åÓÌÉ ÓÌÅÄÏ×ÁÔØ ÒÅËÏÍÅÎÄÁÃÉÉ ÍÁÎÕÁÌÁ (void (*f)(int i); ÄÌÑ ÏÄÉÎÏÞÎÏÇÏ ÕËÁÚÁÔÅÌÑ), ÍÎÅ ÎÉÞÅÇÏ ÌÕÞÛÅÇÏ, ÞÅÍ

void (*MenuGuide)(uchar pre)[] = {(uchar *)MS0, (uchar *)MS1};



× ÇÏÌÏ×Õ ÎÅ ÐÒÉÛÌÏ... HÕ, × ÏÂÝÅÍ, ÈÏÔÅÌÏÓØ ÏÂßÑ×ÉÔØ É ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÍÁÓÓÉ× ÕËÁÚÁÔÅÌÅÊ ÎÁ ÆÕÎËÃÉÉ MS0, MS1, ÞÔÏÂÙ ÐÏÔÏÍ ÉÓÐÏÌØÚÏ×ÁÔØ ÅÇÏ × ÍÅÎÀ-ӣÒÆÉÎÇÅ.
ëÁË ÎÉ ÐÅÒÅÓÔÁ×ÌÑÌ ÓËÏÂÏÞËÉ :), ÏÔ ÒÕÇÁÔÅÌØÓÔ× ËÏÍÐÉÌÅÒÁ ÎÅ ÉÚÂÁ×ÉÌÓÑ.
ðÏËÁ ÒÅÛÉÌ ÐÒÏÂÌÅÍËÕ ÇÏÒÂÁÔÏ: ÓÏÚÄÁÌ ×ÅËÔÏÒ ÁÄÒÅÓÏ× É ÐÏÔÏÍ ËÁÓÔÏÍÉÚÉÒÏ×ÁÌ ÅÇÏ ÜÌÅÍÅÎÔÙ × ÕËÁÚÁÔÅÌÉ ÎÁ ÆÕÎËÃÉÉ ÎÕÖÎÏÇÏ ÔÉÐÁ. HÏ ÎÅËÕÚÑ×Ï ËÁË-ÔÏ.

MenuNode = ((uchar (code *)(uchar)) MenuGuide[MenuNode]) (MenuNode);



úù. ëÅÊÌ ã 6.01. úúù. ëÒÁÅÍ ÕÈÁ ×ÉÄÅÌ × ÜÈÅ (Ó ÍÅÓÑÃÏË ÔÏÍÕ) ËÁËÉÅ-ÔÏ ÏÂÓÕÖÄÅÎÉÑ ×ÁÒÉÁÎÔÏ× ÐÏÓÔÒÏÅÎÉÑ ÍÅÎÀ ÎÁ ÜÈÏÔÁÇÅ. ðÒÏÐÕÓÔÉÌ, ËÁË ÏÂÙÞÎÏ ÂÙ×ÁÅÔ, ÄÕÍÁÌ "ÎÅ ÐÒÉÇÏÄÉÔÓÑ". âÙÌ ÂÙ ÒÁÄ, ÅÓÌÉ Â ÎÅËÉÊ ÄÏÂÒÏÖÅÌÁÔÅÌØ ÏÔÍÙÌÉÌ ÍÎÅ ÜÔÏÔ ÔÒÅÄ.


ó Õ×ÁÖÅÎÉÅÍ, àÒÉÊ ëÒÀÞËÏ× aka àÒÉÊ àÒØÅ×ÉÞ.


YK> Как объявить сабж? Если следовать рекомендации мануала (void (*f)(int i); для YK> одиночного указателя), мне ничего лучшего, чем

YK> void (*MenuGuide)(uchar pre)[] = {(uchar *)MS0, (uchar *)MS1};

YK> в голову не пришло... Hу, в общем, хотелось объявить и инициализировать массив YK> указателей на функции MS0, MS1, чтобы потом использовать его в меню-сёрфинге.

YK> Как ни переставлял скобочки :), от ругательств компилера не избавился.

typedef void (code * MENU_FUNC_T)(char pre);

void MS0 (char pre) { pre = pre; }

void MS1 (char pre) { pre = pre; }

code const MENU_FUNC_T MenuArray[] = {MS0, MS1};

И лучше 6.01 не используй, глюки там.

ðÒÉ×ÅÔ Yiuri!

18 Feb 04 19:33, Yiuri Kruchkov ÐÉÓÁÌ All:

YK> ëÁË ÏÂßÑ×ÉÔØ ÓÁÂÖ? åÓÌÉ ÓÌÅÄÏ×ÁÔØ ÒÅËÏÍÅÎÄÁÃÉÉ ÍÁÎÕÁÌÁ (void (*f)(int YK> i); ÄÌÑ ÏÄÉÎÏÞÎÏÇÏ ÕËÁÚÁÔÅÌÑ), ÍÎÅ ÎÉÞÅÇÏ ÌÕÞÛÅÇÏ, ÞÅÍ

YK> void (*MenuGuide)(uchar pre)[] = {(uchar *)MS0, (uchar *)MS1};

YK> × ÇÏÌÏ×Õ ÎÅ ÐÒÉÛÌÏ... HÕ, × ÏÂÝÅÍ, ÈÏÔÅÌÏÓØ ÏÂßÑ×ÉÔØ É YK> ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÍÁÓÓÉ× ÕËÁÚÁÔÅÌÅÊ ÎÁ ÆÕÎËÃÉÉ MS0, MS1, ÞÔÏÂÙ ÐÏÔÏÍ YK> ÉÓÐÏÌØÚÏ×ÁÔØ ÅÇÏ × ÍÅÎÀ-ӣÒÆÉÎÇÅ.

HÅ ÎÁÄÏ ÓÔÁÒÁÔØÓÑ ÚÁÐÉÈÎÕÔØ ËÕÞÕ ÏÐÒÅÄÅÌÅÎÉÊ × ÏÄÎÏ ×ÙÒÁÖÅÎÉÅ - ÓÁÍ ÚÁÐÕÔÁÅÛØÓÑ É ÄÒÕÇÉÅ ÎÉÞÅÇÏ ÎÅ ÐÏÊÍÕÔ. ïÐÒÅÄÅÌÑÊ ÔÉÐÙ ÐÏÓÔÅÐÅÎÎÏ ÏÔ ÐÒÏÓÔÏÇÏ Ë ÓÌÏÖÎÙÍ. HÁÐÒÉÍÅÒ ÔÁË:

typedef void MenuItem(int);

void item1(int); void item2(int); void item3(int); void item4(int);

MenuItem* MenuGuide[] = { item1, item2, item3, item4 };

HÅ ÐÒÁ×ÄÁ ÌÉ, ÔÁË ÇÏÒÁÚÄÏ ÐÒÏÚÒÁÞÎÅÅ É ÐÏÎÑÔÎÅÅ?

YK> úúù. ëÒÁÅÍ ÕÈÁ ×ÉÄÅÌ × ÜÈÅ (Ó ÍÅÓÑÃÏË ÔÏÍÕ) ËÁËÉÅ-ÔÏ ÏÂÓÕÖÄÅÎÉÑ YK> ×ÁÒÉÁÎÔÏ× ÐÏÓÔÒÏÅÎÉÑ ÍÅÎÀ ÎÁ ÜÈÏÔÁÇÅ. ðÒÏÐÕÓÔÉÌ, ËÁË ÏÂÙÞÎÏ ÂÙ×ÁÅÔ, YK> ÄÕÍÁÌ "ÎÅ ÐÒÉÇÏÄÉÔÓÑ". âÙÌ ÂÙ ÒÁÄ, ÅÓÌÉ Â ÎÅËÉÊ ÄÏÂÒÏÖÅÌÁÔÅÌØ ÏÔÍÙÌÉÌ YK> ÍÎÅ ÜÔÏÔ ÔÒÅÄ.

éÓËÁÔØ ÌÅÎØ, ÍÏÇÕ ×ÙÓÌÁÔØ ÜÔÕ ÜÈÕ ÚÁ ÐÏÓÌÅÄÎÉÅ ÇÏÄ-Ä×Á × JAM. åÓÌÉ ÎÁÄÏ, ÐÉÛÉ ÎÁ alx-ÓÏÂÁÞËÁ-intellectronika.ru ÷ÓÅÇÏ ÎÁÉÌÕÞÛÅÇÏ, [Team PCAD 2000] áÌÅËÓÅÊ í. ... óÔÁÒÙÊ ÇÌÀË ÌÕÞÛÅ ÎÏ×ÙÈ Ä×ÕÈ...

Hello Yiuri.

18 Feb 04 19:33, you wrote to all:

YK> ðÏÍÏÇÉÔÅ ÎÁÞÉÎÁÀÝÅÍÕ.

YK> ëÁË ÏÂßÑ×ÉÔØ ÓÁÂÖ? åÓÌÉ ÓÌÅÄÏ×ÁÔØ ÒÅËÏÍÅÎÄÁÃÉÉ ÍÁÎÕÁÌÁ (void (*f)(int YK> i); ÄÌÑ ÏÄÉÎÏÞÎÏÇÏ ÕËÁÚÁÔÅÌÑ), ÍÎÅ ÎÉÞÅÇÏ ÌÕÞÛÅÇÏ, ÞÅÍ

YK> void (*MenuGuide)(uchar pre)[] = {(uchar *)MS0, (uchar *)MS1};

YK> × ÇÏÌÏ×Õ ÎÅ ÐÒÉÛÌÏ...

ìÕÞÛÅÅ ÔÕÔ ÕÖÅ ÐÏÄÓËÁÚÁÌÉ (ÞÅÒÅÚ typedef), Á ÏÒÉÇÉÎÁÌ ÄÏÌÖÅÎ ÂÙÌ ×ÙÇÌÑÄÅÔØ ÔÁË:

void (*MenuGuide[])(uchar pre) ={MS0,MS1};

Roman

YK> ðÏÍÏÇÉÔÅ ÎÁÞÉÎÁÀÝÅÍÕ.

åÓÔØ ÔÁËÉÅ ÚÁÍÅÞÁÔÅÌØÎÙÅ ÐÒÏÇÒÁÍÍÙ: cdecl É cundecl. äÏÌÖÎÙ ×ÈÏÄÉÔ × ËÏÍÐÌÅËÔ, ×ÍÅÓÔÅ Ó ÓÏÂÓÔ×ÅÎÎÏ ËÏÍÐÉÌÑÔÏÒÏÍ (cc), Á ÔÁËÖÅ Ó cflow. ðÏÓÌÅÄÎÑÑ ÓÔÒÏÉÔ ÇÒÁÆ ×ÙÚÏ×Ï× ÆÕÎËÃÉÊ, ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÐÅÒÅÍÅÎÎÙÈ. á ÜÔÉ Ä×Å ÐÅÒÅ×ÏÄÑÔ ÏÂßÑ×ÌÅÎÉÑ ÎÁ ÑÚÙËÅ C ÎÁ ÁÎÇÌÉÊÓËÉÊ ÑÚÙË, É ÎÁÏÂÏÒÏÔ. éÎÏÇÄÁ ÏÞÅÎØ ÐÏÌÅÚÎÏ ÂÙ×ÁÅÔ...

YK> ëÁË ÏÂßÑ×ÉÔØ ÓÁÂÖ?

äÌÑ ÜÔÏÇÏ ÎÁÄÏ ÍÙÓÌØ ×ÙÒÁÖÁÔØ ÑÓÎÅÅ... ÈÏÔÑ ÂÙ ÎÁ ÅÓÔÅÓÓÔ×ÅÎÎÏÍ ÑÚÙËÅ. òÉÓËÎÕ ÐÒÅÄÐÏÌÏÖÉÔØ, ÞÔÏ ÉÍÅÅÔÓÑ ××ÉÄÕ ÍÁÓÓÉ× ÕËÁÚÁÔÅÌÅÊ ÎÁ ÆÕÎËÃÉÉ:

sysop@pc:sysop$ cundecl declare x as array of pointer to function that expects (int) returning void; void (*x[])(int); YK> åÓÌÉ ÓÌÅÄÏ×ÁÔØ ÒÅËÏÍÅÎÄÁÃÉÉ ÍÁÎÕÁÌÁ (void (*f)(int i); ÄÌÑ YK> ÏÄÉÎÏÞÎÏÇÏ ÕËÁÚÁÔÅÌÑ), ÍÎÅ ÎÉÞÅÇÏ ÌÕÞÛÅÇÏ, ÞÅÍ YK> void (*MenuGuide)(uchar pre)[] = {(uchar *)MS0, (uchar *)MS1};

á ÔÁË ÐÏÌÕÞÁÅÔÓÑ:

declare MenuGuide as pointer to function that expects (uchar) returning array of void; ÷ӣ ÓÏ×ÓÅÍ ÎÅ ÔÁË...

YK> × ÇÏÌÏ×Õ ÎÅ ÐÒÉÛÌÏ... HÕ, × ÏÂÝÅÍ, ÈÏÔÅÌÏÓØ ÏÂßÑ×ÉÔØ É ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ YK> ÍÁÓÓÉ× YK> ÕËÁÚÁÔÅÌÅÊ ÎÁ ÆÕÎËÃÉÉ MS0, MS1, ÞÔÏÂÙ ÐÏÔÏÍ ÉÓÐÏÌØÚÏ×ÁÔØ ÅÇÏ × YK> ÍÅÎÀ-ӣÒÆÉÎÇÅ.

üÈÏÔÁÇ ÎÁ ÏÆÆÔÏÐÉËÅ! void (*MenuGuide[])(char) = {MS0, MS1};

YK> úù. ëÅÊÌ ã 6.01.

äÁ ÈÏÔØ GCC 5.0! ëÁËÁÑ ÒÁÚÎÉÃÁ?

YK> úúù. ëÒÁÅÍ ÕÈÁ ×ÉÄÅÌ × ÜÈÅ (Ó ÍÅÓÑÃÏË ÔÏÍÕ) ËÁËÉÅ-ÔÏ ÏÂÓÕÖÄÅÎÉÑ ×ÁÒÉÁÎÔÏ× YK> ÐÏÓÔÒÏÅÎÉÑ ÍÅÎÀ ÎÁ ÜÈÏÔÁÇÅ. ðÒÏÐÕÓÔÉÌ, ËÁË ÏÂÙÞÎÏ ÂÙ×ÁÅÔ, ÄÕÍÁÌ "ÎÅ YK> ÐÒÉÇÏÄÉÔÓÑ". âÙÌ ÂÙ ÒÁÄ, ÅÓÌÉ Â ÎÅËÉÊ ÄÏÂÒÏÖÅÌÁÔÅÌØ ÏÔÍÙÌÉÌ ÍÎÅ ÜÔÏÔ ÔÒÅÄ.

google ÎÉËÔÏ ÎÅ ÏÔÍÅÎÑÌ.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required