用枚举当数组下标的问题

neilfbt 2011-04-24 11:44:54
enum driveEvent
{
ONE,
TWO,
THREE
};

driveEvent g_cuTask = ONE ;

typedef void (*g_drive[g_cuTask])();

void InitDrive()
{
g_drive[g_cuTask] = GetNextLine;
}


在typedef void (*g_drive[g_cuTask])();这句在VS2010中提示g_cuTask不是常量。

请教各位大侠这是为何?
...全文
418 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
neilfbt 2011-04-27
  • 打赏
  • 举报
回复
运行的时候只需把InitDrive里的5个函数不同的返回枚举事件,即可在while中持续运行,需要退出时用EXIT()在某个函数中退出。
5个函数类似
ULONG FisrtFile()
{
...
return NEXTFILE;
}


解释的清楚一点,对后人有个参考~
^_^
neilfbt 2011-04-27
  • 打赏
  • 举报
回复
enum eu_DriveEvent
{
FIRSTFILE,
NEXTFILE,
READWORK,
TASKFINISH,
TASKFAIL,
MAX_DRIVEEVENT
};



enum eu_DriveEvent g_cuTask = FIRSTFILE;

typedef ULONG (*td_Drive)();
td_Drive g_drive[MAX_DRIVEEVENT];

void InitDrive()
{
g_drive[FIRSTFILE] = FirstFile;
g_drive[NEXTFILE] = NextFile;
g_drive[READWORK] = ReadWork;
g_drive[TASKFINISH] = TaskFinish;
g_drive[TASKFAIL] = TaskFail;
}

void Interpreter()
{
g_cuTask = g_drive[g_cuTask]();
}

void Run()
{

while(1)
{
Interpreter();
}

}


以上为正确代码(只截了部分),已经成功运行。
感谢大家的帮忙~给了很多思路,最开始的代码我有几个语法概念性错误,现在都了解了。

谢谢各位C大侠!
logiciel 2011-04-25
  • 打赏
  • 举报
回复
对不起!回复时CSDN多次提示404,因此多次重新回复,结果都显示出来了。
neilfbt 2011-04-25
  • 打赏
  • 举报
回复
这个我是都是写在同一个CPP文件里的,但是是按照正确的先后顺序写的

这个有问题吗?要不要把什么写在.H文件里?
neilfbt 2011-04-25
  • 打赏
  • 举报
回复
这个我要实现的是有个while状态机循环执行g_drive[g_cuTask]

每个函数执行后更改g_cuTask 来更改函数地址,以此继续

neilfbt 2011-04-25
  • 打赏
  • 举报
回复
加上const 依然有不是常量的提示。。刚试了

大侠们,再帮忙想想
飞天御剑流 2011-04-25
  • 打赏
  • 举报
回复
g_cuTask是枚举变量,ONE、TWO、THREE才是枚举常量。
老邓 2011-04-25
  • 打赏
  • 举报
回复
提示的很清楚了,加上const即可:
const driveEvent g_cuTask = ONE ;
cao_julians 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 neilfbt 的回复:]
C/C++ code
enum driveEvent
{
ONE,
TWO,
THREE
};

driveEvent g_cuTask = ONE ;

typedef void (*g_drive[g_cuTask])();

void InitDrive()
{
g_drive[g_cuTask] = GetNextLine;
}……
[/Quote]
LZ的代码有点乱:
1.g_cuTask是枚举变量,加上const修饰,C也只将其视为“只读“变量,无法作为常量
2.g_drive是什么?前有typedef,g_drive是一LZ自定义的类型名(先不管它对不对)
3.g_drive[g_cuTask]是什么?类型名[变量]?这一句没有编译错误提示?
cao_julians 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 neilfbt 的回复:]
C/C++ code
enum driveEvent
{
ONE,
TWO,
THREE
};

driveEvent g_cuTask = ONE ;

typedef void (*.g_drive[g_cuTask])();

void InitDrive()
{
g_drive[g_cuTask] = GetNextLine;
}……
[/Quote]
LZ的代码有点乱:
1.g_cuTask是枚举变量,不能用于数组声明。即使加上const,C中也只将它视为“只读”变量
2.g_drive是什么?前有typedef,则g_drive是LZ自定义的类型名(现在不管它对不对)
3.g_drive[g_cuTask]是什么?类型名[变量]?这一句没有编译错误提示?
logiciel 2011-04-25
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

enum driveEvent
{
ONE,
TWO,
THREE,
MAX_DRIVEEVENT //放在最后,用于表示driveEvent的个数
};

driveEvent g_cuTask = ONE ;

typedef void (*g_drive_t[MAX_DRIVEEVENT])();
g_drive_t g_drive;//请注意区分前者是类型名称,后者才是变量

