ponteiros para função socorro [quase resolvido]

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

ponteiros para função socorro [quase resolvido]

Mensagempor cristian » 16 Dez 2010 16:33

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;
              }
}

Editado pela última vez por cristian em 27 Dez 2010 09:16, em um total de 1 vez.
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor Red Neck Guy » 16 Dez 2010 16:56

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.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor cristian » 16 Dez 2010 17:50

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);
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor cristian » 17 Dez 2010 07:14

é 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 ?
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor cristian » 26 Dez 2010 12:50

menu feito por ponteiros de funçao

ainda tenho q terminar , mas a estrutura esta pronta

http://www.youtube.com/watch?v=cTf9zxN7ru4
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x