構造体変数の宣言と使用について

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

構造体変数の宣言と使用について

#1

投稿記事 by wasawasa » 10年前

画像を格納する為の変数int Grを含んだ構造体とその変数picを宣言した後、関数でpicのメンバとなっているGrにLoadDivGraphで画像を格納しようとしたらビルド時にエラーが発生してしまいましたが、一体どこで記述を間違っているのかが分かりません。その時のソースとエラー文は次の通りです。

コード:

#include "DxLib.h"
#define SpriteAmount 12//スプライトの総数
#define PictureReadAmount 2//読み込む画像ファイルの数

struct Graph{
	int Gr;//画像格納変数
	double point[2];//各画像の原点
};
struct Graph pic[SpriteAmount];

struct ReadFileInf{
	char *FileName;//ファイルのポインタ
	int allnum,xnum,ynum,xsize,ysize;//画像の分割総数,横に対する分割数,縦に対する分割数,分割された画像一つのx方向の大きさ,y方向の大きさ
};
struct ReadFileInf ReadForObject_Gr[PictureReadAmount] = {//画像読み込み順番情報
	{ "../Picture/STGtate_test.png" , 6 , 2 , 3 , 40 , 40 },
	{"../Picture/STGtate_test2.png" , 6 , 2 , 3 , 40 , 40 }
};

void PictureRead(struct Graph *pic_inPictureRead , struct ReadFileInf *RFOG_inPictureRead){//画像ファイル読み込み 使用外部変数:PictureReadAmount
	int i;
	int a=0;
	for(i = 0; i < PictureReadAmount; i ++){
		LoadDivGraph( RFOG_inPictureRead[i].FileName , RFOG_inPictureRead[i].allnum , RFOG_inPictureRead[i].xnum , RFOG_inPictureRead[i].ynum , RFOG_inPictureRead[i].xsize , RFOG_inPictureRead[i].ysize , pic_inPictureRead.Gr + a );
		a += RFOG_inPictureRead[i].allnum;
	}
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
	PictureRead(pic.Gr,ReadForObject_Gr);
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}  
1>c:\users\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(24) : error C2228: '.Gr' の左側はクラス、構造体、共用体でなければなりません
1> 型は 'Graph *' です。
1> 代わりに '->' を使用しますか?
1>c:\users\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(31) : error C2228: '.Gr' の左側はクラス、構造体、共用体でなければなりません
1> 型は 'Graph [12]' です。

一体何処が間違っていてどのように直せばいいのかを教えて下さい、お願いします。

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

Re: 構造体変数の宣言と使用について

#2

投稿記事 by h2so5 » 10年前

pic変数は配列ですよね。
pic.Gr という記述では配列のどの要素にアクセスすべきかが分かりません。

wasawasa
記事: 94
登録日時: 10年前

Re: 構造体変数の宣言と使用について

#3

投稿記事 by wasawasa » 10年前

すみません、main関数での PictureReadでの参照時にpic全体を参照する筈が間違って.Grも入れてしまいました…、お恥ずかしい事です。
それで、PictureRead(pic.Gr,ReadForObject_Gr);をPictureRead(pic,ReadForObject_Gr);に直してコンパイルしてみたところ、次のようなエラーが出てきました。

1>c:\users\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(24) : error C2228: '.Gr' の左側はクラス、構造体、共用体でなければなりません
1> 型は 'Graph *' です。
1> 代わりに '->' を使用しますか?

24行目のpic_inPictureRead.Grは画像の格納先としての参照なので配列のどの部分であるかを指定する必要はなく、PictureRead関数の引数pic_inPictureReadへの構造体picの渡し方もこれでいいと思ったのですが……。
改めてどこが間違っているのかをよろしくお願いします。

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

Re: 構造体変数の宣言と使用について

#4

投稿記事 by ISLe » 10年前

エラーメッセージに既にヒントが書かれていますけど。
1> 型は 'Graph *' です。
1> 代わりに '->' を使用しますか?
pic_inPictureRead.Gr

pic_inPictureRead->Gr
と書けば良いです。
詳しくは「アロー演算子」で調べてください。

wasawasa
記事: 94
登録日時: 10年前

Re: 構造体変数の宣言と使用について

#5

投稿記事 by wasawasa » 10年前

24行目を次のように書き換えて動かしてみたところ、またエラーが吐き出されてしまいました。

コード:

        LoadDivGraph( RFOG_inPictureRead[i].FileName , RFOG_inPictureRead[i].allnum , RFOG_inPictureRead[i].xnum , RFOG_inPictureRead[i].ynum , RFOG_inPictureRead[i].xsize , RFOG_inPictureRead[i].ysize , pic_inPictureRead->Gr + a );
エラー文
1>c:\users\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(24) : error C2664: 'DxLib::LoadDivGraph' : 7 番目の引数を 'int' から 'int *' に変換できません。(新しい機能 ; ヘルプを参照)
1> 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。

reinterpret_castでググった結果、これはポインタから整数型への変換、整数型からポインタ型への変換、オブジェクト、関数、またはメンバを指すポインタどうしの変換に使われる関数であり、構造体とint型の数値の両方を計算に使う場合はint型の数値をこの関数で構造体に対応する形式に変換する必要があるらしいので次のように書き換えて動かしてみたところ、やはりエラーが吐き出されてしまいました。

コード:

				LoadDivGraph( RFOG_inPictureRead[i].FileName , RFOG_inPictureRead[i].allnum , RFOG_inPictureRead[i].xnum , RFOG_inPictureRead[i].ynum , RFOG_inPictureRead[i].xsize , RFOG_inPictureRead[i].ysize , pic_inPictureRead->Gr + reinterpret_cast<Graph>(a) );
エラー文
1>c:\users\aaaa\visual studio 2008\projects\tatestg_test\tatestg_test\main.cpp(76) : error C2440: 'reinterpret_cast' : 'int' から 'Graph' に変換できません。
1> 変換にはコンストラクタまたは const_cast または reinterpret_cast で使用不能なユーザー定義変換演算子が必要です。

私のreinterpret_castについての認識はこれで合っているのでしょうか?そしてプログラムが動くようにするにはこの一行をどう直したらいいのでしょうか?

wasawasa
記事: 94
登録日時: 10年前

Re: 構造体変数の宣言と使用について

#6

投稿記事 by wasawasa » 10年前

すみません、自己解決しました。
考えてみればこの場合のpic_inPictureRead.GrってのはSpriteAmount個並んだpic_inPictureRead構造体変数それぞれの中にあるSpriteAmount種類のGr変数であってSpriteAmount個の要素があるGr配列ではありませんね。
配列の中に画像を読み込むLoadDivGraph関数で対応できる訳ないですね。
本当にお騒がせしてすみませんでしたf(^_^;

閉鎖

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