Re: 応答なしになります ( No.1 ) |
- 名前:管理人 日時:2019/11/23 03:27
抜粋していただいたコードを実行してみましたが、応答なしにはなりませんでした
別の部分に原因があるのではないでしょうか?
|
Re: 応答なしになります ( No.2 ) |
- 名前:そこそこのクズ 日時:2019/11/23 12:59
恐らく私が抜粋しすぎたのだと思います。申し訳ございません。
以下問題のソースコードです。
自分で応答なしになることを確認しました。←最初から確認しろ
#include"DxLib.h"
#define BUFFSIZE_X 512
#define BUFFSIZE_Y 256
void FileStr_Draw(void);
char Code[BUFFSIZE_X][BUFFSIZE_Y]={};
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
short unsigned CountX,CountY;
while(!ScreenFlip() && !ProcessMessage() && ClearDrawScreen()){
FileStr_Draw();
}
DxLib_End();
return 0;
}
void FileStr_Draw(void){
short unsigned CountX, CountY;
for(CountY=0; CountY<BUFFSIZE_Y; CountY++){
for(CountX=0; CountX<BUFFSIZE_X; CountX++){
printfDx("%c",Code[CountX][CountY]);
}
}
}
|
Re: 応答なしになります ( No.3 ) |
- 名前:そこそこのクズ 日時:2019/11/23 13:04
申し訳ございません。
ClearDrawScreen() に ! を付け忘れていました。
! を付けても正常に動作しません。
#include"DxLib.h"
#define BUFFSIZE_X 512
#define BUFFSIZE_Y 256
void FileStr_Draw(void);
char Code[BUFFSIZE_X][BUFFSIZE_Y]={};
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
short unsigned CountX,CountY;
while(!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()){
FileStr_Draw();
}
DxLib_End();
return 0;
}
void FileStr_Draw(void){
short unsigned CountX, CountY;
for(CountY=0; CountY<BUFFSIZE_Y; CountY++){
for(CountX=0; CountX<BUFFSIZE_X; CountX++){
printfDx("%c",Code[CountX][CountY]);
}
}
}
|
Re: 応答なしになります ( No.4 ) |
- 名前:B.E 日時:2019/11/24 09:45
コードはこれで全部でしょうか?
自分の環境では普通に動きますが…。
>> ! を付けても正常に動作しません。
「正常に動作」と書かれても、どう動作させたいか書かないと第三者には判断しかねますよ。
プログラムは書いたとおりに動きますから、コードだけみても書いた本人がどう動作させたいかは分かりません。
正常に動作しないというのは、エラーで落ちるという事でしょうか?
「応答なしになります」という事は画面が黒で何も描画されないという事でしょうか?
それともフリーズする(ウインドウの閉じるボタン等も一切反応しなくなる)という事でしょうか?
画面に何も表示されないという事であれば、Code配列の中身が0なので何も描画されないのは正常な動作だと思いますが…。
上記のコードだと配列が0なので、『printfDx("%c",0);』と何回もやり続けるだけなので、何も表示されないです。
『%c』は文字を一文字表示する書式なので『0』だと何も表示されないのです。(0は文字コードではなくヌル文字なので…)
(もしかして『%c』と『%d』を間違えたりしてます?、『%d』なら配列の数値が『0』なら『0』と表示されます)
とりあえず何か文字を画面に表示させたいのであれば、
SetDrawScreen(DX_SCREEN_BACK);の下の辺りに『memset(Code, 'A', BUFFSIZE_X*BUFFSIZE_Y);』
と書くと配列全部に『A』の文字コードが入るので、画面に大量に「A」って表示されると思いますが、何も出ませんかね?
フリーズするという事であれば、上記のコードにC言語的にフリーズするような所はないと思うので
もし上記以外にコードがあるなら、そこに問題があるのではないでしょうか?
(上記の中に可能性があるとしたらprintfDx()で大量の文字を表示し続けるとフリーズする場合があるとかでしょうけど、
自分の環境では数分動かし続けても普通に動いてます…。)
あと、WinMain()にある「short unsigned CountX, CountY;」は不要だと思いますよ、一回も使ってないので…。
FileStr_Draw()で使ってるのはそこでちゃんと宣言してますし。
(そもそもローカル変数は他の場所で宣言できないので、FileStr_Draw()を関数に独立させる際に消し忘れたんだと思いますが…)
|
Re: 応答なしになります ( No.5 ) |
- 名前:なかなかのクズ 日時:2019/11/24 09:45
私がこのコードを実行すると、
DxLib(応答なし)とタイトルが変わり、
勝手に終了するのですが... orz
|
Re: 応答なしになります ( No.6 ) |
- 名前:B.E 日時:2019/11/24 10:28
うーんそれだと環境に関係している可能性が高いとおもうので、
実行環境を書いた方いいと思いますよ。
ちなみに私の環境はこんな感じです。
OS:windows10 Home 64bit
C++環境:Visual Studio Community 2017
DXライブラリVer:3.21b
上記の環境では問題なく動きます。
あとは何処でエラーになっているか細かく調べる為に、コードの一部をコメントアウトして調べるとかですかね…。
試しにFileStr_Draw();をコメントアウトしたらどうなりますかね?
それで問題なく動くならやはり、FileStr_Draw()関数で問題が起こっているという事になります。
FileStr_Draw()関数も見る限り無限ループになるような処理をしている訳でもないですし、問題ないとは思うのですが…。
あるとしたらprintfDx()関数が一部の環境で不具合が出るとかですかねぇ…。
さらにprintfDx()関数だけコメントアウトして動くようならその可能性が高いと思います。
|
Re: 応答なしになります ( No.7 ) |
- 名前:そこそこのクズ 日時:2019/11/24 16:38
私の環境は、
OS:Windows 10 Home
C++環境:MinGW 8.2.0
DxLib:ver3.21
です。
printfDx()関数をコメントアウトすると、
正常に動作しました。
|
Re: 応答なしになります ( No.8 ) |
- 名前:B.E 日時:2019/11/24 21:10
うーん、どうも環境依存っぽいので、管理人様に対応してもらうしかないですかね…。
自分の手元には「MinGW」の環境が無いので確認できません。
お力になれず、すいません。
とりあえず、その場しのぎの回避方法としては、ほかの描画関数が正常に動作するなら、
DrawFormatString()関数で代用するとかですかね…。
(座標とか色とか指定しないといけないので、その分手間ですが…。)
|
Re: 応答なしになります ( No.9 ) |
- 名前:管理人 日時:2019/11/25 02:03
ご情報ありがとうございます
手元でも MinGW 8.2.0 環境で載せていただいたプログラムが応答なしになる現象を確認できました
原因は printfDx に引数で渡している書式文字列の "%c" で、%c を使用すると
DrawFormatString などの他の書式文字列を引数に取る関数でも応答なしになる状態となっていました
強制終了しないように修正したバージョンをアップしましたので、よろしければお試しください m(_ _;m
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用
> B.Eさん
ご対応ありがとうございます
|
Re: 応答なしになります ( No.10 ) |
- 名前:そこそこのクズ 日時:2019/11/25 22:28
管理人様、B.E様、
誠にありがとうございました。
|