【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

C言語

整数の割り算を掛け算に変換 (4)

ここまで見てきた計算方法で、どれくらい高速化するか実験します。

整数の割り算を掛け算に変換 (3)

引き続き整数の割り算を掛け算に変換する方法について考えます。

整数の割り算を掛け算に変換 (2)

引き続き整数の割り算を掛け算に変換する方法について考えます。

整数の割り算を掛け算に変換 (1)

コンパイラの出力を見ていると、除数が定数の場合に整数の割り算を掛け算に変換していることに気付きます。これがどんな原理で行われているのか考えてみました。

void *とintptr_t

今まで何度かvoid *の説明を求められましたが、なかなか納得してもらえませんでした。説明を工夫するだけでは限界があると感じたので、別の方法でどうにかならないかを考えてみました。前回の記事の延長線上で説明します。サンプルコードを再掲します。 mov …

メモリ書き込み構文

対象環境を限定できる場合、バイト配列にリトルエンディアンで32bit値を書き込むときに、私は以下のように書いていました。 char buf[32]; *(int *)&buf[6] = 0x12345678; 非常に分かりにくいとご指摘を受けて色々と変形しましたが、どれもしっくり来ません…

文字列配列を作る (1)

数回に分けて文字列配列を作ってみます。手始めに検証用サブルーチンをJITで作ってみます。 strarray.c #include <stdio.h> #include <string.h> #include <windows.h> // for (i = 0; i < argc; i++) { // printf(argv[i]); // putchar(' '); // } char buf[] = { 0x56, // push esi 0x8b,</windows.h></string.h></stdio.h>…

関数のサイズ

第6回 コンパイラ実装会で出た話題です。関数のサイズを取ろうとしたら1になりました。なぜ? test.c #include <stdio.h> int main(void) { printf("%d\n", sizeof(putchar)); return 0; } 実行結果 $ gcc test.c $ ./a.exe 1int aへのポインタが&aであるように、putc</stdio.h>…

手動呼び出し

COMのメモリレイアウトを理解するため、なるべく既存のマクロを使わないでC言語から呼び出してみました。 https://gist.github.com/1362172 手軽にCOMのサンプルを作る方法が見当たらなかったので、以下の Project1.dll を使わせていただきました。 C言語でC…

引数と戻り値の省略

PE勉強会(1)で配布した資料(id:n7shi:20110219)のサンプルコードに問題があり、ご指摘を受けました。調べた所、色々な意味で突っ込みどころが満載でした。 int _main() {} 結論から言うと、以下のように書くのが無難なようです。 int _main(void) { return…

FFI

Haskellをどこから使い始めれば良いのか分からずに放置していたのですが、何気なく検索したFFIが気になったので遊んでみました。

二重起動禁止と通知

昨日C#で作ったものと同じようなものをC言語で実装してみました。二重起動判定はMutexではなくFindWindow()で行っています。なるべく簡単に実装するため、.NETリモーティングの代わりにWM_SETTEXTを投げています。

画像サイズを取得

【追記】C#移植版 ⇒ id:n7shi:20110204C言語で外部ライブラリ(libjpeg等)を使わずにJPEGの画像サイズを取得するプログラムを書いてみました。パブリックドメインに置いておきます。

IEEE 754 単精度浮動小数点数

C言語で浮動小数点数を算出するプログラムを書いてみました。

パイプ進捗表示ツール

ファイルを標準出力に転送しながら進捗を表示する小さなツールを作成しました。 使用例 % sizecat src.tar.bz2.1 src.tar.bz2.2 | bzcat | tar xf - 49% [#########################-------------------------] 92/185 KB上例のようにアーカイブを展開する時…