ページ 11

ファイル読み込みや文字表示ができません

Posted: 2012年6月10日(日) 22:10
by ほしくず
こんにちは

55章のAA弾幕を勉強中なのですが
DrawFormatString
LoadGraph
LoadDivGraph
の関数を使うと
"const char *" の引数は型 "const TCHAR *" のパラメーターと互換性がありません
"int" の引数は型 "int *" のパラメーターと互換性がありません
といったエラーが出てきて悩んでいます
55章のソースファイルをそのままコピぺしても同じ結果になります

原因に心当たりのある方はいらっしゃいませんか?

以下エラーの部分
//描画
void Graph(){
int i;
/*略*/
SetDrawBlendMode(DX_BLENDMODE_ALPHA, 64);
DrawBox(0, 0, 100, 40, 0, TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
DrawFormatString(0, 0, GetColor(255, 255, 255), "間隔=%.1f", operate.len);
DrawFormatString(0, 20, GetColor(255, 255, 255), "弾数=%d", Bl.num);
}

(WinMain内)
if(DxLib_Init()==-1 || SetDrawScreen(DX_SCREEN_BACK)!=0){//初期化と裏画面化
return -1;
}
operate.len=5;//弾の間隔を5にセット
img_back=LoadGraph("../dat2/img/bullet/shot_9.png");
LoadDivGraph("../dat2/img/bullet/shot_9.png", 8, 8, 1, 18, 26, img_bullet[9]);

下線部のように表示させる所、画像なら読み込むファイル名の所に赤線が引かれて
「"const char *" の引数は型 "const TCHAR *" のパラメーターと互換性がありません」
「"int" の引数は型 "int *" のパラメーターと互換性がありません」
といったエラーが出てくる
といった内容です
今までは普通に使えたのですが…

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月11日(月) 10:53
by ookami
こんにちは。ookamiです。
charとTCHARがアレということはアレかなぁと思うのが、
「プロジェクト」→「プロパティ」で、「構成プロパティ」→「全般」→「文字セット」で「Unicode文字セットを使用する」に変更するとどうでしょうか?
http://oookami.sakura.ne.jp/tmp/ScreenShot1370.png

intとint*の方は分かりませんが...

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月11日(月) 11:25
by naohiro19

コード:

DrawFormatString(0, 0, GetColor(255,255,255), L"間隔=%.1f", operate.len);
もしくは

コード:

DrawFormatString(0, 0, GetColor(255,255,255), TEXT("間隔=%.1f"), operate.len);
とする必要があります。

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月12日(火) 10:41
by ほしくず
>> ookamiさん

返信ありがとうございます。そして丸一日返信遅れて申し訳ありません。
画像に表示までしていただきありがとうございます。
しかしただ今確認しましたところ

「構成(C):Release」の
「構成プロパティ」の
「全般」の
文字セットは「Unicode 文字セットを使用する」になっていました・・・

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月12日(火) 10:55
by ほしくず
>> naohiro19さん

返信して頂きありがとうございます。
こちらからの返信が遅くなっていまい申し訳ありません。

以下のようにしました(下線部は未解決のエラーです)
--------------------------------------------------------
printfDx(L"%sが見つかりません\n", name);

DrawFormatString(0, 0, GetColor(255, 255, 255), L"間隔=%.1f", operate.len);
DrawFormatString(0, 20, GetColor(255, 255, 255), L"弾数=%d", Bl.num);

img_back=LoadGraph(L"../dat2/img/bullet/shot_9.png");
LoadDivGraph(L"../dat2/img/bullet/shot_9.png", 8, 8, 1, 18, 26, img_bullet[9]);
--------------------------------------------------------

「"const char *" の引数は型 "const TCHAR *" のパラメーターと互換性がありません」
というエラーは消えましたが

ReadBmp()関数内の
fp=fopen(name, "rb");

Output()関数内の
fp=fopen("OutPut.dat", "wb");

warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
という「警告」が出てきました
警告も消せたり出来ないでしょうか?
TEXT()の形でも同じでした

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月12日(火) 12:21
by ookami
> 「構成(C):Release」の
> 「構成プロパティ」の
> 「全般」の
> 文字セットは「Unicode 文字セットを使用する」になっていました・・・

そうでしたか...^^;
「構成(C):Debug」ではどうでしたか?
まぁ、naohiro19さんの案でもいいと思いますが、charとTCHARは統一しておいた方がよいので、
TCHARで行くなら、fopenではなく_wfopenを使った方がいいですね。


fopenの件は以下のいずれかで警告は出なくなります。

fopen_sに変える。(推奨)
fopen_s(&fp,name,"wb");

pragmaで警告を出ないようにする。
#pragma warning(disable:4996)

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月12日(火) 16:22
by ほしくず
>>ookamiさん

「構成(C):Debug」の
文字セットも「Unicode 文字セットを使用する」
になっていました(--;
念のため「構成(C)」のすべてを確認しましたが文字セットはすべて
「Unicode 文字セットを使用する」になっていました
----------------------------
fp=fopen_s(&fp, name, "rb");
----------------------------
とやってみた結果
fp=fopen_s(&fp, name, "rb");
の「=」の下に赤い波線が出てきて

"errno_t" の値を型 "FILE *" のエンティティに割り当てることはできません
error C2440: '=' : 'errno_t' から 'FILE *' に変換できません。

というエラーが出てきました・・・
FILEは
FILE *fp;
と宣言で使っています

#pragma warning(disable:4996)
で警告は消えましたがやはり推奨して頂いた方を使う方がいいかなと思います

あとこちらの不注意で
丁寧に教えて頂いた
ookamiさん
naohiro19さん
二方に失礼ですが
龍神録の最初の設定を見直して
プロパティで
「構成(C):すべての構成」の
「全般」の文字セットを
「マルチ バイト文字セット」
としたら一応「L」又は「TEXT()」を抜かして出来るようになりました(fopen変えなければ警告は相変わらず出てきますが・・・)

-------------------------------------
LoadDivGraph("../dat2/img/bullet/shot_9.png", 8, 8, 1, 18, 26, img_bullet[9]);
-------------------------------------
↑関係ないせいかこれはエラーが消えませんでしたが^^;
こちらの不注意で折角の御厚意に水をさして申し訳ありません・・・

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月12日(火) 17:33
by ookami
あぁ、申し訳ありません、勘違いで、そういうことでしたら「マルチバイト文字セット」で正しいです。
私の最初の回答の時点で私が勘違いしていました。ごめんなさい。

fp=fopen_s(&fp, name, "rb");

fopen_s(&fp, name, "rb");
こうですね。エラートラップしたい場合は戻り値を拾ってください。
http://d.hatena.ne.jp/pknight/20090712/1247375848

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月12日(火) 18:12
by ISLe
ほしくず さんが書きました:warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
という「警告」が出てきました
警告に書いてあるとおり、_CRT_SECURE_NO_WARNINGSを定義すれば警告の出力を止めることができます。
プロジェクトのプロパティのプリプロセッサ定義に追加するか、ソースファイル毎の先頭に
#define _CRT_SECURE_NO_WARNINGS
と記述してください。
fopen_sはVC++でしか使えないのでよく考えて使ってください。

img_bulletは、二次元配列か、ポインタの配列なのでしょう。
宣言を確認してください。
グラフィックハンドルをどのように代入しているのか気になります。

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月13日(水) 00:41
by ほしくず
>>ookamiさん
>>naohiro19さん
今後似たようなことが起こったら文字セットの確認や
TEXT()やLを使ってみます。
ありがとうございます!

>>ookamiさん
「fp=」は要らなかったんですね^^;
警告なしでコンパイルできました!
ページを見たところfopenを使うと警告が出てくるのはむしろ普通のことのようですね・・・^^;
リンクまで貼っていただいて・・・
ご丁寧に教えて頂きありがとうございます!

>>ISLe さん
お久しぶりです。
一年ほど前ですが最初の段階のフォルダーの構成の件でお世話になりました。
あれが理解できなければここまで来られませんでした・・・
----------------------------------------------
行数|
1  |#include"DxLib.h"
2  |#include"key_mouse.h"
3  |#define _CRT_SECURE_NO_WARNINGS
    /*途中略*/
56 |fp=fopen(name, "rb");
----------------------------------------------
としましたが警告が出てきました・・・
一応インクルードしているkey_mouse.hにも書きましたが変わらなくて・・・
なにが原因なのでしょうか?

ISLe さんに指摘されて気付きましたが、
グローバル変数として
int img_bullet[21];
と宣言したのに
LoadDivGraph("../dat2/img/bullet/shot_9.png", 8, 8, 1, 18, 26, img_bullet[9]);
と書くのはおかしかったです。
LoadDivGraph("../dat2/img/bullet/shot_9.png", 8, 8, 1, 18, 26, img_bullet);
と書いたらエラーが消えました!ご指摘ありがとうございます!

グラフィックハンドルはLoadDivGraph関数を使ってshot_9.pngを
(上記の場合18×26ピクセルで横8つ縦1つに)分割した画像をimg_bulletに格納しています。
この答え方でよろしかったでしょうか・・・?

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月13日(水) 03:03
by ISLe
ほしくず さんが書きました:としましたが警告が出てきました・・・
一応インクルードしているkey_mouse.hにも書きましたが変わらなくて・・・
なにが原因なのでしょうか?
#define _CRT_SECURE_NO_WARNINGS
は標準ライブラリのヘッダのインクルード文よりも前に書く必要があります。
極端に言えば他のインクルード文よりも前に書くということです。
なので「ソースファイル毎の先頭に記述してください」と書きました。
ほしくず さんが書きました:グラフィックハンドルはLoadDivGraph関数を使ってshot_9.pngを
(上記の場合18×26ピクセルで横8つ縦1つに)分割した画像をimg_bulletに格納しています。
この答え方でよろしかったでしょうか・・・?
shot_9.pngを分割した8つのグラフィックハンドルを何番目の要素に入れたいのですか?

LoadDivGraph("../dat2/img/bullet/shot_9.png", 8, 8, 1, 18, 26, img_bullet);
だとimg_bullet[0]~img_bullet[7]に格納されます。

img_bullet[9]と書いたのがimg_bullet[9]~img_bullet[16]に格納するつもりだったのであれば
LoadDivGraph("../dat2/img/bullet/shot_9.png", 8, 8, 1, 18, 26, img_bullet + 9);
あるいは
LoadDivGraph("../dat2/img/bullet/shot_9.png", 8, 8, 1, 18, 26, &img_bullet[9]);
と書きます。

#先の回答は勘違いしてエラーメッセージの型を逆に捉えてました。

Re: ファイル読み込みや文字表示ができません

Posted: 2012年6月13日(水) 16:33
by ほしくず
>>ISLeさん

勘違いしてて申し訳ありません。
警告消えました!
ありがとうございます。

特に他に格納するものがないので今回は
img_bullet[0]からimg_bullet[7]に入れようと思っています。
この場合はimg_bulletですね?

img_bullet[9]から入れた例だと確かにポインタが絡んでますね・・・
関数の引数などよく見てなかったので全然気付かなかったです・・・
教えて頂きありがとうございます。