マイコンでのC言語でポインタを使用
- マイコンでのC言語で関数を作成しましたが、ポインタを使用する方法がわかりません。
- 使用したい関数を選択するためにseq_1という配列を作成しました。
- 関数を使用したい順にseq_1の要素に関数名を代入し、プログラムを実行します。
- ベストアンサー
マイコンでのC言語でポインタを使用
C言語の初心者です。マイコンでのC言語で関数を作成しました。 Switch文ではなく、ポインタを使用して作成したいのですが出来ません。 よろしくお願いします。 1)使用する関数です。(作成済み:内容は省略しています) void job_1(void); void job_2(void); | | void job_50(void); void job_1(void) { } void job_2(void) { } | | void job_50(void) { } 2)関数を使用したい順に並べます。(使用したい関数の順番は変わります) seq_1[1] = ? ; // 関数 job_1 を選択 seq_1[2] = ? ; // 関数 job_5 を選択 seq_1[3] = ? ; // 関数 job_22 を選択 seq_1[4] = ? ; // 関数 job_10 を選択 3)上記の2)の関数を動作するプログラムです。 上記の 1)から3)までの登録、処理プログラムをよろしくお願いします。
- moutk
- お礼率100% (12/12)
- C・C++・C#
- 回答数5
- ありがとう数7
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
このような場合には、関数ポインタの配列を使うのがベストでしょう。 関数が3つのみ、並べ替えパターンが2つのみの場合を例にします。 (switch文を使いたくないということは、if文もなるべく使いたくないということですよね。そのため、少しソースが肥大化しました。) ---- #include <stdio.h> #define NJOBS 3 #define NREARRANGE 2 typedef void (*Job)(void); typedef void (*JobsRearrange)(Job *); void job_0(void) { printf("job_0\n"); } void job_1(void) { printf("job_1\n"); } void job_2(void) { printf("job_2\n"); } // 並べ替えパターン0 void jobsRearrange_0(Job *jobs) { jobs[0] = &job_0; jobs[1] = &job_1; jobs[2] = &job_2; } // 並べ替えパターン1 void jobsRearrange_1(Job *jobs) { jobs[0] = &job_1; jobs[1] = &job_2; jobs[2] = &job_0; } void jobsCall(Job *jobs) { int i; for(i = 0; i < NJOBS; ++i) jobs[i](); } int main(void) { Job jobs[NJOBS]; JobsRearrange pattern[NREARRANGE] = {&jobsRearrange_0, &jobsRearrange_1}; // どのパターンでjobを並び替えるか int jobsPattern; /*なにか処理によってpattern配列のインデックスを選択する*/ // ここでは便宜上1とする。 jobsPattern = 1; pattern[jobsPattern](jobs); jobsCall(jobs); } ----
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
なんとなく突込みが来るのを待っているような気がするので期待通りに突っ込んでみる.... #4 のように「関数を呼び出して切り替える」くらいなら, 最初から複数の配列を用意する方がおそらくまし.
お礼
返答有難うございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
なんで添え字が 1からなんだろう. さておき, 「使用したい関数の順番は変わります」ってことだと「関数を使用したい順に並べます」はどう書くべきか難しいねぇ. 規則性があれば何とかなるかもしれんけど, 「関数へのポインタのポインタ」を使うことになるかも.
お礼
早速の返答有難うございます。
補足
>さておき, 「使用したい関数の順番は変わります」ってことだと「関数を使用したい順に並べます」は 表現不足で申し訳ありません。 このような「処理プログラム」が複数あり、それぞれに「使用したい関数の順番は変わり、関数を使用したい順に並べて」いろいろなパターンを処理したいと考えています。
- KAZUMI2003
- ベストアンサー率37% (77/208)
#include <stdio.h> void job_1(void){printf("job1\n");} void job_2(void){printf("job2\n");} void job_3(void){printf("job3\n");} int main(int argc, char ** argv){ int i; void (*seq_1[3])(void); seq_1[0]=job_1; seq_1[1]=job_2; seq_1[2]=job_3; for( i=0; i<3; i++){ seq_1[i](); } return 0; } こんな感じ?
お礼
早速の返答有難うございます。
- Wr5
- ベストアンサー率53% (2177/4070)
コードに関しては自分で調べて書いていただくとして…… 戻り値の型と引数の型及び数が一致しているなら、関数ポインタの配列使ってみてはどうです? 「関数ポインタ 配列」辺りで検索すれば使い方などは見つかるでしょう。 関数を使用したい順に並べるのは、使用したい順番に配列に入れていけばいいでしょう。
お礼
早速の返答有難うございます。 調べて勉強します。
関連するQ&A
- C言語のvoid型ポインタを使いたいのですが…
C言語のvoid型ポインタを使いたいのですが… 関数の引数として、void型ポインタを使おうと思ったのですが、内部でどのように処理すればいいのかわかりません キャストすれば問題なく使えるとのことですが、どの型でキャストするのかをどのように判断するのかがわかりません 具体的には、画像処理で画像の構造体をいくつか作ったのですが、それぞれの構造体ごとに関数を書くと関数が多くなるので、void型ポインタでまとめてつくろうとしています どのように型の判断を行えばいいのかを教えてください
- ベストアンサー
- C・C++・C#
- C言語のvoid型ポインタ変数について。
C言語のvoid型ポインタ変数について。 C言語のvoid型ポインタ変数について質問があります。 組み込み系の開発を行っているのですが、現在使用しているシステムで、 提供されている "API" を介してアプリケーション部のソフト作成を行っています。 この "API" ですが、引数の多くはvoid型ポインタとなっています。 ある人がこの引数がvoid型となっているのを見て、 『なんでvoid型なんや??、C言語でアセンブラと違うんやから、void型なんかにしない方が良い』 とおっしゃいました。 この意味がよくわからなかったのですが、なぜ void型はよろしくないんでしょうか? -- 僕が思うに、APIなんやから引数を void型ポインタ にすることでどんな型にも対応できる 汎用的であると感じ、逆にこの方が良いのではと感じたのですが。。 -API例---- int _exApiKannsuu( char in_data, void* out_data ) "in_data" をもとに "out_data" を取得する。 どーやらこの "out_data" が void型 であるのががよくないらしい・・
- ベストアンサー
- C・C++・C#
- マイコンのC言語について
今度マイコンを使ってみようかと思っているんですが、プログラムをC言語で書くらしいです。 私は昔JAVAをちょっと勉強したのですが、難しくて途中でギブアップしました。ですから、C言語と聞くと、たじろいでしまいます。 実際どの程度の力量が要求されるのか、簡単なプログラムちょっとみてみたいんですが。
- ベストアンサー
- その他(プログラミング・開発)
- C#で、Cのファイルポインタ(?)のような機能
プログラムの初心者、かつ、C#の初心者です。 C言語では、ファイルポインタを関数から関数へ渡すことができると思うのですが、C# ではどのようにすれば良いのですか? C#を使っていますが、C言語のような構造でプログラムを書いています。 やりたいことは、ファイルポインタを渡しながら、各関数で、ドカドカと計算結果をファイル内に書いていくということです。 宜しくお願いいたします。
- 締切済み
- C・C++・C#
- C言語のポインタとスタックポインタ
プログラム始めて1ヶ月の初心者です。 C言語のポインタとスタックポインタというのは同じなのでしょうか。 スタックポインタの考えは大体理解出来たのですが C言語のポインタとなるとコードを見てもサッパリ分かりません。 ネットで調べても出てこなかったのでどなたか教えて下さい。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C言語 マイコン
図に示すようなシステムを考えています。 物体を発射させ、物体がレーザーを横切った時を記録して、時間差を計測するというシステムです。 クロックはマイコンからのものを考えています。 レーザーからのレーザー光をフォトダイオード、オペアンプを経由してマイコンにデータ送信しようと考えています。 そこで最初に物体の自由落下でのの時間差を測定しようと思い http://toragi.cqpub.co.jp/tabid/284/Default.aspxのマイコンを購入しました。 ソフトウェアとしてHEWを使用しているのですが、C言語のプログラムをどのように書けばいいのかわかりませんでした。 上記の条件を満たすプログラム例があれば回答お願いします。 また、パソコン上にどのように結果を表示させればいいのかも本を読んでも良くわかりませんでした。それについても解説などあればお願いします。 回答・解説・指摘お願いします。
- ベストアンサー
- C・C++・C#
- C言語のポインタの利点がわかりません
C言語を始めたばかりですが、 ポインタで間接参照するメリットが今一つわかりません。。。 特に、関数ポインタを使う場合には、 単なる関数ではだめなのでしょうか。 どなたか、かみ砕いて教えていただけないでしょうか。
- 締切済み
- C・C++・C#
- 【C言語】別関数でポインタの値を変えたのに変わらない。
【C言語】別関数でポインタの値を変えたのに変わらない。 メイン関数のポインタの値を、別関数で書き換えるプログラムを作りました。 以下がそのプログラムになります。 そのままだと、ダブルポインタを操作する必要があるので分かり辛いです。なので、ダブルポインタをシングルポインタにしてからポインタの書き換えを行うようにしました。その結果、きちんとポインタの書き換えが出来なくなってしまいました。 なぜ出来なくなってしまったのでしょうか。 2つのプログラムの違いは、 > *pp = &dummy; が > p = *pp; // ダブルポインタをシングルポインタにした > p = &dummy; に変わっただけです。 【参考】http://www.kouno.jp/home/c_faq/c4.html#8 -----------------正しいプログラム---------------- // 以下プログラムは、正しく動作する // 実行結果は、 // p = 5 // と表示される void func( int **pp ); int main (void){ int *p; int a = 0; p = &a; func( &p ); printf("p = %d\n", *p); return 0; } void func( int **pp ){ static int dummy = 5; *pp = &dummy; } ---------------------------------------------- -----------------間違いプログラム---------------- // 以下プログラムは、正しく動作しない // 実行結果は、 // p = 0 // と表示される void func( int **pp ); int main (void){ int *p; int a = 0; p = &a; func( &p ); printf("p = %d\n", *p); return 0; } void func( int **pp ){ static int dummy = 5; int *p; p = *pp; // ダブルポインタをシングルポインタにした p = &dummy; } ----------------------------------------
- 締切済み
- C・C++・C#
- ポインタを使ったC言語
わかるかたいらっしゃったらお願いします。 strcpy(),strcat(),strcmp 上記3つの標準関数と同じ機能を持った関数を作成 関数名 (1)u_strcpy() (2)u_strcat() (3)u_strcmp() ※ポインタ使用の事
- ベストアンサー
- C・C++・C#
お礼
叮嚀な返答有難うございます。 調べて勉強します。