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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#31

投稿記事 by softya(ソフト屋) » 8年前

最澄 さんが書きました:Error: 外部シンボル 'byouga()' が未解決(D:\TEST3\DEBUG\MAIN.OBJ が参照)
リンクエラーだそうですが今いじったところと関係ありますか?
main.cppかにあるbyouga()関数の呼び出しが解決できませんと言うエラーです。
次の2点を確認してください。
・定義されている関数と呼び元でbyouga()の名前はちゃんと同じですか?
・byouga()の関数があるソースファイルは、ちゃんとコンパイルリンクされていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

最澄

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

#32

投稿記事 by 最澄 » 8年前

思い当りません
bccを使っていて設定を変えたことはないのでコンパイルリンクはミスしていない気がしますが
原因があるとすればmainファイルですが

コード:

#include "DxLib.h"

void byouga(); 
void syujinkou();
void yomikomi();



// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow )
{
    
   ChangeWindowMode( TRUE ) ;
 
 
   DxLib_Init();   
   
   yomikomi();
 
while(!ProcessMessage() && !ClearDrawScreen()){

    byouga();   
    
    WaitTimer( 20 ) ;
 
 }     
 
    // DXライブラリ使用の終了処理
    DxLib_End() ;
 
    // ソフトの終了
    return 0 ;
}


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#33

投稿記事 by softya(ソフト屋) » 8年前

前の書き込みだと引数が有ることになってますね。
void byouga(kyara1[]);
main側だとありません。
void byouga();
2種類あるんですか?
C++的には可能ですが別関数として扱われます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

最澄

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

#34

投稿記事 by 最澄 » 8年前

いえ、byouga(kyara1[]);とプロトタイプ宣言すると
引数宣言は 'kyara1' で始められない  呼び出し時のパラメータが足りない
と言われます

box
記事: 1739
登録日時: 9年前

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

#35

投稿記事 by box » 8年前

ちょっと交通整理しましょうか。

byouga
という関数の、
 ・プロトタイプ宣言
 ・ソースコード全体
 ・呼び出している部分のソース
を開示してください。もし複数あるのならば、全部を。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#36

投稿記事 by softya(ソフト屋) » 8年前

情報が断片的すぎて、推測でしか話ができませんね。
そして、いつも推測外の話が出てきます。
ちゃんと問題の出るソースコードを提示してもらえば、こんな何度もやり取りしなくても解決しますのでソースコードを提示してもらえませんか?
最澄 さんが書きました:いえ、byouga(kyara1[]);とプロトタイプ宣言すると
引数宣言は 'kyara1' で始められない  呼び出し時のパラメータが足りない
と言われます
それは引数のある関数に引数を与えずに呼びだそうとするから出るエラーです。
byouga()関数に引数が欲しいんでしょうか?欲しくないんでしょうか?
最澄さんが決めるべきことなんですが・・・。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

最澄

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

#37

投稿記事 by 最澄 » 8年前

コード:

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

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


// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow )
{
    
   ChangeWindowMode( TRUE ) ;
 
 
   DxLib_Init();   
   
   yomikomi();
 
while(!ProcessMessage() && !ClearDrawScreen()){

    byouga();   
    
    WaitTimer( 20 ) ;
 
 }     
 
    // DXライブラリ使用の終了処理
    DxLib_End() ;
 
    // ソフトの終了
    return 0 ;
}

コード:

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

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

int 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);
   };
 
   

}

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]);
 
}  
今まではったものをまとめただけですがこんな感じです

byouga関数に引数はほしくありません 
yomikomi関数から値を渡すときに必要なだけでmain関数で呼び出すときに引数は要りません

box
記事: 1739
登録日時: 9年前

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

#38

投稿記事 by box » 8年前

最澄 さんが書きました: byouga関数に引数はほしくありません 
yomikomi関数から値を渡すときに必要なだけでmain関数で呼び出すときに引数は要りません
そういうことであれば、どの関数からでもいつでもアクセスできるよう、
外部変数にするとよいのではないかと思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#39

投稿記事 by softya(ソフト屋) » 8年前

問題点と注意点があります。

(1)情報の寿命の理解が不十分です。
ローカル変数を別関数に渡すのは一時的なものに過ぎませんので、渡した瞬間のみしか意味がありません。
なので、yomikomi()からbyouga()へkyara引数の呼び出しの瞬間しか意味を持ちません。
mainからbyouga()を呼び出すためには、この情報(kyara)はyomikomi()からもbyouga()からもタイミング関係なしに参照可能である必要があります。

