2012年8月27日月曜日

[gnuplot] 小技

pm3dでz軸をログ軸にする
set logscale cb
pm3dでカラーバーに表示される数字のフォーマットを変更
set format cb "10^{%L}"
ylabelの位置を変える
set ylabel "hogehoge" -1,0

2012年8月26日日曜日

[c] 共有ライブラリの作成とライブラリ検索PATHについて

Ubuntu特有の作法でハマったのでメモ まずは、ライブラリの作成

hello.h
#ifndef HELLO_H
#define HELLO_H

void sayHello();

#endif

hello.c
#include
#include"hello.h"

void sayHello(){
   printf("Hello!!\n");
}

そして、共有ライブラリ作成。ここでは、ヘッダーファイルは、${HOME}/include/に置いておく。 出力するライブラリ名には、バージョンも含めた名前にしてみた。

 gcc -I ${HOME}/include/ -fPIC -shared hello.c -o ${HOME}/lib/libhello.so.1
そして、${HOME}/lib/にて、シンボリックリンクを作成。新しいバージョンができたらこのリンクを作り替える。
 ln -s libhello.so.1 libhello.so
さらにライブラリを使う側を実装。
use.c
#include"hello.h"

int main(){
   sayHello();
   return 0;
}
そして、コンパイル。
gcc -I ${HOME}/include -L${HOME}/lib -lhello use.c
-lで、「libhello.so」のlibと拡張子を除いたものを指定。-LでそのライブラリのPATHを指定する。

そして、コンパイルが通り喜び勇んであせって
./a.out
などど実行すると。
./a.out: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
と叱られる。ライブラリの検索PATHに${HOME}/libが無いためである。ここで普通は、LD_LIBRARY_PATHに${HOME}/libを追加するのだが、Ubuntuでは、ldconfigを使うらしい。
/etc/ld.so.conf.d/内に自分用の設定ファイルを適当な名前で作成してライブラリがあるPATHを記入する。
/etc/ld.so.conf.d/libmy.conf
/home/hoge/lib
そして、設定を反映させるために
sudo ldconfig
すると無事ライブラリを使用したプログラムを実行できる
./a.out 
また、リンクするライブラリを確認するには、
ldd a.out

[c] 型の値範囲

バイナリデータを扱うようになって意識するようになったのでメモ

#include
#include

int main(int argc,char **argv){
   printf("size of char: %d bit\n",CHAR_BIT);
   printf("         char  range is %d -> %d\n",CHAR_MIN,CHAR_MAX);
   printf("  signed char  range is %d -> %d\n",SCHAR_MIN,SCHAR_MAX);
   printf("unsigned char  range is 0 -> %u\n",UCHAR_MAX);
   printf("         int   range is %d -> %d\n",INT_MIN,INT_MAX);
   printf("unsigned int   range is 0 -> %u\n",UINT_MAX);
   printf("         short range is %d -> %d\n",SHRT_MIN,SHRT_MAX);
   printf("unsigned short range is 0 -> %u\n",USHRT_MAX);
   printf("         long  range is %ld -> %ld\n",LONG_MIN,LONG_MAX);
   printf("unsigned long  range is 0 -> %lu\n",ULONG_MAX);
   return 0;
}
以下がi386環境での実行結果
size of char: 8 bit
         char  range is -128 -> 127
  signed char  range is -128 -> 127
unsigned char  range is 0 -> 255
         int   range is -2147483648 -> 2147483647
unsigned int   range is 0 -> 4294967295
         short range is -32768 -> 32767
unsigned short range is 0 -> 65535
         long  range is -2147483648 -> 2147483647
unsigned long  range is 0 -> 4294967295
以下がamd64環境での実行結果
size of char: 8 bit
         char  range is -128 -> 127
  signed char  range is -128 -> 127
unsigned char  range is 0 -> 255
         int   range is -2147483648 -> 2147483647
unsigned int   range is 0 -> 4294967295
         short range is -32768 -> 32767
unsigned short range is 0 -> 65535
         long  range is -9223372036854775808 -> 9223372036854775807
unsigned long  range is 0 -> 18446744073709551615