質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

C言語の2次元配列について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,011

silas10p

score 11

下記の様な2次元配列を使っていますが、動作が良く分からないので御教授をお願いします。
st_g.u1_mode_system = (gp_u1_def_action[u1_event][st_g.u1_mode_system])(g_u1_def_state[u1_event][st_g.u1_mode_system], u1_id);
には、unsigned char の8ビットの値が入るのでしょうか?
又、関数のアドレスの2次元配列とはどういう使い方になるのでしょうか? そもそも、2次元配列を使って何がしたいのか良く分かりません。
御教授お願いします。

発生している問題・エラーメッセージ

エラーメッセージ

st_g.u1_mode_system = (gp_u1_def_action[u1_event][st_g.u1_mode_system])(g_u1_def_state[u1_event][st_g.u1_mode_system], u1_id);
には、unsigned char の8ビットの値が入るのでしょうか?
又、関数のアドレスの2次元配列とはどういう使い方になるのでしょうか? そもそも、2次元配列を使って何がしたいのか良く分かりません。
御教授お願いします。

define     MTR_MODE_INACTIVE           (0x00)

define     MTR_MODE_ACTIVE             (0x01)

define     MTR_MODE_ERROR              (0x02)

define     MTR_SIZE_STATE              (3)

define     MTR_EVENT_STOP              (0x00)

define     MTR_EVENT_RUN               (0x01)

define     MTR_EVENT_ERROR             (0x02)

define     MTR_EVENT_RESET             (0x03)

define     MTR_SIZE_EVENT              (4)

typedef struct
{
volatile unsigned char      u1_mode_system;         /* system mode */
volatile unsigned short     u2_run_mode;            /* drive mode */
volatile unsigned short     u2_error_status;        /* error status */


} MTR_ST_LESS_120;

MTR_ST_LESS_120 st_g;

static unsigned char (* gp_u1_def_action[MTR_SIZE_EVENT][MTR_SIZE_STATE])(unsigned char u1_state, unsigned char u1_id) = {
{ mtr_act_none,    mtr_act_inactive, mtr_act_none  },        /* 0:STOP  */
{ mtr_act_active,  mtr_act_none,     mtr_act_none  },        /* 1:RUN   */
{ mtr_act_error,   mtr_act_error,    mtr_act_none  },        /* 2:ERROR */
{ mtr_act_reset,   mtr_act_error,    mtr_act_reset },};        /* 3:RESET */

static const volatile unsigned char   g_u1_def_state[MTR_SIZE_EVENT][MTR_SIZE_STATE] = {
{ MTR_MODE_INACTIVE, MTR_MODE_INACTIVE, MTR_MODE_ERROR     },        /* 0:STOP  */
{ MTR_MODE_ACTIVE,   MTR_MODE_ACTIVE,   MTR_MODE_ERROR     },        /* 1:RUN   */
{ MTR_MODE_ERROR,    MTR_MODE_ERROR,    MTR_MODE_ERROR     },        /* 2:ERROR */
{ MTR_MODE_INACTIVE, MTR_MODE_ERROR,    MTR_MODE_INACTIVE  },};        /* 3:RESET */

st_g.u1_mode_system = (gp_u1_def_action[u1_event][st_g.u1_mode_system])(g_u1_def_state[u1_event][st_g.u1_mode_system], u1_id);

```

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

こんにちは。

st_g.u1_mode_system = (gp_u1_def_action[u1_event][st_g.u1_mode_system])(g_u1_def_state[u1_event][st_g.u1_mode_system], u1_id); 
には、unsigned char の8ビットの値が入るのでしょうか? 

st_g.u1_mode_systemはunsigned char型なので、ほとんどの処理系では8ビットの値が入ると思います。
(C言語ではchar型は8ビット以上であることが規定されてます。9ビットあるようなコンピュータも世の中には存在しているようです。)

又、関数のアドレスの2次元配列とはどういう使い方になるのでしょうか? そもそも、2次元配列を使って何がしたいのか良く分かりません。 

状態遷移表と思います。
3つの状態に対して4種類のイベントが定義してあり、各状態の時に発生したイベント毎に呼び出す関数を切り替えています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/29 09:34

    御回答ありがとう御座います。状態偏移表とは知りませんでした。この場合だと”停止中にSTOPが来ると停止中、停止中にRUNが来ると動作中、停止中にERRORが来るとエラー発生中、停止中にRESETが来ると停止中に移行”という事なのでしょうか?只、* gp_u1_def_actionが何をやっているのか良く分からないのですが御教授お願いできないでしょうか?

    キャンセル

  • 2016/08/29 10:06

    MTR_SIZE_STATEに対応する状態番号の定義が提示されているソースには含まれていませんので良くは分かりません。状態0はIdel、状態1はRun、状態2は謎ですがリセットのみ受け付けるようなのでエラー状態かもしれません。

    gp_u1_def_action[][]は関数ポインタの配列です。
    例えば、 `(gp_u1_def_action[0][1])(g_u1_def_state[0][1], u1_id);`
    は、状態0の時にイベント1が発生すると、`mtr_act_inactive(MTR_MODE_INACTIVE, u1_id);`を呼び出します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る