オリオン座が沈む窓

azuyuz captain's log〜”ゆず”艦長の航海日誌

C言語のお作法に惑わされる

 Xcode敷居が高いので、慣れる為に試しにフツーのC言語(C++ではない)を使ってプログラミングをしてみた。

 Cで真面目にコードを書くのは初めてだ。これまで趣味で書く時には、Visual Basicを使っていた。

 ところが、これが上手くいかない。なんとなく文法は知っていたのであるが、実際に書いてみるとあちこちにエラーが出る。Xcodeは上手く出来ていて、単純な書式、変数定義の誤りはコンパイルする前に、入力時点でエラーを表示してくれる。

 また、入力しようとする単語の候補までインラインで表示する。この機能は、慣れるとすこぶる便利だ。熟達者にとっては恐らく鬱陶しいだろうが。

 作っていたのは、日付を入れるとその日の惑星の位置を赤経赤緯で表示するという単純なもの。プログラムの構成は極めてシンプル。しかし、小数点以下の数値を扱う関数・数式を多用する。変数も多い。

 なかなか上手く計算値がでなくて、かれこれ3週間近く(ぶっ通しではない)試行錯誤していた。書籍もあれやこれや参照した。

 

f:id:azuyuz:20130316220505j:plain

 

 そして、ようやく正常な計算値を出す事ができた。いやはや、なんとも・・・

 動作不良(バグ)の最大要因は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]はメモリ上に存在しないので、アクセスしてはいけない。ところが、”エラー”とは言ってくれない、読み込みができてしまうものだから、てんでデタラメな結果になっていた。

 これは散々悩んで、ようやく原因が分かった。

 いや、文法書には作法がちゃんと書いてある。それも、「コンパイラは添字と領域は感知しません。プログラマの責任である」と。

 

f:id:azuyuz:20130317073836j:plain

 

 はい、ごめんなさい。読んでいませんでした・・・

 当たり前であるが、似ていても詳細な文法が異なるのがプログラミング言語だ。

 それにしても、Cはアバウトな言語仕様だ。

 一方で、プログラミングはし易い。単に数値計算をやるだけであれば、初心者であっても敷居を感じる事も少ないだろう。

 今更ながら、この言語が広く受け入れられた理由を実感した。

 

 以下、この3週間の成果物(2013年3月17日、21時の9惑星の位置の表示)。

 これによると、普段見かけない火星は「うお座」、土星は「乙女座」にいることが分かる。土星は、今は明け方、南の空に見えることになる。確かに、毎朝、スピカの左に明るい星を見る事が出来る。これが土星だ。

  「天文年鑑」に掲載されている位置とは微妙に誤差があるが、実用上問題はない。

 

 これで一区切りついたので、XcodeObjective-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 

=======================================================