执行for循环时遇到问题,我创建了一个包含已定义值的静态表,然后将我的表作为参数传递给要处理的函数。 基本上我的代码如下所示:
#define ID_01 0x0000
#define ID_02 0x0001
#define ID_03 0x0002
#define ID_04 0x0003
#define ID_05 0x0004
#define ID_06 0x0005
#define ID_07 0x0006
#define ID_08 0x0007
#define ID_09 0x0008
/*...
*/
#define ID_LAST 0xFFFF
static char table[]={
ID_01, ID_02 ,ID_03, ID_04, .... , ID_LAST}
void process( char *table){
int LastId=0;
char *Command;
for ( Command=table; LastId==0 ; Command++){
switch(Command)
{
case ID_01:
do_stuff01();
break;
case ID_02:
do_stuff02();
break;
...
case ID_LAST:
LastId=1;
break;
default:
break;
}
}
}
我尝试打印一些消息进行调试,但程序不会执行任何打印,即使是在循环之前和之后的那些。
但是当我把for循环改为:
for(i=0;i<10;i++)
打印了所有邮件。但我必须以与我一开始相同的方式处理。
PS:这部分代码是在运行到微控制器的操作系统任务中执行的,我只是一个初学者。
答案 0 :(得分:5)
现在您正在使用switch (Command)
,其中Command
包含地址od table
变量。
将switch
更改为
switch (*Command) { //Use value at pointed Command.
}
请注意,在执行*Command
时,您取消引用char
即1byte。您的ID有2个字节,因此您丢失了数据。
变化:
static char table[] = {ID_01, ID_02 ,ID_03, ID_04, .... , ID_LAST}
短路以获得16位值
static unsigned short table[]={ID_01, ID_02 ,ID_03, ID_04, .... , ID_LAST}
稍后,修改您的process
功能以接受unsigned short
void process( const unsigned short *table) { //Unsigned short
int LastId = 0;
unsigned short *Command; //Unsigned short
for ( Command=table; LastId==0 ; Command++){
switch(*Command) { //Added star
//...
}
}
//...
我会将您的process
代码重写为:
void process(const unsigned short *table, size_t tableLen) {
while (tableLen--) {
switch (*table) {
case ID_1: /* Do stuff */ break;
}
table++; //Increase pointer to next ID element
}
}
//Usage then like this:
static unsigned short table[] = {ID_1, ID_2, ID_3, ..., ID_n};
//Put pointer and length of table
process(table, sizeof(table)/sizeof(table[0]));
答案 1 :(得分:1)
通常,它会生成struct并映射ID / FUNC,如下所示。
#include <stdio.h>
#define ID_01 0x0000
#define ID_02 0x0001
/* ... */
#define ID_LAST 0xFFFF
typedef void (*func)();
typedef struct {
char n;
func f;
} fmap;
void do_something01() { }
void do_something02() { }
/* ... */
static fmap fmaps[] = {
{ID_01, do_something01},
{ID_02, do_something02},
/* ... */
{ID_LAST, NULL},
};