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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2190閲覧

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

silas10p

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/08/26 05:27

下記の様な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/ツール等のバージョンなど) より詳細な情報

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

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/26 13:46

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

silas10p

2016/08/29 00:34

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

2016/08/29 01: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);`を呼び出します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問