|
|
View previous topic :: View next topic |
Author |
Message |
sssssss Guest
|
function pointers and eeprom |
Posted: Mon Apr 21, 2008 6:05 am |
|
|
Hello I have two questions.
Question 1.
I am creating a menu driven type system using a PIC18F8520. Instead of using many switch case statements trying to implement function pointers. However I get a weird error message of recursion. Can someone explain to me why this is? (I think I know what recursion is: “ function calling itself ” in simple terms). Below is a explanation.
Example
Code: |
Void mainMenu();
Void Menu1(){};
Void Menu2(){};
Void Menu3(){};
Void Menu4(){};
Void subMenu1_1(){};
Void subMenu1_2){};
Void subMenu1_3(){};
Void subMenu1_4(){};
typedef void (*pt1Function)(); /* used for function pointer type */
Void MainMenu(){
char selection_off_choice =0;
pt1Function funcSelection[4] =
{& Menu1,& Menu1,&Menu1,& Menu1}; /* Function array */
while(button2Pressed == false){
if(buttonPressed) {// scroll along next function
if(selection_off_choice < 4) selection_off_choice++;
else selection_off_choice = 0;
(*funcSelection [selection_off_choice])(); /* only used for displaying highlighted options */
}
}
}
|
Just say in my Menu1 function I have the same as MainMenu() it has sub menus therefore what to use function pointers. This is where the problem lays I get a recursion error for Menu1(). Why is this? (Please note to get round at the moment I will use a switch statement in all sub menus. )
Code: |
Void Menu1(){
char selection_off_choice =0;
pt1Function funcSelection[4] =
{& subMenu1_1,& subMenu1_2,& subMenu1_3,& subMenu1_4}; /* Function array */
while(button2Pressed == false){
if(buttonPressed) {// scroll along next function
if(selection_off_choice < 4) selection_off_choice++;
else selection_off_choice = 0;
(*funcSelection[selection_off_choice])(); /* only used for displaying highlighted options */
}
}
}
|
Question 2:
Inbuilt EEPROM, what is the best way of saving struct types; Do I have to go through each element in the struct one at a time and save or is there a easier way??
I am using CCS version 4.062 and MPLab 8V
Thanks
[/code] |
|
|
Matro Guest
|
|
Posted: Mon Apr 21, 2008 6:15 am |
|
|
Which function(s) are/is disable to prevent reentrancy?
Matro. |
|
|
Matro Guest
|
|
Posted: Mon Apr 21, 2008 6:17 am |
|
|
Reentrancy isn't a function that calls itself. This is recursivity.
Reentrancy is just the fact to call 2 or more times a function at the same time.
Typically when a function is called by the main() and also by an ISR. So the function can be entered 2 times at the same time.
Matro. |
|
|
Ttelmah Guest
|
|
Posted: Mon Apr 21, 2008 7:13 am |
|
|
Try changing the name of the selection array inside the subroutine.
'Recursion', is where a function ends up potentially calling itself. Because of the lack of a variable stack in the PIC, this will result destruction of the variables in the first copy.
What you post, shouldn't lead to recursion (it _would_ if the menu selections in the second menu, were the same as the first). However I'd suspect that function arrays are treated by the system as if they are 'global', when testing for this, so since the array name is the same in the subroutine, the compiler decides there is a potential for recursion.
Best Wishes |
|
|
ssssssss Guest
|
|
Posted: Mon Apr 21, 2008 7:48 am |
|
|
Hey Ttelmah, Matro
Thanks for the quick replies.
Matro I get a recursion error and not a reentrancy error.
*** Error 69 "main.c" Line 74(0,1): Recursion not permitted [Menu1]***
Ttelmah I tried your suggestion and still having the same problem the code is below. (please note the code is an example might have other errors but has been written to demonstrate the problem)
Code: |
void mainMenu2();
void Menu1();
void Menu2();
void Menu3();
void Menu4();
void subMenu1_1();
void subMenu1_2();
void subMenu1_3();
void subMenu1_4();
typedef void (*pt1Function)(); /* used for function pointer type */
void MainMenu2(){
char selection_off_choice =0;
char button2Pressed =0;
char buttonPressed = 0;
pt1Function funcSelection[4] = {& Menu1,& Menu2,&Menu3,& Menu4}; /* Function array */
while(button2Pressed == false){
if(buttonPressed) {// scroll along next function
if(selection_off_choice < 4) selection_off_choice++;
else selection_off_choice = 0;
(*funcSelection [selection_off_choice])(); /* only used for displaying highlighted options */
}
}
}
typedef void (*pt2Function)(); /* used for function pointer type */
void Menu1(){
char selection_off_choice =0;
char button2Pressed =0;
char buttonPressed = 0;
pt2Function functionArray[4] = {& subMenu1_1,& subMenu1_2,& subMenu1_3,& subMenu1_4}; /* Function array */
while(button2Pressed == false){
if(buttonPressed) {// scroll along next function
if(selection_off_choice < 4) selection_off_choice++;
else selection_off_choice = 0;
(*functionArray [selection_off_choice])(); /* only used for displaying highlighted options */
}
}
}
void main(){
MainMenu2();
}
|
I haven't a clue yet but if I find out will post back.
best regards |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
|
|
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
|