c

zero length array, flexible array

c

github.com たまたま目に入ったこのコードを見ていて, zero length arrayって末尾のメンバ以外でも使えたんだって思って気になるところを調べてみた. Flexible array en.wikipedia.org C99から入った機能. 配列の長さを宣言しないことで利用できる. sizeofは…

C99の配列初期化が気になる場合

c

C99の配列初期化に潜む罠 | monoの開発ブログ GCCだと "-Woverride-init"オプションをつけることで、重複した初期化が ある場合警告してくれます. #include <stdio.h> int data[] = { [3] = 3, [2] = 2, [1] = 1, [0] = 0, 0, }; int main (void) { for (int i = 0; i </stdio.h>…

getmntent使用例

Man page of GETMNTENT /etc/mtabに列挙される情報を読み出すためのインタフェースの ようである。mountコマンドを引数なしで実行した場合の一覧表示に 利用されているようです。 コード 参考のために、読み出されてセットされる構造体も載せておきます。 #i…

mountシステムコールの使用例

調べてもあまり見つからなかったのでメモ。 コード 詳しくは manを参照してください。 特徴的なのは最後の引数ですかね。mountコマンドの '-o'オプションで与えるものを そのまま指定するという形です。何を指定するかは第 3引数のファイルシステムの 種類に…

デバイスが READ Onlyかどうかの判定

Linuxでは ioctlの BLKROGETコマンドを使うと read onlyか どうかが得られるようである。(Readonlyでマウントしたかどうか ではなく、デバイスレベルで Readonlyかどうかという話です) コード #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <linux/fs.h> </linux/fs.h></fcntl.h></sys/stat.h></sys/types.h></stdlib.h></stdio.h>…

MBRの有無の判定

c

マスターブートレコード - Wikipedia 510バイトが 55, 511バイトが AAなので以下のような感じで いいのだろうか ? コード #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc, char *argv[]) { int fd; ssize_t size; off_t re</fcntl.h></sys/stat.h></sys/types.h></unistd.h></stdlib.h></stdio.h>…

標準入力が pipeかどうかの判定

c