(2)変数のスコープに関しての理解が不十分です。

コード:

    static kyara1 kyara[2]={
              {0,0,"sibahu.png"}, 
              {0,0,"syujinkou.png"}
        };
これはローカル変数ではなく、関数外に出すことでファイルスコープ(ファイル内参照可能な変数)となります。
これでyomikomi()とbyouga()の両方から参照可能になります。

(3)関数は機能以外の事をしてはならない。
byouga()内からsyujinkou(&kyara[1]);を呼びだしていますが、描画関数と定めた以上は移動処理など他のことしてはいけません。
これは、はかの人には動作の誤解と自分自身の齟齬を生む原因となります。
移動処理の関数を追加してください。

(4)描画処理は最後でなくてはならない。
syujinkou(&kyara[1]);
を最後に呼びだしていますが描画は最後に行ってください。
描画後に移動するとか、移動と描画が交互に来るとかすると画面上の表示と実際の内部の状態が食い違ってややこしいことになります。

(5)外部関数のプロトタイプ宣言はヘッダに書きましょう。
void byouga(kyara1[]);
void syujinkou(kyara1*);
void yomikomi();
この場合は、kyara.hですね。
何処のソースファイルに属するか明確になるので一般的な方法です。

ここらへんのヒントになる情報は、Dixq(管理人)さんの
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/
に詳しく書かれています。
d.1 メイン関数の作り方
d.2 複数のファイルにわけてコンパイルする
d.3 ゲームの設計と分割コンパイル(1)
d.4 ゲームの設計と分割コンパイル(2)
d.5 ゲームの設計と分割コンパイル(3)
はじっくりと読んでくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

最澄

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

#40

投稿記事 by 最澄 » 8年前

ありがとうございます
最後にしますので聞いてください
私は構造体を次々と作っていったらメモリ食うのかな~と勝手に決めつけて
一々、構造体を書き換えて使おうとしているので関数内に書いてみたのですが

構造体は次から次へと作ってもいいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#41

投稿記事 by softya(ソフト屋) » 8年前

最澄 さんが書きました:ありがとうございます
最後にしますので聞いてください
私は構造体を次々と作っていったらメモリ食うのかな~と勝手に決めつけて
一々、構造体を書き換えて使おうとしているので関数内に書いてみたのですが

構造体は次から次へと作ってもいいのでしょうか?
そのメモリ節約は8bit時代の発想です。
1つの構造体配列が1KBを食うこともまず無いはずですの100個有ろうと微々たるものです。sizeof()関数で実際に消費しているサイズを確認してみてください。
無駄な手間と言うより、無駄なバグ源を内包するだけです。
バグを出さないプログラム基本技法は、関数や変数に複数の意味・機能を持たせないことですので。

動的に画像イメージを管理することは画像だけで500MBとか消費するなら考えなくては行けないことですが、構造体配列の管理と同等に語るべきではありません。

あと最後にしないほうが良いと思いますよ。
今の段階で、理解できていると思えないので理解できるまで徹底的にやるべきだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初級者
記事: 200
登録日時: 8年前

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

#42

投稿記事 by 初級者 » 8年前

softyaさんが仰っているとおり、最後にするという縛りを設けなくてよいと思います。
疑問が解決するまで、こういう場を目一杯使いましょう。
私がどれだけお役に立つことができるかはわかりませんけれど。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

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

#43

投稿記事 by ISLe » 8年前

関数の外で宣言した構造体変数でも書き換えて使うことはできるわけですが。

問題なのは「メモリを食わないように」って発想じゃなくて「関数内で宣言するとメモリを食わない」って発想じゃないですかね。

何が次から次へ作られるのか意味不明ですし。

最澄

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

#44

投稿記事 by 最澄 » 8年前

プログラミングの館のゲームの設計の項目では
main関数のソースファイルで構造体(キャラの座標と画像名)を
定義しているので真似したほうがいいでしょうか? 
そうすればbyouga関数からsyujinkouを呼び出す必要もありませんし

そして、画像読込をした後に引数で描画関数に渡していたことについてなのですが
handoru=yomikomi()という書き方をしてreturnで読み込ませるというやり方でいいでしょうか?

これしか、ちょっと思いつかないです

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#45

投稿記事 by softya(ソフト屋) » 8年前

