Code Reading2.1
問題2.1
未初期化変数がどのように扱われるか?
下記のようなソースで試したら、g_a、aともに0だった。
#include <stdio.h> static int g_a; int main(int argc, char** argv) { int a; printf("g_a=%d\n", g_a); printf("a = %d\n", a); return 0; }
問題2.2
echoでgetoptが使えないのはなぜ?
いろいろ試したらやっとわかった。-がついた文字が扱えなくなるので、getoptを使っていない。
問題2.3
STREQマクロを使うメリット、デメリットは?
- メリット ロジックが直感的になる
- デメリット パラメータチェックができない。
問題2.4
ライブラリコールしていないソースを探せ。直す方法は??
Ruby/dir.cの955行目にあった。まあ普段は、sprintfの戻りとかチェックしないけど。
~省略~ recursive = 1; buf = ALLOC_N(char, n+strlen(m)+3); sprintf(buf, "%s%s", base, *base ? m :m+1); status = glob_helper(buf, buf+n, flags, func, arg); free(buf); if (status) goto finalize; ~省略~
解決方法は、エラーチェックする
if( sprintf(buf, "%s%s", base, *base ? m :m+1) < 0) { エラー処理 }
問題2.5
標準出力への書き込みエラーについてのプログラムの挙動をチェックするテスト方法を考案せよ。
考え中。。デバッガでエラーを返す。テストスタブとかでエラーを返すってことで答えになっているのかな
問題2.6
sscanf,qsort,strchr, setjmp, open, adjacent_find,FormatMessage,XtOwnSelectionを使用するためのヘッダは?
manで調べた結果です。
関数名 | ヘッダ |
---|---|
sscanf | stdio.h |
qsort | stdlib.h |
strchr | string.h |
setjmp | setjmp.h |
open | fcntl.h |
adjacent_find | ない |
FormatMessage | ない |
XtOwnSelection | ない |
SDLを使う
あるゲームプログラミングの本でSDLの話が書いてあったので試しにインストールしてみた。
- インストール
# yum -y SDL*
インストール後に起動するかどうか書いたコード
#include <stdio.h> #include <SDL/SDL.h> int main(int argc, char** argv) { SDL_Surface *gScreenSurface; SDL_Event ev; int x, y; // 初期化 if(SDL_Init(SDL_INIT_VIDEO)){ printf("初期化に失敗したっぽい\n"); return 1; } // ウィンドウのタイトルとアイコン(→キャプション)を設定 SDL_WM_SetCaption("HELLO SDL!", NULL); // ウィンドウの初期化 gScreenSurface = SDL_SetVideoMode(300,200,24,SDL_SWSURFACE); for(y = 0; y < gScreenSurface->h; y++) { for(x = 0; x < gScreenSurface->w; x++) { *(unsigned int *)(gScreenSurface->pixels + y * gScreenSurface->pitch + x * 4) = 0xffffff; SDL_Flip(gScreenSurface); } } // 終了イベント待ち while(1){ SDL_PollEvent(&ev); if(ev.type == SDL_QUIT) break; } SDL_Quit(); return 0; }
とりあえず起動することは確認した。
共有ライブラリを認識させる
OSは、Fedora17を利用しています。
libdwarf.soという共有ライブラリを手動で/usr/local/libディレクトリにインストールした時の話です。
/libディレクトリと/usr/libディレクトリはデフォルトで共有ライブラリーの含まれていますが、FedoraやCentOSでは/usr/local/libディレクトリが含まれていないため、手動で追加する必要があります。
方法は二つ
- 環境変数 LD_LIBRARY_PATHに指定する
- /etc/ld.so.confに記述する
環境変数 LD_LIBRARY_PATHを使う方法
そのディレクトリを一時的に共有ライブラリ検索パスに追加することができます。ただし再起動すると元に戻ってしまうため、永続的に追加したい場合は/etc/ld.so.confに記述します。
LD_LIBRARY_PATHに指定されたディレクトリは/etc/ld.so.confに記述されたディレクトリよりも優先的に検索されます。
export LD_LIBRARY_PATH=/usr/local/bin:$LD_LIBRARY_PATH
/etc/ld.so.confに記述する方法
永続的に追加したい場合は/etc/ld.so.confに記述します。
include ld.so.conf.d/*.conf /usr/local/lib
/etc/ld.so.confを更新したら、ldconfigコマンドを用いて/etc/ld.so.cacheの情報も更新する必要があります。
今回は、2を選択しました。lpicの勉強をした時にこの話があったような気がしましたが、忘れてしまっていた。
読む技術(SQ3R)について
SQ3Rは、リファクタリングウェットウェアという本の中で紹介されていた方法です。効率的に本を読むです。SQ3Rは、次に示す5つのワードの頭文字を集めたものです。
以下は、本の引用です。
- Survey(調査)
全体の要旨をつかむために目次と各章の要約を流し読みをする。
- Question(質問)
調査した内容を踏まえて質問を考える。
- Read(読書)
全文を読む。
- Recite(復唱)
要約し、ノートに書き、ポイントを自分の言葉でまとめる。
- Review(まとめ)
もう一度読み、さらにノートに書き出し、仲間と議論する。
仲間と議論するのは、今の環境だと難しいので、ブログやwikiにまとめるという手段でやってみようかな。
参考文献
リファクタリング・ウェットウェア ―達人プログラマーの思考法と学習法
- 作者: Andy Hunt,武舎広幸,武舎るみ
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/04/27
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 475回
- この商品を含むブログ (144件) を見る