the silver searcherは stdinが ttyに関連付けられていないと 標準入力が pipeと判定しているんですが、そのせいで単純に エディタから agコマンドを叩くと標準入力待ちになってしまいます。 問題となる部分は src/options.cの以下の部分です /* stdin isn't…

拡張子のない Cファイルをコンパイルする

quickrun.elでファイルに関連づいていないバッファで quickrunを実行する とき、Cファイルとか C++だと拡張子がないということで怒られたので その対応を調べてました。それについてのメモ。 問題点 #include <stdio.h> int main (void) { printf("hello world\n"); r</stdio.h>…

setlocaleで "POSIX"を指定するときの注意

Glibcに限った話なんですが、setlocaleで "POSIX"を指定しても 現在の localeは "POSIX"になりません。"C"になります。これは 内部的に同じものを意味するので大して問題になるわけではないん ですが、現在の localeの文字列を比較するような場合は注意が 必…

main関数の戻り値について

c

echo $?で int main(){} を確認すると、C++だとゼロになるけどCだとその時のレジスタが返って来る。-std=c99だとC言語でも0になる。この辺の細かいことをまったく理解していなかった。2011-02-20 00:35:26 via Tweenを見て、どのレベルでその設定が行われて…

ふつうの Linuxプログラミング 5章

復習がてらに読む。 5章はシステムコールに関するシステムコールということで open, read, writeなどを使って catプログラムの作成。 課題は引数があればファイルから、引数がないなら標準入力から 読む catを作れということで書いてみた。 プログラム テス…

selectシステムコールのサンプル

完全に写経でしかないのですが。selectシステムコールの例。 複数のファイルハンドルを待つっていう状況がイメージしづらい ですが。ネットワークとかデバイスの状態を複数監視というのに 使えるのだろう。 とりあえず使ってみないとイメージわかないから、 …

weakシンボル

glibcのソースを見ていたら weakシンボルをやたらと多様していた。 なんとなく言葉は知っていたが、はっきりとわかっていたわけでない ので改めて確認する。 普通関数を 2つ定義すると多重定義ということで怒られるけど、 そのうちの一つが weakシンボルであ…

GCC 4.3の新機能 2進数表記

c gcc

GCC4.3のChangelogを見ていたら、 GCC4.3から 2進数表記が対応したみたい。 大学のプログラミングの授業ではこんな機能が あったらいいな〜って思っていたけど、今になると そこまでうれしくないかな。 #include <stdio.h> int main(void) { printf("%d\n", 0b1111); </stdio.h>…

GCCの4.3の新機能 __COUNTER__マクロ

c gcc

もう一つ気になった機能で __COUNTER__マクロがあります。 これは呼ばれるたびに 0から1ずつインクリメントしていく というものです。 利用方法がよくわからないけど、便利なのかな? マクロって結局実行前に展開されてしまうからね。 そこが難しいところで…

シンプルな逆ポーランド式計算機

c

数字は一桁しか対応してません。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_MAX 1024 typedef int (*OP_TYPE)(int, int); static OP_TYPE get_operator(char c); static int is_operator(char c); static int add(int a, int b); static int sub(int a, </ctype.h></stdlib.h></stdio.h>…

A-Eのような表記を ABCDEに展開するプログラム

c k&R

K&Rに出ていた問題を解いてみた. static int expand(char *dest, const char *src) { int i, j, dest_index; int length; char prev, next; length = strlen(src); dest_index = 0; for (i = 0; i < length; i++) { if (src[i] == '-' && (i != 0 && i != le…

同期書き込み

システムコールの本を読んでいると、writeシステムコールは 同期書き込みが行えるようです。やりかたはファイルを open するときのフラグ引数に O_SYNCをつけるだけです。 O_SYNCをつけた同期と、非同期書き込みで最後にfsyncで ディスクに書き出すプログラ…

数値定数について

Cリファレンスマニュアルを読んでいると数値定数について 知らなかったことがいくつかあったのでメモ。"0x"をつけた数字は C89以降では unsigned int以上で扱われる。 C89では可能性として long, unsigned longもあるんですけど、 規則によるとオーバーフロ…

日付解析できない原因がわかった。

昨日のエントリーで Time::Pieceモジュールの strptimeメソッドが うまくいかない理由がわかりました。同時に解決方法もわかりました。 結論からいうと、 ロケールに問題がありました。昨日のうまくいかない 例をたどってみると曜日、月の解析ができないこと…

日付解析がうまくいかない

昨日のエントリのように ISO8601形式であれば日付の解析が 行えたが、RSSにある pubDateの形式の場合はなぜかうまくいかない Time::Pieceモジュールに含まれる Piece.xsを確認したところ、 Cライブラリの strptimeを呼び出しているだけであったので、 C言語…

ディレクトリにあるファイル名の取得

Perlだったら楽勝なんですが、C言語ではどうやるかが わからなかったので調べてみた。opendirでディレクトリを読み出して、readdirでディレクトリ エントリを読み出してファイル名を取得できる。 #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> int main (int arg</sys/stat.h></dirent.h></sys/types.h></stdio.h>…

極力遅いソーティング

プログラミング作法という本に極力遅いソーティングをしろという問題があったので それを実装してみた。当然ながら適当なループで時間稼ぎとかはなしで、答えを求めるのが 遅いというものね。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/time.h> static void late_sor</sys/time.h></time.h></stdlib.h></stdio.h>…

プログラミング言語 C 3.5

c k&r

符号なし整数 nを b進数に変換し、文字列 sに格納する関数 htob(n, s, b)を書け、 という問題。どんどん bで割っていって、余りを sに格納していって、最後に sを 反転させればいいはず。 #include <stdio.h> #include <string.h> #include <assert.h> static void htob(int n, char *s, i</assert.h></string.h></stdio.h>…

プログラミング言語 C 3.4

c k&r

本に掲載されている atoiでは INT_MINがうまく扱えないのでその理由と その問題を修正したものを書けという問題。うまくいかない理由は符号の 処理を最後にしているから、INT_MINを求めるのに -(INT_MAX + 1)となって しまって答えがおかしくなってしまう。…

プログラミング言語 C 3.3

c k&r

a-zなんかを a....zに展開する関数 expand(s1, s2)を書けという問題。s1がソースで s2がデスティネーションです。難しいと思ったが結構すぐできましたね。問題がある かもしれないですね。 #include <stdio.h> #include <string.h> #include <ctype.h> #include <assert.h> static void expand(char</assert.h></ctype.h></string.h></stdio.h>…

プログラミング言語 C 3.2

c k&r

改行文字などの見えない文字を '\n'(2文字)などに変換しながらコピーする escape(src, dest)を作成しろという問題。ただし switchを使うこと。 全部のエスケープ文字をしていないけど、この延長でなんとかなるでしょう。 #include <stdio.h> #include <string.h> #include <assert.h> stat</assert.h></string.h></stdio.h>…

プログラミング言語 C 3.1

c k&r

本に掲載されている二分探索よりも条件分岐が少ないものを書けという 問題。なんか返ってややこしくなる感じがあるので、普通に教科書に書いて いる方を使った方が良さげな気はしますね。 #include <stdio.h> #include <assert.h> static int binary_search(int x, int *a, int </assert.h></stdio.h>…

プログラミング言語 C 2.10

c k&r

三項演算子を使って、tolowerを書けという問題。 #include <stdio.h> #include <assert.h> static int my_lower(int c); static void test_my_lower(void); int main(void) { test_my_lower(); } static void test_my_lower() { assert(my_lower('0') == '0'); assert(my_lower(</assert.h></stdio.h>…

プログラミング言語 C 2.9

c k&r

ある整数 xに対して、 x & (x-1)が最も右の "1"であるビットを削除するという 事実を使って、bitcountの高速版を作れという問題。x & (x-1)がこうなる理由は x & (x-1)をすると、最も右の 1ビット以下のビットが反転するため、それと論理積を とるとすべて 0…