構造体の初期化ができません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
きずなん

構造体の初期化ができません

#1

投稿記事 by きずなん » 11年前

VisualC2008を使っています。
何故か構造体のメンバの初期化ができなくて困ってます。

main.cppの簡単な流れは、
初期化(Player_Init()という関数で行う)→メインループ→終了

で、Player.cppのソースがこちらです。

コード:


#include "DxLib.h"
#include "Keyboard.h"
#include "Player.h"
#include <stdio.h>


//-----------------------------------------------------------
//		グローバル変数定義
//-----------------------------------------------------------

typedef struct{
	int hp,mp;	//体力とペンキ残量
}CS;

//画像ハンドル
static int Handle[10];

//スキル[矢印キー][種類]
static int Skill[4][50];
static int Init,Init2;	//初期化するか否かの数値
static int wait,Timer;	//待機時間

//各点の情報を詰め込むボックス
static int RGB[640][480];





//-----------------------------------------------------------
//		各種関数の定義
//-----------------------------------------------------------

Mouse M(){
	static Mouse p;
	GetMousePoint( &p.x , &p.y );
	return p;
}

void Player_Init(){
	for(int i=0;i<4;i++) for(int j=0;j<50;j++) Skill[i][j] = 0;
	Init = 0;
	Init2= 0;	//スキル発動後からの時間計測用
	wait = 0;
	Handle[0] = LoadGraph("img/menu.png");
	CS.hp = 5;
	CS.mp = 99;
}

これで、下記のエラーが発生します。

エラーコード
c:\documents and settings\kk2\my documents\visual studio 2008\projects\game01\player.cpp(47) : error C2143: 構文エラー : ';' が '.' の前にありません。
c:\documents and settings\kk2\my documents\visual studio 2008\projects\game01\player.cpp(47) : error C2143: 構文エラー : ';' が '.' の前にありません。
c:\documents and settings\kk2\my documents\visual studio 2008\projects\game01\player.cpp(48) : error C2143: 構文エラー : ';' が '.' の前にありません。
c:\documents and settings\kk2\my documents\visual studio 2008\projects\game01\player.cpp(48) : error C2143: 構文エラー : ';' が '.' の前にありません。

47行目が、「CS.hp = 5;」としている行です。
どこがいけないのでしょうか。

nil
記事: 428
登録日時: 12年前

Re: 構造体の初期化ができません

#2

投稿記事 by nil » 11年前

CSはtypedefされた型名であり変数名ではないためです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 構造体の初期化ができません

#3

投稿記事 by softya(ソフト屋) » 11年前

CSはtypedefした新たな型の名前です。
型名ですから変数としての実体を持っていません。
static CS cs;
などで変数の実体を定義する必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きずなん

Re: 構造体の初期化ができません

#4

投稿記事 by きずなん » 11年前

なるほど。

すいません、追加で質問になってしまうのですが、例えば
typedef struct cs{
int a;
}CS;

と書いた場合でしたら、新しい型が「cs」で、CSは「csの型を持った変数」ということになりますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 構造体の初期化ができません

#5

投稿記事 by softya(ソフト屋) » 11年前

それだとstruct csという形名とCSと言う形名を持つことになりますが、変数の実体は定義されません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きずなん

Re: 構造体の初期化ができません

#6

投稿記事 by きずなん » 11年前

う~ん、、、
typedef struct a{
~~
}A;

と書くメリットが何なのか前から突っかかってます・・・。
こう書いても変数の実体が無ければやはり
A tekitou;
とか書いて実体を作る必要性がありますよね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 構造体の初期化ができません

#7

投稿記事 by softya(ソフト屋) » 11年前

きずなん さんが書きました:う~ん、、、
typedef struct a{
~~
}A;

と書くメリットが何なのか前から突っかかってます・・・。
こう書いても変数の実体が無ければやはり
A tekitou;
とか書いて実体を作る必要性がありますよね。
それは同じ型の宣言・定義を楽するために使います。
CS cs;
としてこれを引数に使うとします。

コード:

void func(CS work); 

void xxx(void)
{
		:
	CS cs;
	cs.hp = 11;
	cs.mp = 22;
	func(cs);
		:
}

void func(CS work)
{
	DrawFormatString( 0, 0, GetColor(255,255,255), "HP=%d MP=%d", work.hp, work.mp );
}

こういうのは、typedefなどを使わないと面倒になるだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 13年前

Re: 構造体の初期化ができません

#8

投稿記事 by box » 11年前

きずなん さんが書きました:

コード:

typedef struct a{
    ~~
}A;
と書くメリットが何なのか前から突っかかってます・・・。
同じ型の構造体変数をいろんなところで定義する必要がある場合、毎回

コード:

    srtuct a hoge;
とか

コード:

    srtuct a foo;
とかをいろんなところで書くよりも、typedefで1回だけ別名を作っておけば、それ以降は

コード:

    A bar;
とかいうように簡潔に書けるから、という理由があろうかと思います。
きずなん さんが書きました: こう書いても変数の実体が無ければやはり
A tekitou;
とか書いて実体を作る必要性がありますよね。
そのとおりです。
最後に編集したユーザー box on 2013年1月19日(土) 00:11 [ 編集 4 回目 ]
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 構造体の初期化ができません

#9

投稿記事 by h2so5 » 11年前

やさしい書き方というのがよく分からないので単刀直入に言いますが、structのスペルが間違っています。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 構造体の初期化ができません

#10

投稿記事 by ISLe » 11年前

構造体の定義は
struct ST { ~ };
です。
struct ST st;
というふうに変数を宣言します。
C++ではそのままで
ST st;
と変数を宣言できます。

型の別名を定義するには
typedef 型 別名;
の構文を使います。

