無意味のような生き方

組込みエンジニアが怒りと無念をさえずるブログ。

独習Cの1問目がむずい

C言語の能力が足りないことを痛感する日々。OSを作っていても、C言語の基本的なことがわかっていないから、無駄な作業に膨大な時間を費やしてしまう。「HelloWorld」が画面に現れなくて、OS本を何度も読み返し、処理のシーケンスを1から見直しても原因がわからず、完全に諦めてから数日後、「if(xx == 0)」と書かれていたのを見つけた。修正してみたら、あっさり上手く行った。がっくし。こんな初歩的なミスに気づかないほど、C言語に慣れていない自分に落ち込む。C言語にも自信がない状態でスキルアップしたいとかふざけてんじゃねえと、採用担当者だったら思うだろうな。

 

C言語の問題集を買う。独習C。著者はartonさんという謎の人物。まだ読んでいないので内容の感想は書けないが、ハンドルネームで大著を出すのはすごい。僕だったら自己顕示欲が我慢できないと思う。


早速、1問目からやってみることにした。

 

【ch02-01.c】

#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{

  if( argc == 1 )
  {

   puts( "hello world!" );
  }
  else
  {

   int sum = 0;
   for( int i = 1; i < argc; i++ )
  {
   sum += atoi( argv[i] );
  }
   printf( "sum = %d ", sum );
  }
   return 0;
}

 

書いて・・実行。

 

f:id:ikenohotorino:20190115230806p:plain

エラー

コンパイルエラーや!

 

何度見直しても、テキスト通りに書かれている。環境がまずいのか?でも、他のテキストを見ながらプログラムは間違いなくコンパイルできている。もうだめだ。ここから3ヶ月経った。

 

 

f:id:ikenohotorino:20190115230844p:plain

コンパイル成功

通った!


会社のコンパイラコンパイルしてみたことがきっかけだった。仕事中、やることをほったらかしにして、試しにやってみたところ、ワーニングすら出ず、あっさり上手く行った。会社のコンパイラEclipse。何が違うんだろうと調べてみた結果、以下の文に問題があることが判った。

 

for( int i = 1; i < argc; i++ )

 

for文の中で変数宣言しているのが原因らしい。

 

調べるうちに判ってきたのは、borland c++ というコンパイラは相当古いということだ。C言語の規格が「K&R」→「C89」→「C99」→「C11」とアップグレードされる中、どうやらコンパイラはC89くらいで止まっているらしい*1。for文内の変数宣言が可能になったのがC99以降らしいので、それ以前に対応しているコンパイラだと、エラーになってしまうらしい。いや、それにしても、89って・・・。生まれる前にできたものを使ってるエンジニアに未来は。。

 

最近『プログラマが知るべき97のこと』という本を買った。その界隈ではおそらく有名だと思われるエンジニアの人たちが、2ページずつ各々の教えを説いているコラム集である。その中に「浮動小数点数は実数ではない」というタイトルのコラムを見つけて、自己顕示欲のあまりの低さに驚嘆する。書籍化されると決まっている何でもありのコラムで、自分のことを語らず、技術の話題だけで割り切れるってすごい。そしてやっぱり、技術ブログは難しい。

 

独習C 新版

独習C 新版

 

 

 

プログラマが知るべき97のこと

プログラマが知るべき97のこと

 

 

 

*1:確証はない。いつか確かめたいけど