问题描述:
执行函数ShowTest(); 运行到g_disptest.show(&g_disptest); 语句后 , 程序便调用void DispProcess(DISPUNIT_STRUCT_DEFINE *v)函数
进入函数后指向结构的指针变量v的值是0x08; 程序单步运行,当运行到语句v->pic.print(&(v->pic));时, 指针变量v的值仍然是0x08. 但程序执行完语句v->pic.print(&(v->pic));后指针变量v的值改变了。非常奇怪不知是什么原因?因为函数void DispStr(DISPCELL_STRUCT_DEFINE *th)什么也没有。有兴趣的朋友可以运行一下试试,运行的环境是Keil。最终是想在C8051F040上运行。
希望能给我一些指点,谢谢!
下面附有程序:
#include <intrins.h>
#include <string.h>
#define c_MaxStrNum 10
#define c_TitleMax 5
typedef bit Bool;
typedef char Char8;
typedef unsigned char UChar8;
typedef int Int16;
typedef unsigned int UInt16;
typedef long Int32;
typedef unsigned long UInt32;
typedef struct
{
UChar8 X_Start;
UChar8 Y_Start;
UChar8 AsciiNum;
UChar8 AsciiNumPre;
UChar8 Str[c_MaxStrNum];
void (*print)(void *); //打印显示
}DISPCELL_STRUCT_DEFINE;
void DispStr(DISPCELL_STRUCT_DEFINE *th);
#define DispCell_Defaults { 0,0,0,0,{0},\
(void (*)(Int32))DispStr}
typedef struct
{
UChar8 Attrib;
UChar8 Flag;
DISPCELL_STRUCT_DEFINE pic;
void (*show)(void *);
}DISPUNIT_STRUCT_DEFINE;
void DispProcess(DISPUNIT_STRUCT_DEFINE *v);
#define DispUnit_Defaults { 0,\
0,\
DispCell_Defaults,\
(void (*)(Int32))DispProcess}
void PutStr(DISPUNIT_STRUCT_DEFINE *v, const UChar8 *p_src);
///////////////////////////////////////////////////////////////////////////////////
DISPUNIT_STRUCT_DEFINE g_disptest = DispUnit_Defaults;
void ShowInit(void)
{
g_disptest.pic.X_Start = 1;
g_disptest.pic.Y_Start = 1;
PutStr(&g_disptest, "ABCDEFG");
}
void ShowTest(void)
{
g_disptest.show(&g_disptest);
_nop_();
}
void DispStr(DISPCELL_STRUCT_DEFINE *th)
{
_nop_();
}
void PutStr(DISPUNIT_STRUCT_DEFINE *v, const UChar8 *p_src)
{
v->pic.AsciiNumPre = v->pic.AsciiNum; //保存上次显示的字符数目
v->pic.AsciiNum = strlen(p_src); //计算当前字符长度
strcpy(v->pic.Str, p_src); //赋值显示字符串
_nop_();
}
void DispProcess(DISPUNIT_STRUCT_DEFINE *v) //该程序在100ms中运行
{ //所以函数内部再多啰嗦一个指针不可变的变量
v->pic.print(&(v->pic)); //直接显示图片信息
_nop_();
_nop_();
}
Int32 *ptr;
void main(void)
{
ShowInit();
ptr = (Int32 *)(&g_disptest); //查看对象的指针
ShowTest();
while(1);
} |