合計 昨日 今日

構造体へのポインタの件 (struct で実装できて typedef struct で実装できない)

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: やまっち
[URL]
かけだし(1,869 ポイント)
Date: 2017年4月13日(木) 22:06
No: 1
(OFFLINE)

 構造体へのポインタの件 (struct で実装できて typedef struct で実装できない)

いつもお世話になっております。

以下のような構造体を使った C 言語のコードを書いてみたのですが
struct の方は希望通りにコンパイルと動作確認ができたのですが
typedef struct の方は
  test2.c:19:2: エラー: 不明な型名 't' です
と言う具合のエラーが出てコンパイルできません。

何か回避方法はありますでしょうか?

環境は以下の通りです。
Windows7 64bit
MinGW 付属の gcc (gcc バージョン 5.3.0 (GCC))

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
// #define TS_TEST
 
struct s{
    struct s *left;
    struct s *right;
    int val;
};
 
#ifdef TS_TEST
typedef struct{
    t *next; // test2.c:19:2: エラー: 不明な型名 't' です
    t *prev;
    int val;
}t;
#endif
 
int main()
{
    struct s ss[10];
 
    for(int i=0;i<9;i++) ss[i].right = &ss[i+1];
    ss[9].right = &ss[0];
    for(int i=1;i<10;i++) ss[i].left = &ss[i-1];
    ss[0].left = &ss[9];
    for(int i=0;i<10;i++) ss[i].val = i*10;
 
    for(int i=0;i<10;i++)
    {
        printf("i %d val %d left.val %d right.val %d \n", i, ss[i].val, ss[i].left->val, ss[i].right->val);
    }
   
    printf("\n");
 
#ifdef TS_TEST
    t tt[10];
    for(int i=0;i<9;i++) tt[i].next = &tt[i+1];
    tt[9].next = &tt[0];
    for(int i=1;i<10;i++) tt[i].prev = &tt[i-1];
    tt[0].prev = &tt[9];
    for(int i=0;i<10;i++) tt[i].val = i*100;
 
    for(int i=0;i<10;i++)
    {
        printf("i %d val %d prev.val %d next.val %d \n", i, tt[i].val, tt[i].prev->val, tt[i].next->val);
    }
#endif
}

Name: みけCAT
[URL]
伝説なるハッカー(665,992 ポイント)
Date: 2017年4月13日(木) 22:32
No: 2
(ONLINE)

 Re: 構造体へのポインタの件 (struct で実装できて typedef struct で実装できない)

このように構造体内で自分を指すポインタを宣言するには、それ用のタグを宣言して用います。
コード[C]: 全て選択
1
2
3
4
5
typedef struct t_tag{
    struct t_tag *next;
    struct t_tag *prev;
    int val;
}t;

もしくは、前方宣言を使ってもいいです。
コード[C]: 全て選択
1
2
3
4
5
6
typedef struct t_tag t;
struct t_tag{
    t *next;
    t *prev;
    int val;
};
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: やまっち
[URL]
かけだし(1,869 ポイント)
Date: 2017年4月15日(土) 07:59
No: 3
(OFFLINE)

 Re: 構造体へのポインタの件 (struct で実装できて typedef struct で実装できない)

みけCAT さん、適切なアドバイスありがとうございました。
タグを使う方法、前方宣言を使う方法、ともに使う事ができました。
ありがとうございました。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[4人]