最澄 さんが書きました:プログラミングの館のゲームの設計の項目では
main関数のソースファイルで構造体(キャラの座標と画像名)を
定義しているので真似したほうがいいでしょうか? 
そうすればbyouga関数からsyujinkouを呼び出す必要もありませんし
「新ゲームプログラミングの館」では、そんな風には書かれていないはずですが?
d.1 メイン関数の作り方 http://dixq.net/g/d_01.html
d.2 複数のファイルにわけてコンパイルする http://dixq.net/g/d_02.html
d.3 ゲームの設計と分割コンパイル(1) http://dixq.net/g/d_03.html
d.4 ゲームの設計と分割コンパイル(2) http://dixq.net/g/d_04.html
d.5 ゲームの設計と分割コンパイル(3)  http://dixq.net/g/d_05.html

確かに構造体はWinMainにありますが、キャラの座標と画像名はplayer.cpp側で設定しています。

>そうすればbyouga関数からsyujinkouを呼び出す必要もありませんし
その考え方は時系列的に無理なので諦めてください。
最澄 さんが書きました: そして、画像読込をした後に引数で描画関数に渡していたことについてなのですが
handoru=yomikomi()という書き方をしてreturnで読み込ませるというやり方でいいでしょうか?
これしか、ちょっと思いつかないです
構造体をポインタで渡せば、構造体に値を入れて戻すことが出来ますのでそれを使います。
d.5 ゲームの設計と分割コンパイル(3)  http://dixq.net/g/d_05.html
で解説されている内容ですね。

【追記】
どういうC言語の入門書を読まれたのか分かりませんが、構造体とポインタをちゃんと勉強されたほうが良いと思います。
「C言語入門 11.構造体」
http://c-production.com/contents/c/sec11.html
「C言語編 第33章 構造体」
http://www.geocities.jp/ky_webid/c/033.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

最澄

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

#46

投稿記事 by 最澄 » 8年前

身内の使っていたC言語で遊んでいるうちに覚えてきたガキですが
やっぱり入門書を買ったほうが良いですよね そうします
softya(ソフト屋) さんが書きました:確かに構造体はWinMainにありますが、キャラの座標と画像名はplayer.cpp側で設定しています。
構造体の定義という言い方は正確ではなかったですね 
構造体の実体を宣言(?)といいますか・・・「Player_t Player1, Player2;」と書かれている部分は
winmainの場所ですよね


ですからmain関数の中に構造体の実体を宣言するということでいいんでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#47

投稿記事 by softya(ソフト屋) » 8年前

最澄 さんが書きました:身内の使っていたC言語で遊んでいるうちに覚えてきたガキですが
やっぱり入門書を買ったほうが良いですよね そうします
知識がしっかりしているなら良いのですが、怪しい所が沢山ありますので入門書は買われたほうが良いと思いますが、復習と知識不足の部分を補うのに、苦Cなどのサイトを使う手もあります。
「苦しんで覚えるC言語」
http://9cguide.appspot.com/
初歩の部分はここで済まして、実践的な書籍を買うって手段ですね。

このあたりは今の状況を見るとチェックしておいた方が良いでしょう。
「Amazon.co.jp: 明解C言語によるアルゴリズムとデータ構造: 柴田 望洋, 辻 亮介: 本」

「Amazon.co.jp: 詳解C言語 ポインタ完全攻略: 柴田 望洋: 本」

最澄 さんが書きました:
softya(ソフト屋) さんが書きました:確かに構造体はWinMainにありますが、キャラの座標と画像名はplayer.cpp側で設定しています。
構造体の定義という言い方は正確ではなかったですね 
構造体の実体を宣言(?)といいますか・・・「Player_t Player1, Player2;」と書かれている部分は
winmainの場所ですよね

ですからmain関数の中に構造体の実体を宣言するということでいいんでしょうか?
ケースバイケースですので、それもひとつの方法ですねとしか言えません。
Playerなど固定数で引数での受け渡し要素が少ない構造体なら悪い方法ではないですが、引数がやたら増えてくるのなら避けたほうが良い選択肢です。
それにすべての構造体をWinMainで定義できるかというと疑問です。
例えば、ファイルから読み込むような可変個数の敵の発生情報の構造体をWinMainで持つのが良いかと聞かれたら避けるべきと答えますね。WinMainにある意味が無いし、個数が可変するので受け渡す情報が増えて逆に不便になります。必要なものを必要な所に最小限が関数分けのポイントです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る