PHP講習会/H8割り込み講習会
今年度の創造工学の活性化のために4年実験の第1テーマを導入教育につかうにあたり、 第1回目に、PHPなどのネットワーク系技術の講習会と、H8などを用いる際に必須の割り込みなどの理解を行うための講習会兼簡単な4EI実験として講義を行った。
PHP講習会
インターネット技術の基礎知識を理解してもらうために、PHPを用いて簡単な講習会を行う。 (斉藤担当)
- 複雑な処理では、複数プロセスの協力も必要であることから、CGIの原理を説明をネタに、 プロセスが協力して処理を行うための問題点として、 SIGNAL,環境変数渡し,共有メモリ,パイプ,スレッドなどの用語も簡単に紹介する。
- HTMLの簡単な説明と、サーバにページを登録し、簡単なHPを設置するまでを説明
- PHPの簡単な例題を解説し、外部から渡される$_GET,$_POSTなどの変数を説明
- 例題として、何らかの簡単な処理プログラムを作ってもらう
- 最後にWeb系プログラムの必須のセキュリティネタとして、入力フォームにタグを埋め込む手法の問題点を1つだけ紹介。
H8割り込み講習会
H8などの組み込み系で何らかのシステムを作る場合には必須となる、割り込みなどの 概念の紹介として、割り込み関数の登録や割り込みが有効になるための設定などの 説明を行う。(担当高久)
組み込み系のC言語のプログラムを理解する際に必須となる、#pragma や、 volatile 宣言などの概念などの説明も行う。 割り込みとしては、時計やPWMによるサーボモータの制御も応用例として多いため、 タイマーA,タイマーWなどを例題として、解説を行う。
変数の取り扱い
今日は、変数の扱いの説明として、変数・関数と引数などを中心に話す。
変数の概念
- 大域変数(global変数)
- 大域変数は、どこからでも触れる変数で、極力使わない….など…
- 局所変数(local変数)
- forループなどのブロック内での変数宣言例など…
//大域変数を使うために起こるトラブル例 int i ; void foo() { for( i = 0 ; i < 2 ; i++ ) printf( "A" ) ; } void main() { // このプログラムは、AAAAと表示されない。 for( i = 0 ; i < 2 ; i++ ) foo() ; }
関数との値の受け渡し
関数と呼び出し側の値の受け渡しということで、値渡し(Call by Value)・ポインタ渡し(Call by Pointer)などの解説。
基本的にC言語では、関数の実引数(real argument)が、仮引数(pseudo argument)に コピーされる値渡しが原則で、関数から複数の値の変化を知りたい場合に、 ポインタと変数のアドレスを使ったポインタ渡しを行うと説明する。
void foo( int *p ) { // ポインタ渡しの例 (*p)++ ; printf( "%d" , (*p) ) ; } void main() { int a = 123 ; foo( &a ) ; foo( &a ) ; }
関数の処理によって値が変化することを副作用と呼び、 副作用は自分の持っているものが想定外に変化するのであれば、 不気味な現象でもあり、極力副作用は小さい方がいい。 だからこそ、変化してほしい値だけをポインタで渡して書き換えてもらう….といった説明を行う。
演算子の前後の()について質問があったので、演算子の優先順位の説明を行う。 ついでだし、右結合・左結合といった話や、趣味の悪い「コンマ演算子」なども 雑学系のネタとして紹介する。
プロトタイプ宣言とプリプロセッサ
この話の中で「なぜ関数実体を読み出し処理より前に書くのか?」との質問がでる。
# 通常私のコーディングは実体を先に書くボトムアップ記述。
基本的にコンパイルは、先頭から命令解析が行われるので、 関数の実体が先にあった方が、関数を呼び出す時に引数や帰り値が何なのか、 分かっていて都合が良いことを説明。 「トップダウン記述」であれば、呼び出し処理を先に書きたいけど、そういうときは プロトタイプ宣言が必要であることを説明する。
これに関連して、プログラム中の#行が、「プリプロセッサ行」であり、 「命令解析前の命令の書き換え処理」が行われると説明し、 "#include <stdio.h>" では、stdio.h というヘッダファイルを読み込み、 そのファイルには、printf(),scanf()のプロトタイプ宣言が書いてあることを説明する。