ページ 11

エラー?が出ます

Posted: 2011年7月18日(月) 14:39
by voipjdp@meit
見て通りの初心者です
さきほどコンパイルをしようとしたのですが
なぜかエラーが出ます
(問題が発生したため、○○を終了します。ご不便をおかけして申し訳ありません(←このようなもの))

BCC Dberopperを使っています
DXライブラリ置き場にあるコードは実行できます

これが記述したコードです
何が問題か教えてください

コード:

#include "DxLib.h"
 
void sentouki();

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow )
{
    
   ChangeWindowMode( TRUE ) ;
 
 while(1){
    void sentouki();
       
    
    WaitTimer( 20 ) ;
 
    if( ProcessMessage() == -1 ) break ;
    
    // ESCキーが押されたらループから抜ける
    if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break ;
   
 }     
 
    // DXライブラリ使用の終了処理
    DxLib_End() ;
 
    // ソフトの終了
    return 0 ;
}

コード:

#include "DxLib.h"

void sentouki(){
  
  int x,y,handoru;
  
  handoru = LoadGraph("aka.png");
  DrawGraph(x,x,handoru,TRUE);
}  

Re: エラー?が出ます

Posted: 2011年7月18日(月) 15:02
by non
実行時のエラーなのでしょうか?

DxLib_Init()がありません。
LoadGraphをwhile(1)の中で行うのは不味いです。
DrawGraphの座標が未設定です。

Re: エラー?が出ます

Posted: 2011年7月18日(月) 15:36
by voipjdp@meit
すいません;
その部分も間違っていましたね
具体的に言うとコンパイル自体は通るのですが実行時に起こります はい
分かりますでしょうか?

Re: エラー?が出ます

Posted: 2011年7月18日(月) 18:58
by softya(ソフト屋)
とりあえずnonさんの言われる問題点を直されましたか?

Re: エラー?が出ます

Posted: 2011年7月18日(月) 22:06
by voipjdp@meit
お二人方ありがとうございます
原因は初期化だったと思います

少しタイトルとずれるのですが
別々の関数で描画と読込を行う場合、どうすればいいのでしょう?
変数が定義されないと言われてしまうのですが

Re: エラー?が出ます

Posted: 2011年7月18日(月) 22:33
by non
方法1
グローバル変数にする。

方法2
関数の引数や戻り値で受け渡しする。

Re: エラー?が出ます

Posted: 2011年7月18日(月) 22:41
by softya(ソフト屋)
sentouki()に引数で渡すか、sentouki()関数があるファイルに関数外にstatic int handoru;を宣言するのが良いと思います。
static int handoru;を使う場合はsentouki()関数があるファイルにsentouki_load()関数を追加して、そこでLoadGraph()ください。
完全なグローバル関数はお勧めしません。

Re: エラー?が出ます

Posted: 2011年7月20日(水) 19:03
by voipjdp@meit
こんなくだらない初歩的な質問に回答を下さって本当に感謝しています
アドバイスの通り書いてみたのですが

コード:

#include "DxLib.h"
 
void sentouki();
void yomikomi();
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow )
{
    
   ChangeWindowMode( TRUE ) ;
 
 
   DxLib_Init();   
 
   void yomikomi();
 
 while(1){
    void sentouki();
       
    
    WaitTimer( 20 ) ;
 
    if( ProcessMessage() == -1 ) break ;
    
    // ESCキーが押されたらループから抜ける
    if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break ;
   
 }     
 
    // DXライブラリ使用の終了処理
    DxLib_End() ;
 
    // ソフトの終了
    return 0 ;
}

コード:

#include "DxLib.h"

static int handoru;

void yomikomi(){
   handoru = LoadGraph("aka.png");
}   

void sentouki(){
  
  int x=10;
  int y=10;
  
  DrawGraph(x,y,handoru,TRUE);
}  
うまいこといっていない状況です
どこがおかしいのかわかりません

それと引数というのは数字や文字列を渡すものだと思っているのですが
それでどうやって変数の定義(今回の問題のことです)をするのですか?

すいません 
課題のようなことということと自分で調べても中々、分からないということもあって
解決できていません
質問も最後にしますので教えてください

Re: エラー?が出ます

Posted: 2011年7月20日(水) 19:12
by softya(ソフト屋)
まず動かない原因ですが、WinMainの中にある。

コード:

   void yomikomi();
 
 while(1){
    void sentouki();
は関数呼び出しになっていません。
void yomikomi();では単なる関数のプロトタイプ宣言です。

コード:

   yomikomi();
 
 while(1){
    sentouki();
と書くべきです。
voipjdp@meit さんが書きました:それと引数というのは数字や文字列を渡すものだと思っているのですが
それでどうやって変数の定義(今回の問題のことです)をするのですか?
これを今書くと混乱する気もするので、まず上に書いたことを理解してください。
それが理解できたら説明します。

Re: エラー?が出ます

Posted: 2011年7月20日(水) 23:06
by voipjdp@meit
はい理解できました 実行結果もうまいようにいきました
関数を呼び出すときは戻り値の部分を記述しないということですか

Re: エラー?が出ます

Posted: 2011年7月20日(水) 23:15
by softya(ソフト屋)
あくまでこういう書き方もあるという例です。
イメージのハンドルはWinMainが管理しています。
yomikomiは読み込んだイメージのハンドルを戻り値で返します。
sentouki()は座標とハンドルを引数で受け取って表示します。
これは真似しなくて良いですよ。このままだと汎用性に欠ける方法ですから使い方がかなり限定されます。
構造体やらポインタを理解して使えば応用の幅は広がりますが、今回は書きません。

コード:

#include "DxLib.h"

int yomikomi(){
   return LoadGraph("aka.png");
}   
 
void sentouki(int x,int y,int hand){
  
  DrawGraph(x,y,hand,TRUE);
}

コード:

#include "DxLib.h"

void sentouki(int x,int y,int hand);
int yomikomi();
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow )
{
	int handoru;
    
   ChangeWindowMode( TRUE ) ;
 
 
   DxLib_Init();   
 
   handoru = yomikomi();
 
 while(1){
    sentouki(10,10,handoru);
       
    
    WaitTimer( 20 ) ;
 
    if( ProcessMessage() == -1 ) break ;
    
    // ESCキーが押されたらループから抜ける
    if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break ;
   
 }     
 
    // DXライブラリ使用の終了処理
    DxLib_End() ;
 
    // ソフトの終了
    return 0 ;
}

Re: エラー?が出ます

Posted: 2011年7月20日(水) 23:27
by voipjdp@meit
ありがとうございました
コードをみてなんとなくだけ把握できました
役に立てます