トップ «前の日記(2010/09/07(Tue)) 最新 次の日記(2010/10/04(Mon))»
【ソース+水=麦茶色の何か】

半期 四半期 全カテゴリ

今日の一言


2010/09/08(Wed) 肉が食いたい [長年日記] 0:00現在 28℃

_ [Debian][Ubuntu][FC][Linux][Choromet][研究関係][雑記]1つのNICに複数のIPアドレスを割り当てる(HRP2-m Chorometを使う おまけその2)

例えば、デフォルト設定のchorometの場合、ホストPC側のIPアドレスを「192.168.201.222」にする必要がある。

もちろん、ホストPCに合わせてchorometの方の設定ファイルを変更してもいいが、DHCP等で自動割り当てされており、固定IPでない場合には、これは使えない。

そういった場合には、DHCPにより割り当てられるIP以外に、chorometと接続する用のIPアドレス「192.168.201.222」を割り当てておく方が便利だ。

1つのNICに複数アドレスを割り当てるには、ifconfigコマンドの持つ、IPエイリアスという機能を利用する(http://www.itmedia.co.jp/help/tips/linux/l0494.html)。

 # ifconfig eth0:0 192.168.1.12

この場合、メインとなるインターフェイス名「eth0」の次に「:」とエイリアス番号(通常は0から始まるエイリアスの連番)を指定している。

これで、

 # ifconfig

を打つと、通常の「eth0」に加え、「eth0:0」という仮想的なインタフェースが現れるようになる。

意外と便利なのでぜひお試しあれー。

以上!

_ [C++][雑記]配列を引数にとる関数についてのメモ(sizeofの結果が4バイトになってしまう話)

具体的には、以下のようなプログラムを書いた場合に、引数とした配列のサイズを関数内で得ようとしたときに、sizeofの結果が4となる理由についてのメモ。

*これが原因でセグメンテーションフォルトを起こしていたので、反省の意味も込めて書いておく。

*より詳しく知りたい人は、こちら(http://www.cc.kyoto-su.ac.jp/~yamada/ap/array.html#argument)とか、こちら(http://www.jpcert.or.jp/sc-rules/c-arr01-c.html)を見た方がいいかも。

 #include <stdio.h>
 int test_sizeof( char* str)
 {
   int n;
   n = sizeof(str);
   printf("func: size=%d %s\n",n,str);
   return 0;
 }
 int main()
 {
   int n;
   char str[] = "――――I am the bone of my sword.";
   n = sizeof(str);
   printf("main: size=%d %s\n",n,str);
   test_sizeof(str);
   return 0;
 }

結果:

 main: size=39 ――――I am the bone of my sword.
 func: size=4 ――――I am the bone of my sword.

printfでは、同じ39文字の文字列が表示されるにも関わらず、関数内でのsizeof()の結果は4。

で、なぜ、こういう結果が出るのかであるが、端的に言うと、配列を引数にとった場合、実際にはポインタが渡される為である。

上のプログラムを見れば分かるが、文字列「str」はポインタ変数として渡されている。

その為、関数内で「str」のサイズを得ようとしてsizeof(str)としても、得られるのは、ポインタ変数1個分のサイズ(4バイト)である。

とまあ、非常に単純な話なのだが、ここで問題を分かりにくくしているのが、

 int test_sizeof( char* str)

ではなく、

 int test_sizeof( char[] str)

と書いてもコンパイル出来る点である。実際にはポインタなのに、あたかも配列のように扱えるため、こんな間違いを犯してしまう。

結局何が言いたいかというと、これを考えずに、sizeofの結果を使ってmallocでメモリを確保すると、後で原因が分からなくなって大変困る、ということだ。

以上!