C言語のお作法に惑わされる
Xcodeの敷居が高いので、慣れる為に試しにフツーのC言語(C++ではない)を使ってプログラミングをしてみた。
Cで真面目にコードを書くのは初めてだ。これまで趣味で書く時には、Visual Basicを使っていた。
ところが、これが上手くいかない。なんとなく文法は知っていたのであるが、実際に書いてみるとあちこちにエラーが出る。Xcodeは上手く出来ていて、単純な書式、変数定義の誤りはコンパイルする前に、入力時点でエラーを表示してくれる。
また、入力しようとする単語の候補までインラインで表示する。この機能は、慣れるとすこぶる便利だ。熟達者にとっては恐らく鬱陶しいだろうが。
作っていたのは、日付を入れるとその日の惑星の位置を赤経・赤緯で表示するという単純なもの。プログラムの構成は極めてシンプル。しかし、小数点以下の数値を扱う関数・数式を多用する。変数も多い。
なかなか上手く計算値がでなくて、かれこれ3週間近く(ぶっ通しではない)試行錯誤していた。書籍もあれやこれや参照した。
そして、ようやく正常な計算値を出す事ができた。いやはや、なんとも・・・
動作不良(バグ)の最大要因は2つ。
ひとつは、ATAN2(アークタンジェント)の計算結果を誤解していた事。0-2πの値を連続して出力すると思い込んでいたが、実際は0〜π、-π〜0を境界を挟んで出力するものだった。
もうひとつは、配列変数の扱い方を勘違いしていたこと。Cでは、A[ ]という配列変数9個を定義する時に、A[9]と書く。添字は、0〜8だ。つまり、A[0]〜A[8]。
これにはまいった。
A[1]に水星、A[2]に金星、以下〜、A[9]に冥王星の軌道要素を突っ込んで計算したものだから、冥王星の位置が全く理論と合わない。本来、A[9]はメモリ上に存在しないので、アクセスしてはいけない。ところが、”エラー”とは言ってくれない、読み込みができてしまうものだから、てんでデタラメな結果になっていた。
これは散々悩んで、ようやく原因が分かった。
いや、文法書には作法がちゃんと書いてある。それも、「コンパイラは添字と領域は感知しません。プログラマの責任である」と。
はい、ごめんなさい。読んでいませんでした・・・
当たり前であるが、似ていても詳細な文法が異なるのがプログラミング言語だ。
それにしても、Cはアバウトな言語仕様だ。
一方で、プログラミングはし易い。単に数値計算をやるだけであれば、初心者であっても敷居を感じる事も少ないだろう。
今更ながら、この言語が広く受け入れられた理由を実感した。
以下、この3週間の成果物(2013年3月17日、21時の9惑星の位置の表示)。
これによると、普段見かけない火星は「うお座」、土星は「乙女座」にいることが分かる。土星は、今は明け方、南の空に見えることになる。確かに、毎朝、スピカの左に明るい星を見る事が出来る。これが土星だ。
「天文年鑑」に掲載されている位置とは微妙に誤差があるが、実用上問題はない。
これで一区切りついたので、Xcode、Objective-Cにも再挑戦してみる。
何せ、全て英語表記。
これは敷居が高い・・・
input [YYYY MMDD HHMM] ? 2013 0317 2100
nen=2013 niti= 317 jikan=2100
yy=2013.000000 mm=3.000000 dd=17.000000 hh=21.000000 ms=0.000000 sn= 1
mjd= 56368.875 hh=21 ms=0
=======================================================
1 R.A.=22 24 D.C.= (-1) 8 43 Dist= 0.69491101
2 R.A.=23 39 D.C.= (-1) 3 46 Dist= 1.7189132
3 R.A.=23 47 D.C.= (-1) 1 22 Dist= 0.99521541
4 R.A.= 0 13 D.C.= ( 0) 0 44 Dist= 2.3832988
5 R.A.= 4 28 D.C.= ( 0) 21 20 Dist= 5.3058462
6 R.A.=14 34 D.C.= (-1) 12 22 Dist= 9.0775153
7 R.A.= 0 29 D.C.= ( 0) 2 29 Dist= 21.012028
8 R.A.=22 17 D.C.= (-1) 11 13 Dist= 30.80026
9 R.A.=18 47 D.C.= (-1) 19 52 Dist= 32.878846
=======================================================