结构体嵌套使用问题

lhxdorry 2009-11-01 02:23:20
typedef struct tagEventMap_S
{
unsigned char ucEventID;
MenuDef_S *pstTargetMenu;
}EventMap_S;

typedef struct tagMenu_S
{
MenuDef_S *pastMenuDef;
EventMap_S stEventMap[2];

}Menu_S;
Menu_S* GstCurMenu;;
变量GstCurMenu 如何使用ucEventID这个成员?
急!!请高手帮忙!
我是这么用的,编译可通过,但是执行不了!
void MsgProcess(uchar uc_EventID)
{
EventMap_S* pstEventMap = GstCurMenu->stEventMap;
while(pstEventMap->ucEventID != 0)
{
if(pstEventMap->ucEventID == uc_EventID)
{
WAR^=high;
GstCurMenu = pstEventMap->pstTargetMenu;
break;
}
pstEventMap++;
uc_EventID=0;
}
DisplayString3(GstCurMenu->pastMenuDef);
请帮忙!谢谢啊!急用!
...全文
142 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhxdorry 2009-11-01
  • 打赏
  • 举报
回复
刚学,不太懂!请指教
EventMap_S* pstEventMap = GstCurMenu->stEventMap;这种用法是对的吗?
但是我调试发现pstEventMap->ucEventID 这个变量的值跟函数形参数传进的值不等啊。
yangcuncunzhang 2009-11-01
  • 打赏
  • 举报
回复
1楼的,pstEventMap是指针, 它用EventMap_S* pstEventMap = GstCurMenu->stEventMap指向了结构体中数组名, 访问时pstEventMap->stEventMap已经代表一个数组元素了, 不能再加下标了!!!!


楼主, 你说的执行不了是指什么? 执行不出结果? 还是死机?

可能是你相关的代码的问题, 这里有集中情况你需要注意:
1. 全局变量GstCurMenu是个指针! 你有没有初始化它指向一个Menu_S的变量?
2. 即使GstCurMenu初始化了,当时指向的变量里面的内容是不是填的正确? 因为你在While()循环是判断pstEventMap->ucEventID等于0时结束循环的.
3. 你的while()循环最后一条语句是uc_EventID=0, 表示将uc_EventID置0了, 那么下一个循环查询时条件就变了! 你的本意是不是这样?
4. Menu_S中stEventMap数组只有2个元素, 那么在循环查询时要用最后一个做结束标志! 那么只剩一个了,查询有什么意义?

综合上面我重写了一段例子代码, 做了一点更改
1. 去掉了MenuDef_S, 因为在这个例子中用不到
2. 将stEventMap数组元素改为5个.
3. EventID直接定义成局部变量, 给常数值.
不管怎么样, 这段代码知识给你演示结构嵌套时的用法.在VC++6.0的控制台应用程序中测试通过. 如下:

#include "stdafx.h"
#include "conio.h"


typedef struct tagEventMap_S
{
unsigned char ucEventID;
unsigned char Var1;
unsigned char Var2;
unsigned char Var3;

}EventMap_S;

typedef struct tagMenu_S
{
EventMap_S stEventMap[5];

}Menu_S;

Menu_S* GstCurMenu;



int main(int argc, char* argv[])
{
char uc_EventID;
char MatchFlag;
Menu_S MenuVar;

MenuVar.stEventMap[0].ucEventID = 100;
MenuVar.stEventMap[0].Var1= 'A';

MenuVar.stEventMap[1].ucEventID = 101;
MenuVar.stEventMap[1].Var1= 'B';

MenuVar.stEventMap[2].ucEventID = 102;
MenuVar.stEventMap[2].Var1= 'C';

MenuVar.stEventMap[3].ucEventID = 103;
MenuVar.stEventMap[3].Var1= 'D';

MenuVar.stEventMap[4].ucEventID = 0;
MenuVar.stEventMap[4].Var1= 0;

GstCurMenu = &MenuVar;

EventMap_S* pstEventMap = GstCurMenu->stEventMap;

uc_EventID=102;
MatchFlag=0;
while(pstEventMap->ucEventID != 0)
{
if(pstEventMap->ucEventID == uc_EventID)
{
printf("Matched with %d : character is %c\r\n", uc_EventID, pstEventMap->Var1);
break;
}
pstEventMap++;
}

getch();


return 0;
}
yangcuncunzhang 2009-11-01
  • 打赏
  • 举报
回复
你到底问的什么意思? 你的代码对着啊!
  • 打赏
  • 举报
回复
EventMap_S*  pstEventMap = GstCurMenu->stEventMap; 
pstEventMap->stEventMap[0].ucEventID;
pstEventMap->stEventMap[1].ucEventID;

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