C原語を3日前に初めて分からないことだらけです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
fdjkeighakei

C原語を3日前に初めて分からないことだらけです。

#1

投稿記事 by fdjkeighakei » 7年前

LEGOのEv3というロボットを使用してC原語を学んでいます。
APIはTOPPERS/EV3RThttp://dev.toppers.jp/trac_user/ev3pf/w ... 3%E3%82%B9を使用しており、このサイトをなんとか見ながらやっています。
今回はEv3で音を鳴らすプログラムをサンプルを参考に組んで見ました。
そこでわからない事が多数あるため質問させてもらいます。

1,static void button_clicked_handler(intptr_t button)と有りますがintptr_tとは何なのでしょうか。何かしら定義してるのは分かりますがAPIを参考にするサイトにもいまいちよく載っていません。

2,void main_task(intptr_t unused)と有りますがこれも1と同様(inptr_t unused)の意味が分かりません。
またこの文以下のプログラムではボタンについて書かれていますがここで記述しないといけない理由が分かりません。上のswitch文に組み込むことはできないのでしょうか?
マルチタスク処理で動いていると耳にした事が有りそれのせいなのでしょうか...分かりません。

3,app.h(2つめのコード)というものが有りそこではどうやら関数の宣言?定義?をしているようです。
このapp.hなるものは一体全体app.cのどの部分に影響して働きかけているのでしょうか?

長くなってしまいましたが、Ev3をいじった事がある方や分かる方などご回答頂けるととても勉強になります。よろしくお願いします。

コード:

//app.cメインプログラム
#include "ev3api.h"
#include "app.h"

#if defined(BUILD_MODULE)
#include "module_cfg.h"
#else
#include "kernel_cfg.h"
#endif

static void button_clicked_handler(intptr_t button) {
	switch (button) {
		case ENTER_BUTTON:
			ev3_led_set_color( LED_RED );
            ev3_lcd_draw_string("Now Playing",50,500);
			ev3_speaker_play_tone(NOTE_E4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_E4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_F4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_G4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_G4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_F4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_E4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_D4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_C4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_C4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_D4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_E4, 500);
            tslp_tsk(500);
            ev3_speaker_play_tone(NOTE_D4, 500);
            tslp_tsk(800);
            ev3_speaker_play_tone(NOTE_C4, 500);
            tslp_tsk(200);
            ev3_speaker_play_tone(NOTE_C4, 500);
			tslp_tsk(800);
			break;
			default:
			break;
	}
}

void main_task(intptr_t unused) {
             //制御したいボタン、button_clicked_handlerが呼び出される、ENTER_BUTTONの時。
	ev3_button_set_on_clicked(ENTER_BUTTON, button_clicked_handler, ENTER_BUTTON);
	ev3_speaker_set_volume(5);
	ev3_led_set_color( LED_OFF );
}

コード:

//app.h関数の宣言をするところらしい。
/*
 *  ターゲット依存の定義
 */
#include "target_test.h"

/*
 *  ターゲットに依存する可能性のある定数の定義
 */
#ifndef STACK_SIZE
#define	STACK_SIZE		4096		/* タスクのスタックサイズ */
#endif /* STACK_SIZE */

/*
 *  関数のプロトタイプ宣言
 */
#ifndef TOPPERS_MACRO_ONLY
//exinfとは制御したいボタンの事。
extern void	main_task(intptr_t exinf);
#endif /* TOPPERS_MACRO_ONLY */

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C原語を3日前に初めて分からないことだらけです。

#2

投稿記事 by みけCAT » 7年前

Ev3はわからないので、一般的な知識からの予想で回答します。
fdjkeighakei さんが書きました:1,static void button_clicked_handler(intptr_t button)と有りますがintptr_tとは何なのでしょうか。
intptr_tは(少なくともC言語標準では)ポインタの値を安全に保持できる符号付き整数型です。

N1570 7.20.1.4 Integer types capable of holding object pointersの1より引用
The following type designates a signed integer type with the property that any valid
pointer to void can be converted to this type, then converted back to pointer to void,
and the result will compare equal to the original pointer:
intptr_t
fdjkeighakei さんが書きました:2,void main_task(intptr_t unused)と有りますがこれも1と同様(inptr_t unused)の意味が分かりません。
(inptr_t unused)の意味はここに使われていないのでわかりません。
(intptr_t unused)は、intptr_t型の引数unusedをとるという意味です。
unusedなので、おそらくシステムの都合で関数の型を合わせて使いやすくするためのダミー引数、もしくは今回のプログラムでは不要な何らかの情報が渡される引数でしょう。
fdjkeighakei さんが書きました:またこの文以下のプログラムではボタンについて書かれていますがここで記述しないといけない理由が分かりません。上のswitch文に組み込むことはできないのでしょうか?
下の関数は、関数名にmainが含まれることからエントリポイント(プログラムの起動時にまず実行されるユーザー定義の関数)であると推測できます。
一方、上の関数は、関数名にhandlerが含まれることから、イベント(ここではbuttonがclicked)が発生したときに、
システムがそのことをユーザー定義のプログラムに伝えるために呼び出すコールバック関数であると推測できます。
エントリポイントが最初に1回しか呼び出されないと仮定すれば、静的変数を利用して分岐することで無理やり関数を共通化してswitch文に組み込むことはできると思いますが、
わざわざそんなことをしても可読性を下げるだけである気がします。
fdjkeighakei さんが書きました:3,app.h(2つめのコード)というものが有りそこではどうやら関数の宣言?定義?をしているようです。
このapp.hなるものは一体全体app.cのどの部分に影響して働きかけているのでしょうか?
app.cに直接宣言や定義が書かれていない識別子(ENTER_BUTTONやev3_led_set_colorなど)を使っている部分、といえると思います。
app.hからさらにAPIで定義される識別子を定義するファイルを読み込み、コンパイラに識別子の存在を伝える役割をしていると予測できます。
オフトピック
C言語ではなくC原語を学んでいるのですか…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

fdjkeighakei

Re: C言語を3日前に初めて分からないことだらけです。

#3

投稿記事 by fdjkeighakei » 7年前

ご返答ありがとうございました。
C言語でしたね笑変換ミスしていました。

大まか理解することは出来ましたがイマイチ少しわからない事があったので質問させてもらいます。

1,intptr_tを使用する利点というのは何かあるんでしょうか?ポインタ値を安全に保持する必要というのはなぜその必要性があるのかが分かりません。intptr_tを使用しなくても良いのではと思ってしまいます。

2, (intptr_t unused)はダミー引数か不要ななんらかの情報が渡されるとのことですが、それを理解するのにはどうしたら良いのでしょう。ダミーやなんらかですとプログラムに組み込む必要性が感じられません。

3,app.hがAPIで定義されている識別子を定義するファイルを読みこみコンパイラに識別子の存在を伝える役割をしているとの事ですが、これはどのコードでそのような事が確認できるんでしょうか?

返信

“C言語何でも質問掲示板” へ戻る