ページ 11

シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:13
by かりなん
初めまして、かりなんと言います。
プログラムに関してはほぼ初心者な為、紹介されているサンプルを
順次見ながらまずはどうなっていくかを見ていこうと思い
やっていたのですが・・・

12. 敵の概念と表示。

と言う所の全てを入れて実行使用とした際に
/* initial.cpp */
の場所にて

C:\Documents and Settings\Administrator\デスクトップ\実行用フォルダ\initial.cpp(15) : error C2374: 'i' : 再定義されています。2 回以上初期化されています。
C:\Documents and Settings\Administrator\デスクトップ\実行用フォルダ\initial.cpp(12) : 'i' の宣言を確認してください。
cl.exe の実行エラー

と言うエラーが出てしまいどうすればいいのか分からず困っています。
この場合はどうしたらいいのでしょうか・・・?
起動環境はC++6.0です。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:17
by 管理人
こんにちは、かなりんさん、初めまして。

エラーの通り、2回以上定義されているのではないでしょうか?

サンプルをそのままコピーされました?
最初にint i=0;とか書いていませんか?

for文の中でiは宣言されていうので、別に宣言をする必要がありません。

もしも自分で改良したものではなくコピーしただけなのに問題があるということでしたら
どこか私の書いたプログラムに問題画あるということなので教えてください。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:25
by かりなん
返信ありがとうございます。
こちらの別ページにありましたDxLibにページの通りに追加していった
だけのはずなのですが・・・(コピーペースト)

for(int i=0;i<PLAYER_MAX_SHOT1;i++)
for(int j=0;j<PLAYER_MAX_SHOT2;j++)
PlayerShot[j].flag=0;
→ for(int i=0;i<ENEMY_TOTAL_NUM;i++)
enemy.flag=0;

上記のようにinitialをペーストした際実行するとエラーが出ました。
→(やじるし)の部分に再定義と出ます。
initialを変えるまではエラーが出てないのでここでどうなっているかがよく分かりません・・・

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:27
by 管理人
調べてみたところ

VC++6.0の特徴として

現象:for ループ内における変数定義のスコープは、ループの内部だけのローカルなものであるべきなのに、そうでなく一つ外側のブロックでローカルになっている。
int main()
{
for(int i = 0; i < 5; ++i)
;
for(int i = 0; i < 5; ++i) // C2374: 'i': 再定義されています。2 回以上初期化されています。
;
return 0;
}

回避手段: 問題となる for ループをもう一つの別の一組の中括弧で囲う.


という記事を見つけました。
for文をかっこで囲んでみてください。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:29
by 管理人
/* initial.cpp */

#include "DxLib.h"
#include "ExternGV.h"


void initialization(){
        Player.x=200.0;
        Player.y=400.0;
        Player.counter=0;
        Player.status=0;
        for(int i=0;i<PLAYER_MAX_SHOT1;i++){
                for(int j=0;j<PLAYER_MAX_SHOT2;j++){
                        PlayerShot[j].flag=0;
                }
        }
        for(int i=0;i<ENEMY_TOTAL_NUM;i++){
                enemy.flag=0;
        }
}

void SetColor(){
        color_white = GetColor(255,255,255);                   //白色ハンドルを取得
}




これで試してみてください。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:30
by 管理人
/* initial.cpp */

#include "DxLib.h"
#include "ExternGV.h"


void initialization(){
        int i,j;
        Player.x=200.0;
        Player.y=400.0;
        Player.counter=0;
        Player.status=0;
        for(i=0;i<PLAYER_MAX_SHOT1;i++){
                for(j=0;j<PLAYER_MAX_SHOT2;j++){
                        PlayerShot[j].flag=0;
                }
        }
        for(i=0;i<ENEMY_TOTAL_NUM;i++){
                enemy.flag=0;
        }
}

void SetColor(){
        color_white = GetColor(255,255,255);                   //白色ハンドルを取得
}

 
 
こちらでもいけると思います。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:32
by かりなん
本当にありがとうございました。

for(int i=0;i<PLAYER_MAX_SHOT1;i++)
for(int j=0;j<PLAYER_MAX_SHOT2;j++)
PlayerShot[j].flag=0;

{
    for(int i=0;i<ENEMY_TOTAL_NUM;i++)
enemy.flag=0;
}

としたら動きました。
また何処かでつまったら質問するかと思いますが
よろしくお願いします。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:34
by 管理人
http://tmz.skr.jp/messages/msg0208.html

こちらの8/19に全く同じような記述があります。
VC++コンパイラの不具合ではないかと思います。
for文の中で宣言されているものは、関数の最初に宣言してみてください。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:34
by かりなん
書いている間にサンプルも書いていただいていたようで
ありがとございます。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 12:37
by 管理人
http://www.google.co.jp/search?hl=ja&q= ... %B4%A2&lr=

この辺で記事を見つけました。

サンプルと言うほどの物ではないですよ^^;

ご覧頂ありがとうございます☆

ゲーム作成頑張ってください^^

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 13:38
by GPGA
このfor文で宣言した変数の寿命については
VC6の不具合ではなく、VC6が出た当時のC++の仕様だそうです。

VC6が出た当初はこれが当たり前として使われていたため
SPで修正してしまうと、互換性がなくなってしまうので
SP6が発行されている今でも、この現象がVC6では起こるようです。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 17:57
by 管理人
なるほど、そうだったんですか、ではサンプルを修正しないといけませんね><
しかし何故私の方ではコンパイル時に警告すら出ないのでしょう・・。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 18:36
by Justy
しかし何故私の方ではコンパイル時に警告すら出ないのでしょう
 今の C++の仕様には合っているからじゃないでしょうか。

 サンプルを直すのであれば、コンパイラを見分けて、
例えば MSVC6.0だったら

#define for if(0);else for

 で回避するとかしてみると、見た目が変わらなくていいと思います。
(あまりお行儀はよくないんですけどね)

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 20:45
by 管理人
>#define for if(0);else for

おぉ、そんなワザが!さすがJustyさんは解決の方法がフタ味位違いますね。面白いです。

一応間違いの構文を書いたままだとそれを他にコピーした時などでエラーが出たりということにつながるかもしれませんので、カッコを使って直そうと思います。

ありがとうございます。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月03日(火) 21:06
by Justy
 そういえば、こちらの講座って C++準拠で書かれているんですね。
 気付きませんでした・・・。


 って、さらに最近気付いたんですか、DxLibも製作元のHPでは
C言語用と書いてあったんですが、実はC言語用じゃなくてC++用だったんですよね。

 こないだ、DxLibをちょっと試してみようかな、と思って
C言語でプロジェクト作ったらビルドが通らなくて・・・。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月04日(水) 01:05
by 管理人
全然オブジェクト指向じゃないんですけど、ちらほらC++環境でないとコンパイル通らない部分があって一環性がないですね^^;
CxLibはC++だったんですかぁ、リファレンスページを見る限りではCかと思ってました。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月04日(水) 01:14
by Justy
CxLibはC++だったんですかぁ、リファレンスページを見る限りではCかと思ってました

 そう思っていたんですけどね・・・。
 インターフェースこそ一見C言語に見えるんですが、"DxDirectX.h"では
classの宣言とかありますし、"DxLib.h"ではデフォルト引数とか使われていて、
C言語だとダメみたいです。

Re:シューティングゲームサンプルの事で

Posted: 2007年4月04日(水) 02:25
by 管理人
なるほど、ありがとうございます、今後の参考にします。