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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やまっち
記事: 18
登録日時: 2年前

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

#1

投稿記事 by やまっち » 1年前

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

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

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

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

コード: 全て選択

#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
}

アバター
みけCAT
記事: 6003
登録日時: 7年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 1年前

このように構造体内で自分を指すポインタを宣言するには、それ用のタグを宣言して用います。

コード: 全て選択

typedef struct t_tag{
	struct t_tag *next;
	struct t_tag *prev;
	int val;
}t;
もしくは、前方宣言を使ってもいいです。

コード: 全て選択

typedef struct t_tag t;
struct t_tag{
    t *next;
    t *prev;
    int val;
};
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

やまっち
記事: 18
登録日時: 2年前

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

#3

投稿記事 by やまっち » 1年前

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

返信

“C言語何でも質問掲示板” へ戻る