構造体の初期化について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
オプーナを買う権利を授けよう

構造体の初期化について

#1

投稿記事 by オプーナを買う権利を授けよう » 17年前

追記
MapImage[0].x等はまだ単に初期化してるだけで特に意味はありません。
この構造体の初期化ができないと次にすすめないので
イメージとしては管理人さんのページにあったのはマップが固定でキャラクターが歩いていましたが、相対的にみるとキャラクターを画面中央に固定して背景を逆方向に動かす(例:ロックマン、マリオの動き方)ということをやろうとしています。
よろしくお願いします。

管理人

Re:構造体の初期化について

#2

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

追記っていうのはどこの追記ですか??

オプーナを買う権利を授けよう

Re:構造体の初期化について

#3

投稿記事 by オプーナを買う権利を授けよう » 17年前

うわぁ
送信したはずなのに入ってない><
長いのはだめなんですかね?
分けます
管理人さんのまね
//壁2次元配列
//0=床,1=壁,2=机,3,4=ベッド,10=部屋移動用入り口
int kabe1[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
		{ 1,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,1 },
		{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,1,1,1,1,1,1,1,10,10,1,1,1,1,1,1,1,1,1,1 },
};
//構造体
typedef struct{
	int x,y;//マップ左上の位置
	int image[75][100];//マップ画像格納用
} MAP_IMAGE;

MAP_IMAGE MapImage[1];//将来性を考えて配列で宣言
初期化
void Initiarize()
{
    MapImage[0].x=0;
	MapImage[0].y=0;
	int l=0;
	while(l<75){
		int m=0;
		while(m<100){
			if(l==0 || l==74 || m == 0 || m == 99){
				MapImage[0].image[[/url][m]=1;
			}
			else if(l == 1 && m == 1){
				MapImage[0].image[[/url][m]=10;
			}
			else {
				MapImage[0].image[[/url][m] = 0;
			}
			m++;
		}
		l++;
	}
}
エラー

1>.\Country.cpp(48) : error C2109: 配列または、ポインタでない変数に添字が使われました。
1>.\Country.cpp(51) : error C2109: 配列または、ポインタでない変数に添字が使われました。
1>initiarize.cpp
1>.\initiarize.cpp(33) : error C2109: 配列または、ポインタでない変数に添字が使われました。
1>.\initiarize.cpp(36) : error C2109: 配列または、ポインタでない変数に添字が使われました。
1>.\initiarize.cpp(39) : error C2109: 配列または、ポインタでない変数に添字が使われました。
一部カットしてみたんでもしかしたらこのままコンパイルできるかどうかは未確認です。
↑のようなエラーがでて構造体を初期化できませんでした。
MapImage[0].image[[/url][m]=1;このような使い方はできないのでしょうかね?

管理人

Re:構造体の初期化について

#4

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

>MapImage[0].x等はまだ単に初期化してるだけで特に意味はありません。

グローバル変数は宣言するだけで初期化されますよ。
ローカル変数は初期化せずに使うとおかしなことになりますが、グローバル変数はそのまま使えます。
ただ、ゲームを作る上で、変数を初期化するのはもちろん必要なので、初期化関数を作るのは適切です。
なお、構造体の初期化はmemsetを使うと一行で初期化できるので便利ですよ。

本題ですが、
MapImage[0].image[[/url][m]=1;
これは出来ますよ。
どこか違うところでエラーが出てるんじゃないでしょうか?

管理人

Re:構造体の初期化について

#5

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

以下、このプログラムでは普通にコンパイル通りますよね?
#include <stdio.h>

typedef struct{
	int x,y;//マップ左上の位置
	int image[75][100];//マップ画像格納用
} MAP_IMAGE;
MAP_IMAGE MapImage[1];//将来性を考えて配列で宣言

int main(){
	MapImage[0].x=0; MapImage[0].y=0;
	int l=0;
	while(l<75){
		int m=0;
		while(m<100){
			if(l==0 || l==74 || m == 0 || m == 99){
				MapImage[0].image[[/url][m]=1;
			}
			else if(l == 1 && m == 1){
				MapImage[0].image[[/url][m]=10;
			}
			else {
				MapImage[0].image[[/url][m] = 0;
			}
			m++;
		}
		l++;
	}
	return 0;
}
なお、コードを投稿する時は、<pre>と</pre>タグで囲んで投稿お願いします。(<>は半角)

こういう違いがあります。

プレタグを使わなかったとき

if(a==2){
for(i=0;i<10;i++){
if(b==2){
printf("a");
}
}
}

使ったとき
if(a==2){
	for(i=0;i<10;i++){
		if(b==2){
			printf("a");
		}
	}
}
 

文字数制限はありますが、もし投稿できなかった時は「文字数が多すぎて投稿できません」のような画面が出るはずです。
よほどかなりの量でなければ制限はかからないと思いますが、とても多い時は、参照からソースコードを添付していただければと思います。

box

Re:構造体の初期化について

#6

投稿記事 by box » 17年前

> エラー
>
> 1>.\Country.cpp(48) : error C2109: 配列または、ポインタでない変数に添字が使われました。
> 1>.\Country.cpp(51) : error C2109: 配列または、ポインタでない変数に添字が使われました。
> 1>initiarize.cpp
> 1>.\initiarize.cpp(33) : error C2109: 配列または、ポインタでない変数に添字が使われました。
> 1>.\initiarize.cpp(36) : error C2109: 配列または、ポインタでない変数に添字が使われました。
> 1>.\initiarize.cpp(39) : error C2109: 配列または、ポインタでない変数に添字が使われました。

上記エラーメッセージで、カッコの中の数値は当該ファイルの何行目で
エラーが出ているかを示しています。
当該ファイルの当該行の内容を見せてください。

オプーナを買う権利を授けよう

Re:構造体の初期化について

#7

投稿記事 by オプーナを買う権利を授けよう » 17年前

>管理人さん
そのまま実行してみると
1>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
というエラーがでました><
DXLibをインクルードしてメインの中に入れるとエラーは出ませんでした

>box
エラーの位置はすべてMapImage[0].image[[/url][m]=
の形の位置です。

すみません、今いじってたらできました
原因はextern宣言の中身で
typedef struct{

	int x,y;//マップ左上の位置

	int image[75];//マップ画像格納用

} MAP_IMAGE;

extern MAP_IMAGE MapImage[1];
となっていたことが原因でした
お騒がせしました
ありがとうございました。

管理人

Re:構造体の初期化について

#8

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

私が先ほど書いたプログラムはコンソールアプリケーションのプロジェクトじゃないとコンパイルできないので、
int mainで始まるプログラムを書く、DXライブラリじゃないプロジェクトでコンパイルしていただく事を想定していました。
恐らくそちらでやってもらったら出来たと思いますが、解決したようなので、もう必要ないですねm(_ _)m

オプーナを買う権利を授けよう

Re:構造体の初期化について

#9

投稿記事 by オプーナを買う権利を授けよう » 17年前

>管理人さん
設定いじるとうわぁってことになりそうだったので><

マリオみたいに動かすって内容の続きなんで新しくスレッドたてなかったんですが、このCountry1()で実現したいのです(添付ファイル
使ってる関数はコメントアウトでつけたしてあります
これを実行すると目に見える障害物の位置と実際にぶつかる位置が3ますずれてしまってるのですが、何か原因わかりますでしょうか?

画像表示のためしにiにi+3を入れて表示させてみると障害物の位置と画像表示の位置は一致しましたがなんでそうなってしまったのかがわからないんです・・・
よろしくおねがいします。

閉鎖

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