We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
In below code,I think pointer pexam->pf and pf1 will be same, but why pexam->pf++ can't change? What mistake i make? Can someone will help me. thx!
/////////////////////////// struct tagEXAM { int x; void (**pf)(void); }; void fun1(void); void fun2(void); void (*code pf[])(void)= { fun1,fun2 }; struct tagEXAM code exam[] = { {1, pf} }; int x; void (**pf1)(void); struct tagEXAM* pexam; void main(void) { while (1) { pexam = exam; pf1 = pexam->pf;
(*pexam->pf)(); (*pf1)();
pexam->pf++; pf1++; (*pexam->pf)(); (*pf1)(); } } void fun1(void) { x = 1; } void fun2(void) { x = 2; }
struct tagEXAM { int x; void (**pf)(void); }; void fun1(void); void fun2(void); void (*code pf[])(void)= { fun1,fun2 }; struct tagEXAM code exam[] = { {1, pf} }; int x; void (**pf1)(void); struct tagEXAM* pexam; void main(void) { while (1) { pexam = exam; pf1 = pexam->pf; (*pexam->pf)(); (*pf1)(); pexam->pf++; pf1++; (*pexam->pf)(); (*pf1)(); } } void fun1(void) { x = 1; } void fun2(void) { x = 2; }
While the choice of a '51 target is questionable when using function pointers, there doesn't appear to be anything particularly wrong with your code.
What do you mean by "can't change"?
You are trying to increment a pointer that is located in ROM. That's why it won't increment.
You are trying to increment a pointer that is located in ROM.
Well spotted.
struct tagEXAM code exam[] = { {1, pf} };
Now I make a little sense, because the struct tagEXAM* pexam is only a pointer for definition of struct tagEXAM, pexam->pf is not a pointer, it's a reference for function pointer fp[], it's located in ROM, so you can't increment it!. Am I right? confuse me, Can someone make a little clear? thx.
According to the declarations, "exam" is a variable that exists in code memory.
The 8051 cannot write to code memory. (That's a feature.) Therefore, no bits in the variable "exam" can be changed. The type of exam is irrelevant to this point. "pexam" is a pointer to a "struct tagEXAM". This is not a variable in and of itself. It's a pointer, so it just holds the location of some other actual variable.
struct tagEXAM* pexam;
"pexam" is initialized to point to "exam".
pexam = exam;
The code then tries to change the "pf" field of the thing to which pexam points:
pexam->pf++;
The thing to which pexam points is "exam". As we saw at first, "exam" exists in code memory, and so none of it can be changed. pexam->pf is the same memory as exam.pf. It can't be changed. Incrementing would change pf, so you can't increment exam.pf or pexam->pf.
Thanks Davis, it's good comment.