--/--/-- (--)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2008/11/30 (日)
C言語、1週間もたてば忘れてしまいそうなテクニック。紙にメモっても、そのうち絶対になくすのでブログにメモw
ver.1 の内容も改めて書き直しています。



・意外とわかっていないカンマ演算子の罠
x = 5;
y = 10;
という2文を
x = 5, y = 10;
と1行にまとめて記述することができる。これは、
for (i = 0, j = 0; i < n; i++) {
というように用いるカンマ演算子と同じ意味をもつ。
 ところで、実はこんな用い方もできる。
a = (x = 5, y = 10);
こうすると。最終的にカッコの中身に10が残り、aに10が代入される。
初めて知った人も多いかもしれないが、
while (scanf("%d", &n), n > 0) {
上記のような用い方は知っている人も多いかもしれない。これは、読み取った値が0以下ならループを抜けるという条件を1行で記述した例だ。

・便利な条件演算子
a = (x > y) ? x: y;
こうすると、aにxとyのうち大きい方が代入される。
row[(x > y) ? x : y]
func((x > y) ? x : y)
上記のような、配列番号や関数の引数など式しか記述できない箇所で威力を発揮する。

・配列の要素数が初期値の個数と等しい場合には、要素数を指定しなくてもよい。
int array[] = {5, 10, 15, 20}
この意味で、
main(int argc, char *argv[])
の*argv[]を理解することができる。
また、これに関連して、
char *row[] = {"Suncay", "Monday", "Thursday", …}
とすると、1単語の文字数、及び配列番号を指定せずに文字列を格納できる。

・配列で、初期値の数が配列の要素数に満たない場合、残りの要素には0が入れられる。
int array[100] = {-5, 0, 5}
例えば array[3] = 0 となる

・ポインタ演算子の増減の意味
int *ip;

ip++;
ip++ は sizeof(int)増えたことを表す

・ポインタの型変換
void *px;
x = *(int *)px;
とすると、整数が取り出せる。え?void型から整数? と思うかもしれないが、だいぶ前にqsort関数を用いるときにこんな使い方をしました。
 ちなみに
x = *(int *)&y;
という文は、x = yと同じ意味らしい。

・配列とポインタの関係。
Aを任意の配列とし、ポインタ変数pにAの先頭へのポインタが与えられているとする。このとき、次のいずれも同じ意味をもつ式である。
A[n]
p[n]
*(p + n)

・構造体の初期設定は2通りの書き方ができる。
struct complex {
 double real;
 double img;
}; x = {0, 0}
struct complex y = {0, 0}

・構造体は次のように構造体タグ名を省略したり、初期値の要素を省略したりできる
struct {
 double real;
 double img;
}; x = {0}
このとき、.imgには配列と同じように0が入る。
スポンサーサイト
2008/11/28 (金)
プログラミングにおいて、プログラムをコンパイル、実行してみると正しく動かないこともしばしば。
あれ?なんてコードを上から順に見直して間違えがすぐ見つかればよいのだが、毎回すぐに解決するとは限らない。

こんなときに便利なのがデバッガ。
デバッガの使い方を知らないうちは、よくコードのそこらじゅうに printf を貼り付けて変数の中身をチェックしたりしますが、デバッガの使い方はすごく簡単なのですぐにでも覚えてしまうのが吉。
今回は、GDBデバッガの使い方を紹介します。


まず、GDBデバッガのパッケージをインストールしなければ始まりません。インストールは各自で。
最初からインストールされているならそれで結構です。

まず、作成したCプログラムをコンパイルします。このとき、GDBで実行できるように-gオプションをつけるのを忘れないように。
# gcc -g test.c

コンパイルしたら、次にテキストエディタのEmacsを起動します。
本来GDBはEmacsなどなくとも単体で実行することができるのですが、実はGDBはEmacsと非常に相性がよく、Emacs上でGDBを実行すると、プログラムコードどプログラムの実行結果を2画面で同時に比較しながら見ることができるのです。これがすごく便利。

というわけで、Emacsを起動したら、「M-x gdb」を実行して、GDBを起動します。
すると、コマンドラインに以下のように表示されます。
Run gdb(like this): gdb

ここで、先ほどコンパイルした実行ファイルを打ち込みます。
Run gdb(like this): gdb a.out

すると、メイン画面に以下のように表示されます。あとは、必要に応じてコマンドを打つだけです。
(gdb) 

run プログラムを実行する
break main main関数にブレークポイントを設定
break 10 10行目にブレークポイントを設定
info breakpoints ブレークポイントの閲覧
delete 2 ブレークポイント2の削除
next 1行ずつ実行(関数の内部には入らない)
setp 1行ずつ実行(関数の内部にも入る)
cont 次のブレークポイントまで実行
list 10 コードの10行目を中心に±5行表示
print x 変数xの中身を表示する

以上のコマンドさえ知っていれば一通りの作業は行える。
2008/11/14 (金)
意味 書き方
改行 '\n'
復帰 '\r'
タブ '\t'
バックスペース '\b'
ベル '\a'
\自身 '\\'
シングルクォーテーション '\''
ダブルクォーテーション '\"'
16進ビットパターン '\xhh'
8進ビットパターン '\ooo'
2008/11/14 (金)
演算子には

(1) 算術演算子
(2) 等値演算子、関係演算子
(3) 論理演算子
(4) インクリメント演算子、ディクリメント演算子
(5) ビット演算子
(6) 代入演算子
(7) 条件演算子
(8) カンマ演算子
(9) キャスト演算子
(10) sizeof演算子
(11) ポインタ演算子

がある。全てわかるだろうか?
2008/11/05 (水)
明日、星のカービィ ウルトラスーパーデラックス DS版が発売されますね!

海外ではすでにKirby Super Star Ultra - カービィ スーパースター ウルトラ (海外北米版 Nintendo DS)という同内容のものが発売されていて、僕はこちらをプレイしました。

自分がメタナイトになって戦うモードとか、1Pがヘルパーになってボス戦をするモードとかが増えていました。


【DS】 星のカービィ ウルトラスーパーデラックス NTR-P-YKWJ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。