クロス開発環境の構築

IT基礎技術勉強会でクロス開発環境の構築方法を知ったので、さっそく実行。

以下のリンク先の方法でクロス開発環境の構築を行ったところ、gccのインストールに手こずったので、メモ。
IT初心者勉強会:クロス開発環境のインストール

開発環境
Ubuntu 11.04 x64
インストールしたもの
binutils-2.21
gcc-3.4.6
newlib-1.19.0
続きを読む

構造体の不完全型宣言でメンバを隠蔽する

C言語で、あるモジュールを制御するような構造体があるとする。
どの制御を行うかの選択は上位モジュールに行わせたいが、制御で使用する構造体のメンバは見せたくない、といった場合、構造体の不完全型宣言で解決できる。


以下に等比数列・等差数列を計算するプログラムで、構造体の不完全型宣言を用いた例を書いてみた。

続きを読む

MacBookのトリプルブートでUbuntuが起動しない

Mac/Windows/Linuxのトリプルブートを可能にする方法(しかもBoot Camp不使用!) | ライフハッカー[日本版]
を読んでMacBookMac, Windows7, Ubuntu11.04 のトリプルブートに挑戦したら、すごくハマったのでメモ。


rEFItの画面からUbuntu11.04を選んでもLinuxのアイコンが表示されたまま、ずっとフリーズ。
(一緒にインストールしたWindows7は正常に起動する)
調べたところ、Ubuntuの /boot をext4でフォーマットしていたのが原因だったみたい。
ext3でフォーマットし直したら起動するようになった。

関数ポインタで型情報の異なる関数を実行する -キャスト-

C言語の関数ポインタは振る舞いを動的に変えるのに便利。
だけど、関数の型情報に縛られるのは何とかできないかと調べていたら、関数ポインタをキャストしてしまえば、どんな型の関数でも実行できることを知った。
ポインタ虎の巻〜関数ポインタの使い方

#include <stdio.h>

int add(int x, int y) {  return x + y; }

int square(int x) {  return x * x;  }

float div(float x, float y) {  return x / y;  }

int main()
{
    void (* pfunc)(void);
    int x = 10;
    int y = 4;
    
    printf("x = %d, y = %d\n", x, y);

    pfunc = (void (*)())add;
    printf("pfunc(add)    : %d\n", ((int (*)(int, int))pfunc)(x, y));

    pfunc = (void (*)())square;
    printf("pfunc(square) : %d\n", ((int (*)(int))pfunc)(x));
    
    pfunc = (void (*)())div;
    printf("pfunc(div)    : %.2f\n", ((float (*)(float, float))pfunc)((float)x, (float)y));

    return 0;
}

実行結果

$ ./a.out
x = 10, y = 4
pfunc(add)    : 14
pfunc(square) : 100
pfunc(div)    : 2.50


実行結果から正しい結果が返ってきているのがわかる。
けど、これってpfuncは抽象化できているけれども、実行するときに元々の具体的な型情報でキャストしなくちゃいけないから、イマイチ。
結局、型情報に縛られちゃってる。
うーん、使いどころがあるかな?