わさっきhb

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

pptファイルのノートより (2008年1月)

  • インクルードガードについて: 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.htmlhttp://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」の挙動を考えると,やっぱりまずいです.