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

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

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

#1

投稿記事 by かりなん » 17年前

初めまして、かりなんと言います。
プログラムに関してはほぼ初心者な為、紹介されているサンプルを
順次見ながらまずはどうなっていくかを見ていこうと思い
やっていたのですが・・・

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:シューティングゲームサンプルの事で

#2

投稿記事 by 管理人 » 17年前

こんにちは、かなりんさん、初めまして。

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

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

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

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

かりなん

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

#3

投稿記事 by かりなん » 17年前

返信ありがとうございます。
こちらの別ページにありました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:シューティングゲームサンプルの事で

#4

投稿記事 by 管理人 » 17年前

調べてみたところ

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:シューティングゲームサンプルの事で

#5

投稿記事 by 管理人 » 17年前

/* 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:シューティングゲームサンプルの事で

#6

投稿記事 by 管理人 » 17年前

/* 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:シューティングゲームサンプルの事で

#7

投稿記事 by かりなん » 17年前

本当にありがとうございました。

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:シューティングゲームサンプルの事で

#8

投稿記事 by 管理人 » 17年前

http://tmz.skr.jp/messages/msg0208.html

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

かりなん

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

#9

投稿記事 by かりなん » 17年前

書いている間にサンプルも書いていただいていたようで
ありがとございます。

管理人

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

#10

投稿記事 by 管理人 » 17年前

http://www.google.co.jp/search?hl=ja&q= ... %B4%A2&lr=

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

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

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

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

GPGA

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

#11

投稿記事 by GPGA » 17年前

このfor文で宣言した変数の寿命については
VC6の不具合ではなく、VC6が出た当時のC++の仕様だそうです。

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

管理人

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

#12

投稿記事 by 管理人 » 17年前

なるほど、そうだったんですか、ではサンプルを修正しないといけませんね><
しかし何故私の方ではコンパイル時に警告すら出ないのでしょう・・。

Justy

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

#13

投稿記事 by Justy » 17年前

しかし何故私の方ではコンパイル時に警告すら出ないのでしょう
 今の C++の仕様には合っているからじゃないでしょうか。

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

#define for if(0);else for

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

管理人

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

#14

投稿記事 by 管理人 » 17年前

>#define for if(0);else for

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

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

ありがとうございます。

Justy

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

#15

投稿記事 by Justy » 17年前

 そういえば、こちらの講座って C++準拠で書かれているんですね。
 気付きませんでした・・・。


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

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

管理人

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

#16

投稿記事 by 管理人 » 17年前

全然オブジェクト指向じゃないんですけど、ちらほらC++環境でないとコンパイル通らない部分があって一環性がないですね^^;
CxLibはC++だったんですかぁ、リファレンスページを見る限りではCかと思ってました。

Justy

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

#17

投稿記事 by Justy » 17年前

CxLibはC++だったんですかぁ、リファレンスページを見る限りではCかと思ってました

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

管理人

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

#18

投稿記事 by 管理人 » 17年前

なるほど、ありがとうございます、今後の参考にします。

閉鎖

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