わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

Cの横道,指導の真髄

int (*x)[10] これが正しい書き方
int x[][10] この宣言の[]は*と同じ意味だからこれでも可
int (*x)[] × [10]を[]と書くことは許されない
int x × [10]を[]と書くことは許されない
int **x × [10]を*と書くことは許されない

表1.3 二次元配列を受ける仮引数の宣言の仕方
(Lepton先生のCの強化書 (開発の現場セレクション), p.35)

◎と×の分類,そしてその理由について,異論はありません.
ですが,「int x[5][10]」や「int x[100][10]」といった宣言も可能であることに言及がないのが不思議です.多次元配列についても,仮引数の配列の要素数は,実引数のそれと同じにしておくのが,読みやすい*1と考え,学生にはそう教えています*2

gccには,Cの標準規格に対する独自の拡張機能が存在します.オプション "-pedantic" を付けることにより,それらの拡張機能を無効にすることができます.したがって,規格に則ってCの勉強をする場合には,このオプションをつけるといいでしょう.たとえば,Cの規格上はsizeof演算子オペランドをvoid型にすることはできませんが,gccはそれが可能になっています.
(Lepton先生のCの強化書 (開発の現場セレクション), p.114)

直後にサンプルコードがあり,試してみて,同じ結果になりました.ただし,次のページに「コンパイル時にエラーになります」と書かれているのは勇み足bit too eagerでしょう.メッセージを見ると「warning」がついていますし,実行ファイルは生成され,-pedanticオプションなしと同じ実行結果になります.

蛇足 世の中の多くの人は,「伝える」動作をすれば「伝わる」という,じつに安直な考え方をしている.「技術の伝承が大事だ」と言って,できあがったものをそのまま伝えようとしている人などはその典型である.しかし,それが大間違いである.「伝わる」ということは,相手の中で結果として生じたものが,こちらの「伝えたい」と考えているものと同じになっている状態を表す.そして,伝わったか伝わっていないかは,その結果として生じたものからのみ判断される.したがって,「伝える」という動作をいくら積み重ねても,相手の中で結果として生じたものが「伝えたい」と考えているものと同じになっていなければ,何も伝えたことにならない.ということは逆に考えると,「伝える」ために必要なのは,どうすれば相手の中で結果として生じるものが自分と同じになるのかを,相手の人間になり代わって考えるということである.そのときに一番大事なことは,

  • どういう形にすれば相手は欲しくなるのか
  • 相手の頭の中の動きに合った伝え方は何か

を徹底的に考え抜くことである.そうすれば,おのずと必要なことが見えてくる.
(技術の創造と設計, p.100)

最初の方にあるように,ここのテーマは「技術の伝承」です.といっても,技術者になってから,あるいは伝える(教える)立場になってから,でなくても,上のメッセージは,日常生活に生かしていきたいものです.
多くの学生にとって大事なのは,「ということは逆に考えると」以降ですね.すなわち,コミュニケーション,あるいはプレゼンテーションをうまく進めるためのアドバイスととらえるわけです.
私にとっては,Cのプログラミングの指導です.毎週火曜のCの自主演習で学生のコードを見ながら,「前のセメスターの授業で教えたはずのことが,こんなに伝わっていないのか」という思いが強いのですが,帰りのバスの中でこのページに当たり,原因が明快に記されていて,驚きを覚えました.
後期の,今の1年生向けのプログラミング授業では,2年生以降になっても活用していく事実・技術を「伝えたいこと」として精選し,講義していきたいと思います.

*1:まあ読みやすさを言えば,たくさんの関数の引数に同じ二次元配列を書くのは好きでなく,構造体を定義してポインタで渡したいところです.

*2:仮引数は配列形式で書いてもポインタであることも,同時に教えます.具体的にどんなポインタ型になるかは,1年後期の授業の範囲外…と思いつつも,授業の中で触れています.