ページ 12

エラーの意味が分からない

Posted: 2011年9月01日(木) 22:53
by 最澄
早速、本題で悪いですがエラーの意味が分かりません
前にもここを使わせてもらったのですがもう一度使わせてください

コード:

    typedef struct{
        int x1;
        int y1;
        char *namae;
        int handoru;
    }kyara1;

kyara1 kyara

このような構造体があって

コード:

syujinkou(&kyara);
このように関数を呼び出しました

コード:

void syujinkou(kyara1 *kyara){

    int flag=1;
    
    if( flag == 1 ){
   	if( CheckHitKey( KEY_INPUT_UP) == 1 ) kyara->y1--; 
   	if( CheckHitKey( KEY_INPUT_DOWN) == 1 ) kyara->y1++;
   	if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) kyara->x1++;
   	if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) kyara->x1--;
    };  

}
それがこの関数なのですが
syujinkou()呼び出しに余分なパラメータがあると言われるのです

さっぱり意味が分かりませんので どなたか教えていただけませんか?

Re: エラーの意味が分からない

Posted: 2011年9月01日(木) 23:26
by Ciel
エラーメッセージをそのまま貼ってくれたらわかるかもしれません。

Re: エラーの意味が分からない

Posted: 2011年9月01日(木) 23:32
by 最澄
え?エラーメッセージなら先ほど記述したものですが

エラー E2227 D:\TEST3\gazou.cpp 19: syujinkou() の呼び出しに余分なパラメータがある(関数 byouga() )

↑このような感じです 分かりますでしょうか?

Re: エラーの意味が分からない

Posted: 2011年9月01日(木) 23:47
by softya(ソフト屋)
gazou.cpp 19
と言うのがsyujinkou(&kyara);
の事でしょうか?
ここに書かれていないsyujinkou()関数のプロトタイプ宣言はどうなっていますか?

あと開発環境も書いてもらえると助かります。たぶん、bcc?

Re: エラーの意味が分からない

Posted: 2011年9月02日(金) 00:06
by 最澄
プロトタイプ宣言はvoid syujinkou();となっています
もしかしてvoid syujinkou(&kyara);と書くのが正解なのでしょうか?
でも、これだと
   'syujinkou' のサイズが不明、あるいはゼロ
   未定義のシンボル kyara
   関数でないものを呼び出している(関数 byouga() )
と言われてしまいますし…

環境はbccで間違いないです

Re: エラーの意味が分からない

Posted: 2011年9月02日(金) 00:07
by Ciel
softyaさんのおっしゃるとおり、
プロトタイプ宣言が怪しいです。
それを貼ってくれたらたぶん分かります。

Re: エラーの意味が分からない

Posted: 2011年9月02日(金) 00:08
by Ciel
プロトタイプ宣言を
void syujinkou(kyara1*);

にして下さい。

kyara1型のポインタを渡すのでこうなります。

Re: エラーの意味が分からない

Posted: 2011年9月02日(金) 00:09
by softya(ソフト屋)
大事なのは型なので
void syujinkou(kyara1*);
が正解です。

Re: エラーの意味が分からない

Posted: 2011年9月02日(金) 00:12
by box
プロトタイプ宣言を書くときは、
最澄 さんが書きました:

コード:

