構造体をソートするC言語マクロ

任意の構造体について、その配列を走査し、特定のメンバーの値でソートするC言語マクロを定義します。

ソース program.c

#include <stdio.h>
#define SORT(TYPE,ARRAY,MAX,PROPERTY) \
    do {/*ブロックスコープ作成*/\
        int i, j; \
        TYPE temp; \
        for (i = 0; i < MAX; i++) { \ for (j = MAX; j > i; j--) { \
            if (ARRAY[j - 1].PROPERTY > ARRAY[j].PROPERTY) { \
                temp = ARRAY[j]; \
                ARRAY[j] = ARRAY[j - 1]; \
                ARRAY[j - 1] = temp; \
                    } \
            } \
        } \
    } while(0)

// ソートの対象とする適当な構造体
typedef struct {
    int bar;
    int baz;
} Foo;

Foo foos[9];

// 配列の中身を確認するヘルパー関数
void print_foos(char *msg) {
    int i;
    printf("%s\n", msg);
    printf("(bar, baz) = [");
    for (i = 0; i < 10; i++) {
        printf("(%d, %d)",foos[i].bar, foos[i].baz);
        if (9 != i) {
            printf(",");
        }
    }
    printf("]\n");
}

int main() {
    int i;
    /* 適当に初期値をセットアップ */
    for (i = 0; i < 10; i++) {
        foos[i].bar = i;
        foos[i].baz = 9 - i;
    }

    print_foos("- Before sorting");
    SORT(Foo,foos,9,baz);
    print_foos("- After sorting");

    return 0;
}

SORT(構造体の型名,配列の変数,要素数(0スタート),ソートのキーとするプロパティ名);のように指定します。プリプロセスされて文字列が展開されるだけなので、引用符は不要です。

実行結果

$ gcc program.c -o program; ./program

- Before sorting
(bar, baz) = [(0, 9),(1, 8),(2, 7),(3, 6),(4, 5),(5, 4),(6, 3),(7, 2),(8, 1),(9, 0)]
- After sorting
(bar, baz) = [(9, 0),(8, 1),(7, 2),(6, 3),(5, 4),(4, 5),(3, 6),(2, 7),(1, 8),(0, 9)]

ソートされました。
ネストした構造体に対しても、ドット記法などで指定可能です。

/*例*/
SORT(Foo2,foos,9,foo.baz);

C言語プリプロセッサの処理結果のみを取得する

cppを使用してプリプロセスの結果を取得します。単にcppコマンドを呼ぶだけです。

program.c

#include <stdio.h>
#define SUM(A, B)(A + B)
int main() {
    printf("%d\n", SUM(1, 2));
}

プリプロセス実行

$cpp program.c
..// include節を省略 
int main() {
    printf("%d\n", (1 + 2));
}

WordPressとOpen Sans

WordPressのブログ表示画面にフォントとしてOpen Sansを読み込もうとした時につまづいたことです。Google Fontsからフォントを読み込んだのですが、非ログイン時は適用されないのに、ログイン時には適用されているという現象に遭遇しました。結論を書くと、単に指定したURLの指定ミスだったのですが、原因の切り分けで戸惑ったため、その記録を残します。
“WordPressとOpen Sans” の続きを読む

Travis CIからGitとSubversionのリポジトリへコミットする

Travis CIを用いて、GitとSubversionのリポジトリの両方へコミットするプラクティスです。
例えば、公式リポジトリで公開しているWordPressテーマ・プラグインをGitで管理していてGithubに公開しており、Subversionには触りたくない、というようなケースで有効だと思います。
“Travis CIからGitとSubversionのリポジトリへコミットする” の続きを読む

Githubからhttpsでクローンしたリポジトリをsshでプッシュする

Githubから自分のリポジトリをhttpsでクローンしていたことを忘れていて、sshでプッシュができず戸惑ったので、解決方法をブログに書いておきます。
“Githubからhttpsでクローンしたリポジトリをsshでプッシュする” の続きを読む

Githubでforkしたプロジェクトにissue機能を追加する

Githubでフォークしたプロジェクトについては、issue機能がデフォルトで無効化されています。issue機能を有効化する方法を備忘録としてブログに書いておきます。

“Githubでforkしたプロジェクトにissue機能を追加する” の続きを読む

Travis CIのビルドログをWordPressに埋め込むプラグイン

Travis CIのビルドログをWordPressに簡単に埋め込むためのプラグインoEmbed Travisを作成しました。以下のようなtravis-ci.orgのビルドログのURLをWordPressのエディターにペーストすることで、投稿にビルドログを表示することができます。

  • https://travis-ci.org/user/repo/jobs/12345
  • https://travis-ci.org/user/repo/builds/12345
  • https://travis-ci.org/user/repo/jobs/12345#L123
  • https://travis-ci.org/user/repo/builds/12345#L123

“Travis CIのビルドログをWordPressに埋め込むプラグイン” の続きを読む

GithubとTravis CIを使った継続的なタグ付きリリース

昨年まで和歌山県に住んでいた関係で、和歌山県のITエンジニアコミュニティWackerに参加しています。5/22に開催された#2ミーティングにおいて、GithubとTravis CIを活用したパッケージリリースの方法について話題提供を行いました。
“GithubとTravis CIを使った継続的なタグ付きリリース” の続きを読む