Scratchを用いた プログラミング教育についてsaitoh/20170821_ICTIizuka/...Scratchを用いた プログラミング教育について 平成29年度ICT活用教育研修会
プログラミングで言いたい聞きたいこと集
-
Upload
tecopark -
Category
Technology
-
view
886 -
download
2
Transcript of プログラミングで言いたい聞きたいこと集
![Page 1: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/1.jpg)
プログラミングで言いたい & 聞きたい集
TECO
![Page 2: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/2.jpg)
概要
普段感じているプログラミングに関する小さなことを集めました。
当たり前と思ってることもあるかもしれませんが、改めて考えてみよう。
![Page 3: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/3.jpg)
STATIC_ASSERT(1)
コンパイル時にエラーを出してくれるアサート。積極的に利用しよう。
主な用途:配列サイズ → 固定サイズの配列を作る時、配列のサイズが正しい値に
なっているかどうか、確認してますか? → 通常のアサートでは実行時チェックなので非効率 → STATIC_ASSERT を使ってコンパイルではじこう。
![Page 4: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/4.jpg)
STATIC_ASSERT(2)
// 定義例template <bool> struct static_assert_{ enum { okay = 1 };};template <> struct static_assert_<false> {};#define JOIN(a, b) JOIN_(a, b)#define JOIN_(a, b) a ## b#define STATIC_ASSERT(expr) ¥ typedef int JOIN(diagnostics_, __LINE__) ¥ [static_assert_<!!(expr)>::okay]
![Page 5: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/5.jpg)
配列の参照渡し (1)
問 . 静的サイズの配列を関数の引数として渡す時、どれが一番適切でしょうか?
1.void SetArray( int* array );2.void SetArray( int array[5] );3.void SetArray( int (&array)[5]);
![Page 6: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/6.jpg)
配列の参照渡し (2)
1.void SetArray( int* array ); → 配列じゃなくても渡せてしまう。
2.void SetArray( int array[5] ); → サイズ 5 じゃない配列でも渡せてしまう。
3.void SetArray( int (&array)[5]); → サイズ 5 の配列しか渡せない。
正解 : 3
![Page 7: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/7.jpg)
メンバ変数のポインタ化
ちゃんとメリットとデメリットを把握して、ポインタにするか実体にするかを使い分けよう。
メリット ポインタ化する型を先行宣言すればクラス間の依存度減 include 回数減=コンパイル時間短縮
デメリット 要 NULL チェック? キャッシュミスの原因になりかねない。
![Page 8: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/8.jpg)
MASTER_CONST 修飾子マスタービルド時には定数だが、デバッグ時は調整のため変数にしたいものがある。MASTER_CONST を定義しょう。
#if defined(_DEBUG) #define MASTER_CONST#else #define MASTER_CONST const#endifstatic MASTER_CONST float s_GameParam = 0.0f;#if defined(_DEBUG) if( Pad::IsOn( BUTTON_UP ) ){ s_GameParam += 1.0f; }#endif
![Page 9: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/9.jpg)
Addr 型
ポインタ型を数値変換する場合は、 Addr 型を定義して使いましょう。
Uint32 addr = reinterpret_cast<Uint32>(ptr); // No
Addr addr = reinterpret_cast<Addr>(ptr); // Yes
ポインタのサイズが 32bit である保証はありません。
![Page 10: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/10.jpg)
float 型について
比較する時は誤差を考慮したマクロを定義して使おう。
// f0 == f1
#define IS_EQUAL_F32( f0 , f1) ¥
((f1) - EPSILON) <= (f0)) && ((f0) <= (f1)+EPSILON)
// f0 > f1
#define IS_MORETHAN_F32( f0 , f1 ) ((f0) > (f1)+EPSILON)
// f0 < f1
#define IS_LESSTHAN_F32( f0 , f1 ) ((f0) < (f1)-EPSILON)
![Page 11: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/11.jpg)
関数の入力、出力引数 ( 示し方 )
1 . コメントで示している。 → 関数定義を見ただけでは分からない。
2 . 引数名で示す。 bool GetParam( int* out_Param( or outParam ) ); → 命名規則にポリシーを持っている人には相性が悪い恐れあり。
3 . 修飾子を付ける bool GetParam( _OUT int* param );
個人的には 3 を推奨したいがどうでしょう?
![Page 12: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/12.jpg)
関数の入力、出力引数 ( 範囲 )
1.入力、出力、入出力引数全てに示す。 Bool GetParam( _OUT int* dst , _IN_OUT int* param0 ,
_IN int param1 ); 2.出力、入出力引数のみ示す。 Bool GetParam( _OUT int* dst , _IN_OUT int* param0 ,
int param1 );
入力引数はデフォルトなので、示すのは冗長と感じるがどうだろうか?(2推奨)
![Page 13: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/13.jpg)
Result型複数の理由で処理が失敗する可能性がある関数は返り値を Bool 型にするな。Result 型を定義して原因を示せ。
typedef Uint32 Result; #define S_OK 0 // 成功#define E_FAIL 1 // 失敗#define E_INVALID_ARG 2 // 引数が不正・・・
![Page 14: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/14.jpg)
関数毎に author コメントを付けるべき
グループプログラミングをする場合、関数毎に文責者コメントを書いている人は少ない。引き継ぎや質問に支障がでるので書く癖を!!
/*! * ホゲホゲします。 * @authror Miyake Shunsuke */void MogeClass::DoHogeHoge(){ // ホゲホゲ}
![Page 15: プログラミングで言いたい聞きたいこと集](https://reader036.fdocument.pub/reader036/viewer/2022083003/558fcad31a28abf8388b45e7/html5/thumbnails/15.jpg)
入力( Pad,Keyboard )クラスには Reaseと Debug用 APIを用意すべし。
アプリケーション側で #if〜 #endif で分岐してるだけでは残ってしまう可能性がある。根元でも対応すべし。
// No#if !define(_MANTER) // もしも _MASTER のスペルを間違ってたら・・・ if( Pad::IsPress( BUTTON_A ) ){ m_Hp = 100000; // Hp を回復 ( デバッグ用 ) }#endif// Yes if( DebugPad::IsPress( BUTTON_A ) ){ m_Hp = 10000; // Hp を回復 ( デバッグ用 ) }