void syujinkou(kyara1 *kyara){
上記の関数定義先頭部分の { を ; に置き換えればすみます。

コード:

void syujinkou(kyara1 *kyara);
てな具合に。
ほとんど機械的な操作でできて、簡単ですよね?

Re: エラーの意味が分からない

Posted: 2011年9月02日(金) 22:31
by 最澄
本当に何度もすいません
void syujinkou(kyara1*);
このように書くと

コード:

エラー E2034 D:\TEST3\gazou.cpp 18: 'kyara1 ( *)[2]' 型は 'kyara1 *' 型に変換できない(関数 byouga() )
エラー E2340 D:\TEST3\gazou.cpp 18: 1 番目のパラメータは kyara1 * 型として定義されているので kyara1 ( *)[2] 型は渡せない(関数 byouga() )
 
 
このように言われてしまいます

Re: エラーの意味が分からない

Posted: 2011年9月02日(金) 22:37
by softya(ソフト屋)
今まで書いてあることと実際のプログラムが違っていませんか?
どうみてもkyara1型の配列を使ってますよね?

Re: エラーの意味が分からない

Posted: 2011年9月02日(金) 23:17
by box
最澄 さんが書きました:

コード:

エラー E2034 D:\TEST3\gazou.cpp 18: 'kyara1 ( *)[2]' 型は 'kyara1 *' 型に変換できない(関数 byouga() )
エラー E2340 D:\TEST3\gazou.cpp 18: 1 番目のパラメータは kyara1 * 型として定義されているので kyara1 ( *)[2] 型は渡せない(関数 byouga() )
このように言われてしまいます
そのエラーメッセージが出てしまうソースコード全体を見せてください。
そうすれば、
「どんなソースコードでどんなエラーメッセージが出ているか」が一発でわかるんですけどね。
エラーメッセージという「結果だけを」見せられても、正確なことは何一つわかりません。

Re: エラーの意味が分からない

Posted: 2011年9月03日(土) 08:30
by Ciel
構造体の定義が間違っているか、byouga関数に渡す時の渡し方がおかしいんでしょうね。
とりあえずソース貼って下さい。

Re: エラーの意味が分からない

Posted: 2011年9月03日(土) 09:14
by wing
kyara1 kyara

kyara1 kyara ;
ではないでしょうか。

Re: エラーの意味が分からない

Posted: 2011年9月04日(日) 03:31
by 最澄
申し訳ないです
途中で主人公の画像だけを渡せればいいんだと気づき、
配列だったのを忘れていました・・・ 画像のソートを簡単にするためにそうしています

この場合は呼び出し部分を(&kyara[1])と記入すればいいのでしょうか?
少し質問が変わってしまったうえ、度重なる質問はんせいしています

Re: エラーの意味が分からない

Posted: 2011年9月04日(日) 05:31
by box
たびかさなるお願いで申し訳ありませんが、当該のソースコード全体を
見せていただくことはできないでしょうか。

情報を小出しにされますと、正確なことがひじょうにわかりづらいのです。

Re: エラーの意味が分からない

Posted: 2011年9月04日(日) 22:27
by 最澄
謝らせてしまって申し訳ないです
ソースコードを提示してくださいという返信に気づきもしないで・・・

コード:

//kyara.hです
    typedef struct{
        int x1;
        int y1;
        char *namae;
        int handoru;
    }kyara1;

コード:

#include "Dxlib.h"
#include "kyara.h" 

void syujinkou(kyara1*);

void byouga(){
    

        kyara1 kyara[2]={
        {0,0,"jimen.png"}, 
        {0,0,"kyara.png"}
        };
    
    for(int i=0; i<2 ; i++){
        kyara[i].handoru=LoadGraph(kyara[i].namae);
        DrawGraph(kyara[i].x1,kyara[i].y1,kyara[i].handoru,TRUE);

    syujinkou(&kyara[1]);

    };	
}

コード:

#include "DxLib.h"
#include "kyara.h"

void syujinkou(kyara1 *kyara){

    int flag=1;
    
    if( flag == 1 ){
   	if( CheckHitKey( KEY_INPUT_UP) == 1 ) kyara->y1--; 
   	if( CheckHitKey( KEY_INPUT_DOWN) == 1 ) kyara->y1++;
   	if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) kyara->x1++;
   	if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) kyara->x1--;
    };  

}
こんな感じです

Re: エラーの意味が分からない

Posted: 2011年9月04日(日) 22:36
by softya(ソフト屋)

コード:

	for(int i=0; i<2 ; i++){
		kyara[i].handoru=LoadGraph(kyara[i].namae);
		DrawGraph(kyara[i].x1,kyara[i].y1,kyara[i].handoru,TRUE);
 		
 		syujinkou(&kyara[1]);
	}
インデント(字下げ)は正確にしてくださいね。バグの原因ですし、解析を難しくします。
このコードだと、forループ中にsyujinkou(&kyara[1]);が2回呼び出されますので倍動くことになりますよ。

あと相変わらずロードと表示がセットなんですね。メモリがリークしているので長時間動かすとハングしますよ。

それと
DrawGraph(kyara.x1,kyara.y1,kyara.handoru,TRUE);

syujinkou(&kyara[1]);
は順番が逆にしたほうが良いでしょう。

Re: エラーの意味が分からない

Posted: 2011年9月04日(日) 22:49
by box
9月4日22:27に投稿されたソースコードをコンパイルすると、
9月2日22:31に投稿されたエラーメッセージが出る、ということでしょうか?

Re: エラーの意味が分からない

Posted: 2011年9月04日(日) 22:59
by 最澄
ソフト屋さん
助言ありがとうございます 
リークでハングとはどういう意味なのでしょう
for文のことなども見落としていました

boxさん
いえ、このコードだとコンパイルが通りました
値の渡し方はこれで良いのか伺いたいのです

Re: エラーの意味が分からない

Posted: 2011年9月04日(日) 23:04
by box
最澄 さんが書きました: いえ、このコードだとコンパイルが通りました
ですよね。ぱっと見、コンパイルエラーが出そうには思えなかったので、ああいう風にお聞きしました。
最澄 さんが書きました: 値の渡し方はこれで良いのか伺いたいのです
コンパイルが通ったということは、少なくとも文法上の間違いはない、ということです。
仕様どおりに実行するかどうかは、別の話ですけれど。

Re: エラーの意味が分からない

Posted: 2011年9月04日(日) 23:17
by 最澄
〉〉boxさん
もしかして仕様通りに実行されるかというのは、このことですよね↓

初期位置から画像が動かないのですが
構造体のxとyをstaticにすればいいのでしょうか?
それだと初期化子が多すぎると言われるので違う気がするのですが