両方を組み合わせたのが
typedef struct { ~ } ST;
です。
別名を使うので構造体の型名を省略しています。

構造体の定義でtypedef structでワンセットだと思っているひとは多いですけど。


#>boxさん
#こちらでも燃料投下ですか。精が出ますね。
#爆弾燃料投下=煽り。

#また投稿する前に記事が変更されましたな。
#思ったとおりに動かないのはプログラムだけじゃないっすよ。

box
記事: 2002
登録日時: 13年前

Re: 構造体の初期化ができません

#11

投稿記事 by box » 11年前

ISLe さんが書きました: #こちらでも燃料投下ですか。精が出ますね。
#爆弾燃料投下=煽り。
<br>タグの件は、当方がPHPのことをよく知らなかったことによる「間違い投稿」です。
もう勘弁してください。どうか、どうかお願いします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 構造体の初期化ができません

#12

投稿記事 by ISLe » 11年前

> box さん
<br>タグとは何のことでしょう。
わたしがこのスレに投稿するときに、『このスレの』boxさんの投稿に煽り文句が書かれているのを見てそれに反応したに過ぎません。
あちらとは関係ありません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 構造体の初期化ができません

#13

投稿記事 by softya(ソフト屋) » 11年前

質問者のきずなんさんが使いづらくなると思いますので、こちらではこれ以上続けるのはご遠慮ください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Ryo

Re: 構造体の初期化ができません

#14

投稿記事 by Ryo » 11年前

コード:

typedef struct _stDATA
{
	int data1;
}stDATA,*pstDATA
私は、こんな風につかったりします。

あと

コード:

typedef struct _stHEAD_Vxx
{
	/*略*/
}stHEAD_V00,stHEAD_V01;
こんな風にも

box
記事: 2002
登録日時: 13年前

Re: 構造体の初期化ができません

#15

投稿記事 by box » 11年前

softya(ソフト屋) さんが書きました:質問者のきずなんさんが使いづらくなると思いますので、こちらではこれ以上続けるのはご遠慮ください。
承知いたしました。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

きずなん

Re: 構造体の初期化ができません

#16

投稿記事 by きずなん » 11年前

皆さまご回答ありがとうございます。

typedef宣言で定義が楽になるのは理解できるんです。
typedef宣言と構造体structは相性が良いですよね。

ですが、まだ
typedef struct a{ ~~~ }b;
b hoge;
と書く場合と、
typedef struct { ~~~ }b;
b hoge;
と書く場合の違いというか、前者を書く理由がいまひとつ分かりません。
どっちの例でも2行目は「struct」を省けるので楽になりますよね?
加えてどっちの例でも同じ構造を持った変数hogeが定義されてますよね。
両者のhogeの内容に違いはありませんよね?
わざわざ前者を使う例ってなんなのでしょうか。私には、前者はむしろややこしくしている感じがします。

この答えが、私の質問

コード:

typedef struct cs{
int a;
}CS;
に対するsoft屋様のご返答
>それだとstruct csという形名とCSと言う形名を持つことになりますが、変数の実体は定義されません。
だと思うんですけど、
「struct cs」という型名とはどういうことでしょうか?
csもCSもstruct宣言と同義になったというわけではないんでしょうか?
cs hoge;
CS hoge;
と書いた場合、何が違うのでしょう?

しつこくて申し訳ありません。

アバター
へにっくす
記事: 634
登録日時: 12年前
住所: 東京都

Re: 構造体の初期化ができません

#17

投稿記事 by へにっくす » 11年前

コード:

typedef struct cs{
    int a;
}CS;
こう宣言された場合、

コード:

cs hoge; // これだとコンパイルエラー
struct cs hoge; // OK
CS hoge; // OK
となります。
てーか実際にコンパイルすれば分かることかと
ただし、C言語としてコンパイルすること。C++でやると通ります。
きずなん さんが書きました:ですが、まだ
typedef struct a{ ~~~ }b;
b hoge;
と書く場合と、
typedef struct { ~~~ }b;
b hoge;
と書く場合の違いというか、前者を書く理由がいまひとつ分かりません。
分からなくて結構。好みの問題ですから 笑
ISLeさんの言うこととかぶるのですが、
構造体の宣言の仕方は
struct タグ名 {・・・};
でしたね?このタグ名はなくても、
struct { } a;
として変数宣言できますよね?
この規則に従ってるだけですよ。
typedefを使う場合は最後に来る名前が、別名となるわけですから、
struct { } a;
だと無名の構造体の型をもつaという変数という宣言だったのが
typedef struct { } a;
となると
無名の構造体の型の別名をaと宣言する
と変わるだけ。
最後に編集したユーザー へにっくす on 2013年1月20日(日) 21:13 [ 編集 1 回目 ]
written by へにっくす

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 構造体の初期化ができません

#18

投稿記事 by h2so5 » 11年前

>へにっくすさん

紛らわしいんですが、このトピックは古いやつでして最新のはこちらです。
http://dixq.net/forum/viewtopic.php?f=3&t=12342

アバター
へにっくす
記事: 634
登録日時: 12年前
住所: 東京都

Re: 構造体の初期化ができません

#19

投稿記事 by へにっくす » 11年前

h2so5 さんが書きました:>へにっくすさん

紛らわしいんですが、このトピックは古いやつでして最新のはこちらです。
http://dixq.net/forum/viewtopic.php?f=3&t=12342
ありがとうございます
何だ・・・ orz
written by へにっくす

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: 構造体の初期化ができません

#20

投稿記事 by naohiro19 » 11年前

構造体定義の構造体名はアンダースコア(_)ではじめるのはC言語の仕様では未定義な動作を起こすので使わないほうがいいですよ。

閉鎖

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