- インクルードガードについて: http://www.geocities.jp/ky_webid/c/060.html
- ファイルから一つの整数値を読み取る,各手法のデメリット:
- fscanf: 入力がフォーマット(第2引数で与える文字列)に合っていないとき,読み飛ばせない.
- fgets+atoi: 1行の情報を格納する配列領域が必要になる.1行から獲得したい情報が複数あるとき,処理が難しい.
- fgets+sscanf: 1行の情報を格納する配列領域が必要になる.入力が空白文字(' 'でも'\n'でもよい)で区切られていて一つ一つ読み出すとき,処理が複雑になる.
- fgetc: 1文字を読み出す変数が必要になる.バイト列から整数への変換を自前で作ることになり,バグが入りやすい.
- 実用上の観点(入力情報が変わってもコードを書きやすい)でおすすめは,「fgets+sscanf」と「fgetc (ただし関数にする)」.
- バイナリストリームを扱うときにfgetsで読み出すと,入力の途中にナル文字が入っていればおかしな動作になり得る.代わりにfreadを用いるべきである.
- 教科書に「EOFを入力」という表現が見られるが,ユーザがEOFに相当する値をコンピュータに送るわけではないし,ファイルにEOFに相当する値が格納されるわけではない.ただし,MS-DOSなどの環境で,テキストファイルの途中でも特定のバイトコードがあれば,それをファイルの終わりとみなすという使い方はある.
- 冬休みのレポート課題より,stdoutを用いた置換例.
/* before */ for (k = 0; k < face_byte; k++) { putchar(((i == x && j == y) ? face_set_bold : face_set)[face_byte * c + k]); } /* after */ fwrite(((i == x && j == y) ? face_set_bold : face_set) + face_byte * c, 1, face_byte, stdout);
- 「標準入力から入力し」と書いてはいけない.一般に,入力「する」のはプログラムではないから.一方,「出力する」と書くのは,その主語はプログラムなので,問題ない.ただし「標準出力に出力する」と表記すると,「出力」が2箇所出現してくどいので,「標準出力に書き出す」とここでは書いた.なお,「画面に表示する」という表現については,これも,画面に表示「する」のはプログラムではないので,その意味では不適切であるが,古くから用いられ,またオンラインマニュアルの日本語訳でもよく見かけるので,「表示する」と書いて試験で減点するようなことはしない.
- mallocは,リストやツリーのプログラムをCで書くときに必要になる.例えば,ノード(節点)の構造を自己参照構造体で定義しておき,新たなノードが必要なときに,mallocで領域を確保し,構造体オブジェクトとする.
- サンプルコードのliner.cでは,line構造体も,mallocで領域を確保しfreeで開放しているが,これは可変長配列ではない.実のところ,冬休みのレポート課題と同様に,init_line関数の中にstaticをつけたline構造体の変数を定義し,その参照を返すのでも,動作する.ただしソースを相当修正しないといけない.
- ファイルの1行を読み出す方法については,1行の長さの上限を決めておき,そのサイズ(ナル文字も格納できるように!)のchar配列変数を確保し,そこにfgetsなどで格納することで,mallocやfreeを使わないコードにするのがポピュラーであり,たいていの場合,それで問題ない.ただし,2年後期の演習で通信プログラムを書くときに,長さに制限のない情報を受け取る機構が必要になる.
- 反復(whileなど)の中で領域を動的に確保して,1回の(反復内の)処理の中で用済みになれば,freeすべきである.一つのプログラムの実行中に多数の領域を動的に確保し,参照させる(線形リストや木構造をプログラムにするなど)とき,用済みになったらすべてをfreeするのは,バグのもとになりやすく,勧められない.
- 初期化が必要なときに忘れると減点する.初期化が不要なところに初期化をしても減点はしない.とすれば,試験対策として,必ず初期化するという戦略をとってもいい.実際にプログラムを作る際には,初期化を必須とするか,変数ごとに決めるべき(必須としない)かは,コーディングスタイルの問題だと思う.
- コマンドサーチパスについて: http://ryuiki.agbi.tsukuba.ac.jp/~nishida/lecture/UNIX_course_1/commandpath.html,http://oshiete1.goo.ne.jp/qa14416.html
- シェルでは,実行したコマンドの終了ステータスが0のときに正常終了,0以外のときに異常終了とみなす.Cや多くのプログラミング言語と整合性が取れない*1が,歴史的理由(あるときにこう決めたので,もはや変えられない)というものである.
- gccの-sオプションほか: http://www15.big.or.jp/~yamamori/sun/gcc/gcc-misc.html
- warningは「ワーニング」ではなく「ウォーニング」と読む.warを「ワー」というと恥ずかしい.「ウォー」である.warpに限り(英語の発音は「ウォープ」に近いが),「ワープ」という.
- Emacsを複数起動すると,複数のプロセスとなる.コンピュータのメモリ消費量が多くなるし,Cのファイルを開くときに,そのつどc-modeのelispファイルを読み出そうとするという点でも,効率が悪い.
- Linux脱初心者の行動
- 上矢印連打,BackSpace矢印連打の頻度が減る.
- マウス使用頻度が減る(マウスなしでコピー・ペーストも余裕).
- ファイル名を指定するのに,絶対パス,相対パス,チルダ(~)記法を使い分ける.
- 別名やfunctionを定義したり,シェルスクリプトを作ったりして,実行コマンドの字数が少ない.
- screenとzshの組み合わせが最強とネットで知り,試す.
- sshを使って,Windows環境からリモートログインし,サーバの負荷に注意しながら使う.
- 欲しいコマンドがないときや,提供されているコマンドが古いとき,tarballを取り寄せてコンパイルし,使う.
- 面白いソフトウェア,作業を省力化する小技がないかを探すため,Webをよく巡回する.
- タイピングに迷いがない.他の人からは,集中してタイプしているかと思えば,計算機から手を離して熟考しているように映る.
- C言語の歴史: http://www.bohyoh.com/CandCPP/C/history.html
- 仕様に関するオプション: http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html#SEC6 http://libc.blog47.fc2.com/blog-entry-7.html
- C++Builder ダウンロード: http://www.codegear.com/jp/downloads/free/cppbuilder
- インテル コンパイラー: http://www.intel.com/cd/software/products/ijkk/jpn/compilers/295842.htm
*1:正常終了を偽,異常終了を真とみなせばいいか,というと,「コマンド1 && コマンド2」の挙動を考えると,やっぱりまずいです.