2009年3月25日水曜日

kde to ubuntu

下記サイトにはかなり詳しく説明されている。
http://iyee.cn/post/turn-ubuntu-into-kde.html

2009年3月23日月曜日

英語の勉強を始める

http://books.google.cn/books?id=zBkMEw5CmsgC&printsec=frontcover&dq=The+Cprogramming+language&lr=lang_en&as_drrb_is=q&as_minm_is=1&as_miny_is=2009&as_maxm_is=12&as_maxy_is=2009&as_brr=0&as_pt=ALLTYPES&source=gbs_summary_r&cad=0#PPP1,M1

とりあえず一番詳しいCからスタート

2009年3月18日水曜日

可変長ログの出し方

ユースケース
DEBUG_LOGでprintfと同じような書き方で利用し、ログを出力する。
int main(void)
{
int tryInt = 305419896; // 4 byte
ENTER;
DEBUG_LOG("yao daoding = %d\n", tryInt);

return 0;
}


1. __VA_ARGS__を利用できない場合、C99をサポートしていないコンパイラ
#ifdef D_DEBUG
#define DEBUG_LOG printf("%s %d %s:", __FILE__, __LINE__, __FUNCTION__),printf
#else
#define DEBUG_LOG(...)
#endif
//DEBUG_LOG(...)で記述するところをわざとDEBUG_LOGとして記述するのはミソ

2. 上記は\nを手動で追加しないと、改行を出力してくれないという欠点が
ある。
要は下記記述で、改行を出力することはできない。
DEBUG_LOG("yao daoding = %d", tryInt);
それを防ぐためにはC99がサポートしているという前提だったら、
以下の対策がある。
#ifdef D_DEBUG
#define WGT_TRY_BY_TOU(fmt, ...) printf("%s %d %s "fmt"\n", __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#else
#define DEBUG_LOG(...)
#endif

3. しかし、上記にも欠点があり、引数は一つしかない場合、コンパイルエラーに
なる。
DEBUG_LOG("daoding");
gcc -E main.cで確認すると、下記とおりに展開されているようである。
printf("%s %d %s ""daoding""\n", "main.c", 77, __FUNCTION__, );
余っている,を削除するために、下記方法は考えられる。
#define ENTER WGT_ENTER_LOG2("%s", "Enter", "")
#define WGT_DEBUG_LOG(...) WGT_ENTER_LOG2(__VA_ARGS__, "")

#define WGT_ENTER_LOG2(fmt, ...) \
{ \
printf("%s %d %s ", __FILE__, __LINE__, __FUNCTION__); \
printf(fmt"%s\n", __VA_ARGS__); \
}

すると下記はそれぞれ正常に展開される。
DEBUG_LOG("daoding");
DEBUG_LOG("yao daoding = %d\n", tryInt);
{ printf("%s %d %s ", "main.c", 76, __FUNCTION__); printf("daoding""%s\n", ""); };
{ printf("%s %d %s ", "main.c", 75, __FUNCTION__); printf("yao daoding = %d""%s\n", tryInt, ""); };

4. 運がよければ、下記も利用できるかも
引数は一つしかない場合、##は直前のあまった,を削除してれる。これはC99にはないので、ご注意を
#ifdef D_DEBUG
#define WGT_TRY_BY_TOU(fmt, ...) printf("%s %d %s "fmt"\n", __FILE__, __LINE__, __FUNCTION__, ## __VA_ARGS__)
#else
#define DEBUG_LOG(...)
#endif

2009年3月16日月曜日

C言語のスタック変数について

下記をredhat9で実行すると、以下のようにメモリに展開されている
ことを確認できる。
int main(void)
{
char tryChar = 'a';
char tryChar2= 'b';
short tryShort= 4660;
int tryInt = 305419896;
int tryInt2 = 0x10abcdef;
return 0;
}

0xbfffd64c : ef <- tryInt2 address
0xbfffd64d : cd
0xbfffd64e : ab
0xbfffd64f : 10
0xbfffd650 : 78 <- tryInt address
0xbfffd651 : 56
0xbfffd652 : 34
0xbfffd653 : 12
0xbfffd654 : 34 <- tryShort address
0xbfffd655 : 12
0xbfffd656 : 62 <- tryChar2 address
0xbfffd657 : 61 <- tryChar address

・先に宣言された変数のアドレスの値は大きい、なので、
スタックに入っていることはわかる。
・0x12345678のはずのintは実際に78563412のようにメモリに
配置している。
・tryChar2をコメントアウトすると、tryCharとtryShortの間に
1バイトのゴミが生成されたことを確認できる。
int main(void)
{
char tryChar = 'a';
// char tryChar2= 'b';
short tryShort= 4660;
int tryInt = 305419896;
int tryInt2 = 0x10abcdef;
return 0;
}

0xbfffd64c : ef <- tryInt2 address
0xbfffd64d : cd
0xbfffd64e : ab
0xbfffd64f : 10
0xbfffd650 : 78 <- tryInt address
0xbfffd651 : 56
0xbfffd652 : 34
0xbfffd653 : 12
0xbfffd654 : 34 <- tryShort address
0xbfffd655 : 12
0xbfffd656 : 01 <- バイトアライメント
0xbfffd657 : 61 <- tryChar address

2009年3月13日金曜日

vimのインストール先

vimを開いて、下記コマンドを実行すると、vimのインストール先が表示される。
:cd $VIMRUNTIME [enter]
ubuntu 8.10の場合、/usr/share/vim/vim71が表示される。

2009年3月12日木曜日

2009年3月6日金曜日

一番簡単のmakefile

main.cというファイルが存在しているという前提で
下記makefileを作成する
==============================================
OBJS = main.o
TARGET ?= main
CFLAGS += -g
CFLAGS += -Wall
CC = gcc

all : $(TARGET)

$(TARGET) : $(OBJS)
$(CC) $(OBJS) -o $(TARGET) $(CFLAGS)

.c.o : $*.c
$(CC) -c $*.c $(CFLAGS)

clean :
rm -f $(OBJS) $(TARGET)