ページ 11

エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 19:00
by chilt
このようなプログラムを書いたのですが以下のエラーが出て実行されません。

(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
(5) : error C2086: 'int img' : 再定義されました。
(3) : 'img' の宣言を確認してください。

コンパイラはVC2008EEを使用しています。

コード:

#include "../include/GV.h"

int img;

img = LoadGraph( "../dat/img/menu/menu.png" );

void img(){
	DrawGraph( 0, 0, img, TRUE );
}

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 19:06
by h2so5
すでに定義している変数と同じ名前の関数を定義することはできません。

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 19:29
by chilt
関数名を変えましたが同じエラーが出ました

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 19:47
by 紫電
こうしてみてはどうでしょうか。
int imgをimg2にして関数のとこで名前をimgにしてみました。これでエラーは出ないと思います


コード:

#include "../include/GV.h"
 
int img2;
 
img2 = LoadGraph( "../dat/img/menu/menu.png" );
 
void img(){
    DrawGraph( 0, 0, img, TRUE );
}

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 19:56
by chilt
同じエラーが出ます

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 19:58
by 紫電
もう一度エラー内容を教えていただけませんか?
もしかしたら微妙に変わっているかもしれないんでw

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 20:01
by chilt
DrawGraph( 0, 0, img, TRUE );の場合下のエラーが増えました。
(8) : error C2664: 'DxLib::DrawGraph' : 3 番目の引数を 'void (__cdecl *)(void)' から 'int' に変換できません。(新しい機能 ; ヘルプを参照)

DrawGraph( 0, 0, img2, TRUE );の場合同じエラーです。

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 20:05
by box
紫電 さんが書きました:こうしてみてはどうでしょうか。
そのコードが正しくなさそうなので、質問者さんは混乱されているかもしれません。
紫電 さんが書きました:

コード:

int img2;
img2 = LoadGraph( "../dat/img/menu/menu.png" );
void img(){
    DrawGraph( 0, 0, img, TRUE );
}
変数名をimg2にしたのであれば、
DrawGraph()の第3引数もimg2にしないとまずいですよね?私は詳しくありませんけれど。

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 20:22
by softya(ソフト屋)
そもそも関数外に代入文があるのが大問題だと思いますけど。

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 20:22
by 紫電
box さんが書きました:
紫電 さんが書きました:こうしてみてはどうでしょうか。
そのコードが正しくなさそうなので、質問者さんは混乱されているかもしれません。
紫電 さんが書きました:

コード:

int img2;
img2 = LoadGraph( "../dat/img/menu/menu.png" );
void img(){
    DrawGraph( 0, 0, img, TRUE );
}
変数名をimg2にしたのであれば、
DrawGraph()の第3引数もimg2にしないとまずいですよね?私は詳しくありませんけれど。

ああ、そうでしたww

DrawGraph( 0, 0, img2, TRUE );

ってかんじですねw

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 20:26
by chilt
関数内に書いたら正常に動作しました。
ありがとうございます。

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 20:26
by box
softya(ソフト屋) さんが書きました:そもそも関数外に代入文があるのが大問題だと思いますけど。
そりゃそうですね。

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 20:30
by softya(ソフト屋)
それとLoadGraph()とDrawGraph()を同じ関数内に書くとメモリリークを起こします。
徐々にメモリ消費量が増えていき、やがてDXライブラリの管理個数の限界を超えて画像が消えます。
「ゲームプログラミングの館」のあちこちに書いてあると思いますが読み込みと表示の関数は必ず分けるようにして下さい。

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 20:33
by 紫電
softya(ソフト屋) さんが書きました:それとLoadGraph()とDrawGraph()を同じ関数内に書くとメモリリークを起こします。
徐々にメモリ消費量が増えていき、やがてDXライブラリの管理個数の限界を超えて画像が消えます。
「ゲームプログラミングの館」のあちこちに書いてあると思いますが読み込みと表示の関数は必ず分けるようにして下さい。

そうなんだw

勉強になりましたw

Re: エラーが出て画像が表示されない

Posted: 2012年5月09日(水) 20:44
by softya(ソフト屋)
紫電 さんが書きました:
softya(ソフト屋) さんが書きました:それとLoadGraph()とDrawGraph()を同じ関数内に書くとメモリリークを起こします。
徐々にメモリ消費量が増えていき、やがてDXライブラリの管理個数の限界を超えて画像が消えます。
「ゲームプログラミングの館」のあちこちに書いてあると思いますが読み込みと表示の関数は必ず分けるようにして下さい。

そうなんだw

勉強になりましたw
より正確に書くとLoadGraph()した画像はDXライブラリの管理ハンドルを1つ消費してDeleteGraph()や画面モードを切り替えない限りメモリ内に常駐します。
だから、いつでもDrawGraph()で表示できるのですが、もしこのプログラムのように毎回呼び出す関数img()の中にimg2 = LoadGraph( "../dat/img/menu/menu.png" );があるとimg2;に毎回新しい画像ハンドルが設定されます。
これだと前の画像ハンドルは見かけ上は消えたように見えますが、DXライブラリ内には前の画像ハンドル・画像データは残ったままなので秒間60個づつ画像ハンドルとメモリを消費して行くことになります。
まぁ、毎回ファイルを読み込むので遅いですし、30KB程度の画像だとしても1分も立たない内に30KBx60フレームx60秒=約100MBを消費します。