2017-06-30 24 views
4

forループの実行中に問題が発生しました。定義済みの値を含む静的テーブルを作成しました。処理する関数にテーブルを引数として渡しました。 がbasicly私のコードは、次の1のようになります。forループがオペレーティングシステムで実行されていませんC

#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(i=0;i<10;i++) 

すべてのメッセージが印刷されました。私は最初にやったのと同じように処理しなければなりません。

PS:このコード部分は、マイクロコントローラを実行しているオペレーティングシステムのタスクで実行され、私は初心者です。

答えて

5

ここでswitch (Command)を使用しています。ここで、Commandには、アドレスod tableが入ります。

変更switch

switch (*Command) { //Use value at pointed Command. 

} 

そしてノートに、あなたはchar逆参照*Commandを行うときは、1バイトです。 IDは2バイトなので、データが失われています。

変更:ショートへ

static char table[] = {ID_01, ID_02 ,ID_03, ID_04, .... , ID_LAST} 

16ビットを持っているが、私はwを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機能を変更し、

static unsigned short table[]={ID_01, ID_02 ,ID_03, ID_04, .... , ID_LAST} 

後の値あなたの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])); 
+0

私のループが実行されているが、表が++に動作していない、ループはそれは* *立ち往生によって何を意味している最初の定義された値 –

+0

で立ち往生しています。デバッグしましたか?すべての可能なケースと 'default'ステートメントをカバーしましたか? – tilz0R

+0

はい私はそれらのすべてをカバーし、デフォルト値を使用しました。私のプログラムはループ内の "* table"の最初の項目だけを実行します –

1

、それは構造体を作成し、以下のように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}, 
}; 
関連する問題