2008年12月9日火曜日

C言語では、関数の引数として、配列のサイズを指定しないこと

引数として、配列のサイズを指定しても意味がないことはC言語としての常識ですが、残念ながら、Cのプログラマーはすべて知っているわけではない。
例えば、下記ソースをコンパイルして、実行すると、mainArrayのサイズは40でsubArrayのサイズは4になる。
なぜかというと、4は配列のサイズではなく、ただのポインタのサイズなのである。

つまり、下記のコメントアウトした行はその下の行とはまったく同じ意味になる。

C言語はJavaなどと違って、引数でサイズを宣言しても、下記のようにSub関数で明らかにサイズを越えている場合でも、コンパイルエラーにならないので、注意が必要だ。

#include "stdio.h"

static void accessArray(int subArray[100]);
int main(void)
{
int mainArray[10];
printf("sizeof mainArray = [%d]\n", sizeof(mainArray));
accessArray(mainArray);
return 0;
}

//static void accessArray(int * subarray)
static void accessArray(int subArray[100])
{
subArray[1]= 1;
printf("sizeof subArray = [%d]", sizeof(subArray));
return;
}

2008年12月8日月曜日

gdbデバッガの使い方

shellコマンドラインで下記コマンドを入力する。
export LD_LIBRARY_PATH=/usr/XXX/XXX/lib
gdb ./XXXDEBUG_TARGETXXXX

起動後のコマンドについて、下記サイトを参照
http://tsstudio.s12.xrea.com/unix/gdb.html

CppunitのFAQ

Q:Cppunitのテスト用ソースで構造体のメンバに値を代入し、実装関数の引数としたとき、
実装関数側で代入した値が反映されていない

A:MTを行う際、ありがちな間違いとしては、両方のソースで見ている構造体の定義が違うって可能性がある。(片方はダミー、もう片方は本物のヘッダを見てしまっているなど)
こんな感じで確認できる。

printf("%p, %p\n", &tHoge, &(tHoge.member));
printf("%p, %p\n", pHoge, &(pHoge->member));

2008年12月5日金曜日

ubuntu8.1 シャットダウン不可の問題

前日、Ubuntu8.1の日本語版をパソコンに入れたが、なぜかシャットダウン不可になっていた。
具体的にいうと、下記の現象になっていた。
1.システム→シャットダウンを選択する。
2.シャットダウンのプログレスバーが表示される。
3.黒い画面になって、左上に点滅しているカーソルが表示されていた。
4.エラーメッセージも表示せずに、そのままの状態がつづく。

対策:
1.alsa-utilsを編集する。
 sudo vi /etc/init.d/alsa-utils
2.下記をコメントアウトする。
 mute_and_zero_levels "$TARGET_CARD" || EXITSTATUS=1

 #mute_and_zero_levels "$TARGET_CARD" || EXITSTATUS=1

元ネタ
http://blog.csdn.net/zubin006/archive/2008/11/06/3240890.aspx