C言語関係掲示板

過去ログ

No.233.入れ子になっている構造体を配列で持ちたい


No.1420

構造体の入れ子の定義
投稿者---uchida(2002/04/17 12:26:11)


[例]
struct kyuuyo {
long kihon;
long jyutaku;
};
struct syain_dt{
long no;
char name[20];
struct kyuuyo kyu[*];
^^^
};


入れ子になっている構造体を
配列で持ちたいのですが、
[例]でいいますとstruct syain_dtのメンバ
struct kyuuyo kyu[*]←配列の要素を可変にしたい

配列の要素ができれば可変にしたい
のですが、VBでいうとRedim(配列を再定義みたいな)
宣言の仕方、使い方があれば教えてください。


No.1428

Re:構造体の入れ子の定義
投稿者---かずま(2002/04/18 21:07:37)


>入れ子になっている構造体を
>配列で持ちたいのですが、
>[例]でいいますとstruct syain_dtのメンバ
>struct kyuuyo kyu[*]←配列の要素を可変にしたい

kyu をポインタにして、malloc で領域を確保すればできますよ。

例 (エラーチェックさぼってます)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    long kihon;
    long jutaku;
} Kyuyo;

typedef struct {
    long no;
    char name[20];
    Kyuyo *kyu;
} Shain;

void initShain(Shain *sp, int no, const char *name)
{
    int i;

    sp->no = no;
    strcpy(sp->name, name);
    sp->kyu = malloc(no * sizeof(Kyuyo));
    for (i = 0; i < no; i++) {
        sp->kyu[i].kihon = 100 * (i+1);
        sp->kyu[i].jutaku = 10 * (i+1);
    }
}

void printShain(const Shain *sp)
{
    int i;

    printf("no = %ld, name = %s\n", sp->no, sp->name);
    for (i = 0; i < sp->no; i++)
        printf("kyu[%d]: kihon = %ld, jutaku = %ld\n",
            i, sp->kyu[i].kihon, sp->kyu[i].jutaku);
}

void freeShain(Shain *sp)
{
    free(sp->kyu);
    sp->kyu = NULL;
}

int main(int argc, char **argv)
{
    Shain shain;
    int   no;

    if (argc != 2)
        return printf("usage: %s num\n", argv[0]), 1;

    no = atoi(argv[1]);
    initShain(&shain, no, "kaisha");
    printShain(&shain);
    freeShain(&shain);

    return 0;
}


No.1435

Re:ありがとう。
投稿者---uchida(2002/04/19 18:59:37)


ありがとうございました。
早速このソースを解析してやってみます。
またわからなくなった場合はおしえてください。
よろしくお願いします。

No.1430

Re:構造体の入れ子の定義
投稿者---Kaji(2002/04/19 12:32:05)


はじめまして。Kajiといいます。

>配列の要素ができれば可変にしたい
>のですが、VBでいうとRedim(配列を再定義みたいな)
>宣言の仕方、使い方があれば教えてください。
VBのReDimみたいな使い方をしたいのであればreallocですね。
詳しくはMSDNを引いてみてください。



No.1431

Re:構造体の入れ子の定義
投稿者---Kaji(2002/04/19 12:49:11)


>詳しくはMSDNを引いてみてください。
私はWindowsを使っているのでMSDNって書いてしまったんですが
正確には「Helpを引いてみてください」ですね。


No.1436

Re:ありがとうございました
投稿者---uchida(2002/04/19 19:00:54)


realloc調べてみます。ありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.22
Copyright(c) 2000-2002 TOMOJI All Rights Reserved