Página 1 de 1

ponteiros para função socorro [quase resolvido]

MensagemEnviado: 16 Dez 2010 16:33
por cristian
ja estou injuriado com este mikroc , essa peste so da erro ..... o mplab c18 ta rodando blza....



este codigo abaixo da erro de

102 364 Recursion or cross-calling of

como se tivesse chamando a mesma funçaõ ne isso ..mas nao ta


Código: Selecionar todos

typedef struct
{
        char MenuItemType;
        char *MenuItemText;
        char *MenuItemPntr;
} MENU_ITEM;



 MENU_ITEM MainMenu[] =
            {
                 {1, "MENU L1",SelectAp},
                 {2, "MENU L2",SelectAp },
                 {MENU_ITEM_END_OF_MENU,"","\0"}
            };



 static void SelectAp(char)
{
glcd_text35(0,0,"CERTO",1);


}


static void MenuPrincEventHandle(char x)
{ void (*CommandPntr)(char);

       switch(BtnEvent)
              {
              case  DOWN_BUTTON_IDX:

                                    selectMenu(CurrentMenuItemIDX+1);

              break;
              case  UP_BUTTON_IDX:

                                    selectMenu(CurrentMenuItemIDX-1);

              break;
              case  OK_BUTTON_IDX:

                   // SelectAp(1);  // AQUI CHAMA A FUNÇAO SEM ERRO

   CommandPntr = CommandPntr= (void (*)(char)) CurrentMenuTable[MenuIdx].MenuItemPntr;
 (*CommandPntr)(1); // MAS AQUI DA ERRO
 


              break;
              }
}


MensagemEnviado: 16 Dez 2010 16:56
por Red Neck Guy
Alguns compiladores lidam com isso de forma diferente, então vou me basear no que acontece no IAR, Keil e Codewarrior pra te responder.


a tua declaração:
Código: Selecionar todos
...
char *MenuItemPntr;


é uma declaração para ponteiro para um char, logo é um endereço dentro da RAM que no PIC é outro banco e tem outro comprimento....

A tua inicialização:
Código: Selecionar todos
...
{1,"MENU L1",SelectAp}
...

Lá dentro tu passa um ponteiro para uma função no lugar do ponteiro para função, são tipos de dados diferentes. Pelos outros episódios aqui do fórum eu suspeito que o MicroC seja bem exigente com a tipagem dos dados, por essa razão, o erro.
Para resolver tu poderia realizar um casting explicito, como :
Código: Selecionar todos
...
{1,"MENU L1",(char*)SelectAp}
...


ou então la na declaração da tua estrutura colocar o MenuItemPntr como um ponteiro para função,assim:
Código: Selecionar todos
...
void(*funcApp)(char par);
...



qq coisa é só me xingar, ou se não xingar, outros xingarão por essa resposta.

MensagemEnviado: 16 Dez 2010 17:50
por cristian
so que tem o seguinte ...

este codigo executado fora da funçao nao da erro

Código: Selecionar todos
   CommandPntr = CommandPntr= (void (*)(char)) CurrentMenuTable[MenuIdx].MenuItemPntr;
 (*CommandPntr)(1);

MensagemEnviado: 17 Dez 2010 07:14
por cristian
é velho vou desistir do mikroc neste projeto q estou fazendo ...o cara nao aceita ponteiros pra funçao colocado numa struct ...


vou fazer no C18 .... sera q a eficiencia é a mesma ?

MensagemEnviado: 26 Dez 2010 12:50
por cristian
menu feito por ponteiros de funçao

ainda tenho q terminar , mas a estrutura esta pronta

http://www.youtube.com/watch?v=cTf9zxN7ru4