日別アーカイブ: 2014/01/13

Arrays of Arrays

動的配列みたいなワード検索するとよく見かける C 言語コード

#include <stdio.h>

#define MAX_LENGTH 1024

int
main (int argc, char** argv) {

    int count,i;
    char** arg;
    count = 3;
    /* 開始 */
    arg = (char**)malloc(sizeof(char*) * count);
    i = 0;
	for (i; i<count; i++) {
        arg[i] = (char*)malloc(sizeof(char) * MAX_LENGTH);
        sprintf(arg[i], "malloc %03d", i);
    }
    /* printf と破棄 */
    i = 0;
    for (i; i<count; i++) {
        printf("%s\n", arg[i]);
        free(arg[i]);
    }
    free(arg);
    return 0;
}

c_aoa

これだと gcc は盛大に Warning を吐いてくれるのね。
ポインタのポインタが配列の配列だと認識できないのかな?
先頭要素のポインタを一つ分オフセットすれば次の要素のポインタ…
って今なら普通に解るけどスゲェ理屈だよな。

minipoli で使っている C++ 式というか new でなら問題無い。
TCHAR を使っているし解りづらいので少し書き換えて。

#include <stdio.h>

const int MAX_LENGTH = 1024;

int
main (int argc, char** argv) {

    int count = 3;
    // 開始
    char** arg = new char* [count];
	for (int i=0; i<count; i++) {
        arg[i] = new char[MAX_LENGTH];
        sprintf(arg[i], "new %03d", i);
    }
    // cout と破棄
    for (int i=0; i<count; i++) {
        printf("%s\n", arg[i]);
        delete[] arg[i];
    }
    delete[] arg;
    return 0;
}

C++ なのに何故 stdio なんだよとあの頃の自分にツッコミしたい。
VisualStudio でプログラミングを始めるとそうなっちゃうんだよなぁ。
Linux で C++ は実用面では避けたいんだが、gtkmm ワカンネエし。

GLib に GArray というものがあるので使ってみる。

#include <glib.h>

#define MAX_LENGTH 1024

int
main (int argc, char** argv) {

    GArray* array;
    gchar   c[MAX_LENGTH];
    gint    count, i;

    count = 3;
    /* 開始 */
    array = g_array_new(TRUE, TRUE, sizeof (gchar*));
    i = 0;
    for (i; i<count; i++) {
        g_sprintf(c, "GArray %03d", i);
        gchar* temp;
        temp = g_strdup(c);
        g_array_append_val(array, temp);
    }
    /* printf 破棄は不要 */
    i = 0;
    for (i; i<array->len; i++) {
        g_print("%s\n", g_array_index(array, gchar*, i));
    }
    /* 第二引数 TRUE で中身も破棄 */
    g_array_free(array, TRUE);
    return 0;
}

そうか、あらかじめポインタの領域が確保されているわけじゃないもんな。
一度新な領域を確保してポインタを入れる必要があるわけだ。
公式サンプルコードなら簡単だけど成形するとなると一手間掛かる。
GLib のほうが面倒臭いなんて初めて見た。

うーん、どれもイマイチだ。
次は GList でも調べるか。