最後にしますのでお教えください

Re: エラーの意味が分からない

Posted: 2011年9月04日(日) 23:44
by softya(ソフト屋)
最澄 さんが書きました:リークでハングとはどういう意味なのでしょう
LoadGraphで画像を読み込んで破棄していませんので、同じ所を通る度に前の画像をメモリに残したまま新しい画像をロードしています。
つまりメモリにどんどん残っていきます。こういう管理されずに残っていくメモリの状態ことをリークするといいます。
最澄 さんが書きました:初期位置から画像が動かないのですが
構造体のxとyをstaticにすればいいのでしょうか?
それだと初期化子が多すぎると言われるので違う気がするのですが
この構造体定義は、

コード:

kyara1 kyara[2]={
        {0,0,"jimen.png"}, 
        {0,0,"kyara.png"}
        };
実体の動的初期化なので、毎回同じ座標に初期化されます。

コード:

static kyara1 kyara[2]={
        {0,0,"jimen.png"}, 
        {0,0,"kyara.png"}
        };
とすれば大丈夫ですが、こういうのを関数内に書くこと自体珍しいでしょうね。普通は関数外に定義します。
ちなみに構造体のメンバにstaticは出来ませんよ。

Re: エラーの意味が分からない

Posted: 2011年9月07日(水) 21:32
by 最澄
ありがとうございました 解決できました

この先、役に立つかもしれないので知っておきたいのですが
構造体配列を全てポインタで渡すにはどのような書き方をすればいいのでしょうか?
for文を使って(&kyara)で数値を増やしていけばいいのかと思いましたがなんか違いますよね

Re: エラーの意味が分からない

Posted: 2011年9月07日(水) 21:37
by softya(ソフト屋)
最澄 さんが書きました:この先、役に立つかもしれないので知っておきたいのですが
構造体配列を全てポインタで渡すにはどのような書き方をすればいいのでしょうか?
for文を使って(&kyara)で数値を増やしていけばいいのかと思いましたがなんか違いますよね


関数はこう宣言して
void syujinkou(kyara1 kyara[])
呼び出す時は、
syujinkou(kyara);
こう書くのが一番わかり易いです。

【追記】
実は、
void syujinkou(kyara1 *kyara)
このままでもsyujinkou(kyara);で呼び出せば配列として扱うことは出来るんですけどね。

Re: エラーの意味が分からない

Posted: 2011年9月07日(水) 21:38
by box
最澄 さんが書きました: 構造体配列を全てポインタで渡すにはどのような書き方をすればいいのでしょうか?
構造体ではない配列の場合と全く同じです。

Re: エラーの意味が分からない

Posted: 2011年9月07日(水) 22:35
by 最澄
〉〉boxさん
配列でのやり方が分からなかったのでお聞きしました 分かりにくかったですよね

〉〉ソフト屋さん
実は追記に書かれているやり方を試した時に
kyara1 ( *)[2]' 型は 'kyara1 *' 型に変換できない
と言われたのでこのような質問をさせていただきました これは一体?

Re: エラーの意味が分からない

Posted: 2011年9月07日(水) 22:49
by softya(ソフト屋)
syujinkou(&kyara);
って書きませんでしたか?
こう書いたらエラーです。

[追記]
最初に提示されたのはkyaraが配列ではない方法でしたよね?
その場合は
syujinkou(&kyara);
と渡す必要がありますが、kyaraが配列の場合は
syujinkou(&kyara);
と書くと間違いです。

Re: エラーの意味が分からない

Posted: 2011年9月07日(水) 23:14
by 最澄

コード:


#include "Dxlib.h"
#include "kyara.h" 

void syujinkou(kyara1*);
void byouga(kyara1[]);

void yomikomi(){

 	static kyara1 kyara[2]={
              {0,0,"sibahu.png"}, 
              {0,0,"syujinkou.png"}
        };
 
   for(int i=0; i<2 ; i++){
      kyara[i].handoru=LoadGraph(kyara[i].namae);
   };
 
   byouga(kyara);

}

void byouga(kyara1 kyara[]){
    

    for(int i=0; i<2 ; i++){
       
        DrawGraph(kyara[i].x1,kyara[i].y1,kyara[i].handoru,TRUE);

    };	
 
 syujinkou(&kyara[1]);
 
}  
Error: 外部シンボル 'byouga()' が未解決(D:\TEST3\DEBUG\MAIN.OBJ が参照)
リンクエラーだそうですが今いじったところと関係ありますか?

Re: エラーの意味が分からない

Posted: 2011年9月07日(水) 23:22
by box
最澄 さんが書きました:

コード:

void byouga(kyara1[]);
このプロトタイプ宣言だとコンパイルが通らないような気がするのですが…。
私が9月2日の00:12に投稿した、プロトタイプ宣言の簡単な書き方が参考になりますでしょうか。

【追記】
失礼しました。コンパイル時には警告が出るだけですね。
リンクエラーは、また別の話ですね。