void GetNextLine()
{
cout<<"GetNextLine is called"<<endl;
}

void InitDrive()
{
g_drive[ONE] = GetNextLine;
}

int main()
{
InitDrive();
g_drive[ONE]();
return 0;
}
logiciel 2011-04-25
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

enum driveEvent
{
ONE,
TWO,
THREE,
MAX_DRIVEEVENT //放在最后,用于表示driveEvent的个数
};

driveEvent g_cuTask = ONE ;

typedef void (*g_drive_t[MAX_DRIVEEVENT])();
g_drive_t g_drive;//请注意区分前者是类型名称,后者才是变量

void GetNextLine()
{
cout<<"GetNextLine is called"<<endl;
}

void InitDrive()
{
g_drive[ONE] = GetNextLine;
}

int main()
{
InitDrive();
g_drive[ONE]();
return 0;
}
AnYidan 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 supermegaboy 的回复:]
c中的const不是常量表达式,当然是不行的,c++的const才是常量表达式。

c90的数组是不支持你这样的需求的,c99可以用VLA实现,不希望用c99的话,就只有用malloc动态分配了
[/Quote]

ansi c 中 const 只是 read-only
logiciel 2011-04-25
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

enum driveEvent
{
ONE,
TWO,
THREE,
MAX_DRIVEEVENT //放在最后,用于表示driveEvent的个数
};

driveEvent g_cuTask = ONE ;

typedef void (*g_drive_t[MAX_DRIVEEVENT])();
g_drive_t g_drive;//请注意区分前者是类型名称,后者才是变量

void GetNextLine()
{
cout<<"GetNextLine is called"<<endl;
}

void InitDrive()
{
g_drive[ONE] = GetNextLine;
}

int main()
{
InitDrive();
g_drive[ONE]();
return 0;
}
logiciel 2011-04-25
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

enum driveEvent
{
ONE,
TWO,
THREE,
MAX_DRIVEEVENT //放在最后,用于表示driveEvent的个数
};

driveEvent g_cuTask = ONE ;

typedef void (*g_drive_t[MAX_DRIVEEVENT])();
g_drive_t g_drive;//请注意区分前者是类型名称,后者才是变量

void GetNextLine()
{
cout<<"GetNextLine is called"<<endl;
}

void InitDrive()
{
g_drive[ONE] = GetNextLine;
}



int main()
{
InitDrive();
g_drive[ONE]();
return 0;
}
AnYidan 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 supermegaboy 的回复:]
c中的const不是常量表达式,当然是不行的,c++的const才是常量表达式。

c90的数组是不支持你这样的需求的,c99可以用VLA实现,不希望用c99的话,就只有用malloc动态分配了
[/Quote]

Ansi c 中 const 只表示 read only
logiciel 2011-04-25
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

enum driveEvent
{
ONE,
TWO,
THREE,
MAX_DRIVEEVENT //用于表示driveEvent的个数
};

driveEvent g_cuTask = ONE ;

typedef void (*g_drive_t[MAX_DRIVEEVENT])();
g_drive_t g_drive;

void GetNextLine()
{
cout<<"GetNextLine is called"<<endl;
}

void InitDrive()
{
g_drive[ONE] = GetNextLine;
}



int main()
{
InitDrive();
g_drive[ONE]();
return 0;
}
logiciel 2011-04-25
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

enum driveEvent
{
ONE,
TWO,
THREE,
MAX_DRIVEEVENT //用于表示driveEvent的个数
};

driveEvent g_cuTask = ONE ;

typedef void (*g_drive_t[MAX_DRIVEEVENT])();
g_drive_t g_drive;

void GetNextLine()
{
cout<<"GetNextLine is called"<<endl;
}

void InitDrive()
{
g_drive[ONE] = GetNextLine;
}



int main()
{
InitDrive();
g_drive[ONE]();
return 0;
}
飞天御剑流 2011-04-25
  • 打赏
  • 举报
回复
c中的const不是常量表达式,当然是不行的,c++的const才是常量表达式。

c90的数组是不支持你这样的需求的,c99可以用VLA实现,不希望用c99的话,就只有用malloc动态分配了
cao_julians 2011-04-25
  • 打赏
  • 举报
回复
typedef void (*g_drive_t[MAX_DRIVEEVENT])();
g_drive_t g_drive;//请注意区分前者是类型名称,后者才是变量
==========================================================
类型名大写啊,不然读起来太费劲

typedef void (*G_DRIVE_T[MAX_DRIVEEVENT])();
G_DRIVE_T g_drive;//请注意区分前者是类型名称,后者才是变量

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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