|
|
View previous topic :: View next topic |
Author |
Message |
Nino
Joined: 27 Jan 2005 Posts: 4 Location: Milano Italy
|
C structure don't work |
Posted: Thu Jan 27, 2005 8:53 am |
|
|
Hallo
excuse me for bad english.
Why
#include <16F876.h>
#include <stdio.h>
int maxy;
void (*fzptr)(int evento);
void menuprincipale(int evento);
struct SECONDO
{
int indice;
char nome_item[20];
void (*fogliaptr)(int i);
};
Product an error in "void (*fogliaptr)(int i);"? The error is "Unknown type" and it's referred ti void word.
The same structure work correctly on borlandc 2.0 |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
|
Guest
|
|
Posted: Fri Jan 28, 2005 7:02 am |
|
|
I saw the links and the 3 solution, what is the best? Naturally I must create an application menu too!
The first appear not very good, the 2th it's very shorter and what is UINT?
And in 3th solution what is "const rom struct _cmd_t"? what mean const rom char?
Excuse me for idot question, Nino |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Fri Jan 28, 2005 7:24 am |
|
|
UINT is an unsigned int. Note that several of these examples were not written for the CCS compiler. "const rom" was for the C18 compiler (Microchip). CCS doesn't allow pointers to constants and there handling of pointers to functions isn't that great either. You are going to have to use a switch statement or something like this:
Code: | /*****************************************************************************
This is an example of how to create a const array of function
pointers and call them. It is a bit of a trick to fool the compiler
but seems to work for the cases that I tested.
******************************************************************************/
#if defined(__PCM__)
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#elif defined(__PCH__)
#include <18f452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif
// Here is where we define the start of menu wrappers.
// !!!! Note that it (all wrapper addresses) must be within
// 1024 bytes of the caller
#define MENU_START_ADDRESS 0x200
// This is how many bytes the wrappers take up. You might have to
// set this value high and then determine how many the wrappers actually
// take up. Note that a BRA is usually used for small programs. However
// on a larger program a CALL instruction might be used which will
// require 2 additional bytes
#define FUNC_SIZE 8
// This is where we define our menu wrapper locations
#define MENU1_ADDRESS (MENU_START_ADDRESS)
#define MENU2_ADDRESS (MENU1_ADDRESS+FUNC_SIZE)
#define MENU3_ADDRESS (MENU2_ADDRESS+FUNC_SIZE)
#define MENU4_ADDRESS (MENU3_ADDRESS+FUNC_SIZE)
// Typedef for our function pointer
typedef int (*pFunc)(void);
// Typedef for our menu items
typedef struct {
char name[16];
int16 ptrFunc; // Just tricking the compiler here
} MenuItem;
// Here's that constant array for the menus
const MenuItem Menu[3]={{"String1", MENU1_ADDRESS},
{"String2", MENU2_ADDRESS},
{"String3", MENU3_ADDRESS}};
// These are the real Menus that we want to call
#org 0x2000,0x2100 // org'ed this just to show a CALL insteal of BRA
int RealMenuFunc1(void)
{
int i = 1;
return(i);
}
int RealMenuFunc2(void)
{
int i = 2;
return(i);
}
int RealMenuFunc3(void)
{
int i = 3;
return(i);
}
// These are wrapper menus to make setting the addresses easier.
// It also appears CCS is using a RCALL instruction which limits
// how far the menus can be away from the caller.
#org MENU1_ADDRESS, MENU1_ADDRESS + FUNC_SIZE - 1
int WrapperMenu1(void)
{
return(RealMenuFunc1());
}
#org MENU2_ADDRESS, MENU2_ADDRESS + FUNC_SIZE - 1
int WrapperMenu2(void)
{
return(RealMenuFunc2());
}
#org MENU3_ADDRESS, MENU3_ADDRESS + FUNC_SIZE - 1
int WrapperMenu3(void)
{
return(RealMenuFunc3());
}
void main()
{
int i;
pFunc ptrtofunc;
// Dummy initialization to keep the compiler from complaining
ptrtofunc = WrapperMenu1;
// Assign the address to the function pointer
ptrtofunc = (pFunc)Menu[0].ptrFunc;
// Call the function
i=(*ptrtofunc)();
ptrtofunc = (pFunc)Menu[1].ptrFunc;
i=(*ptrtofunc)();
ptrtofunc = (pFunc)Menu[2].ptrFunc;
i=(*ptrtofunc)();
while( TRUE )
{
}
}
|
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|