ページ 11

関数呼び出し

Posted: 2014年8月31日(日) 01:39
by sekken
①void の関数の中で、②voidの関数を呼び出すと、②void関数の前後で①voidの関数の内の変数の値が変わっていました。
これはどういうことなのでしょうか?
どう対処すればいいですか?

とりあえず、①voidの関数内で、先頭に②voidの関数を呼び出すことで、治りましたが
何か良い方法が無いでしょうか?

もしかすると、ヘッダファイルで定義した関数を①void関数でも②void関数でも使っているのですが(なので、ヘッダのクラス::①void関数  ヘッダのクラス::②void関数という形です)、それが原因でしょうか?

Re: 関数呼び出し

Posted: 2014年8月31日(日) 05:32
by spaaaark・∀・
ソースコードがないので何とも言えないのですが、ひとまず同じクラス内ならメンバ変数を関数①内で変更している
可能性があります。その場合はその値を別のローカル変数に入れ、処理を行うことで現象が解決するはずです。
クラスの場合メンバ変数の値はクラス内のすべての関数で同じ値が使われます。(クラス内のグローバル変数みたいな感じ)
これを迂闊に変更すると動作のバグを引き起こす原因となりますので、一度確認してみてください。

Re: 関数呼び出し

Posted: 2014年8月31日(日) 09:52
by softya(ソフト屋)
ローカル変数はポインタミスや配列の添字外参照で値が書き変わる場合があります。
そもそも変数を初期化していなかった可能性もあります。
問題を再現できるソースコードを投稿してもらうのが一番ですね。

Re: 関数呼び出し

Posted: 2014年8月31日(日) 17:11
by sekken
class CProconAI{

public:
void d(); //getPlayerPosX()やgetPlayerPosY()が定義されている
void A();
void eaction(int,int,int);
void shokikakousin();

};









#include "ProconAI.h"
#include <math.h>
#include <time.h>

void e(int,int,int);
void kousin();


int i; //for文用

int pn[]={PLAYER1,PLAYER2,PLAYER3,PLAYER4};

int eretu[3];
int egyou[3];

int nnon;
int n; //値が変わる変数



void C::A(){

kousin();
}







void C::kousin(){ //更新を行う関数



int h;

for(i=0,h=0;i<4;i++){ //相手3体の行・列を格納
if(!(getPlayerPosX(pn)==jretu && getPlayerPosY(pn)==jgyou)){
eretu[h]=getPlayerPosX(pn);
egyou[h]=getPlayerPosY(pn);
h++;
}
}

nnon=n=0;              //nnonとnの初期化
for(i=0;i<3;i++) //相手の情報を得る関数
eaction(i,eretu,egyou);
                  //ここに来ると必ずn=1になっている。


}






void C::e(int i,int eretu,int egyou){

//変数nは書かれていない

}


こんな感じです。行数が多いので、関係のなさそうなところは割愛させてもらいました。

Re: 関数呼び出し

Posted: 2014年8月31日(日) 17:15
by sekken
訂正します
CProconAI→C
eaction→e
shokikakousin→kousin
です

Re: 関数呼び出し

Posted: 2014年8月31日(日) 17:34
by sekken
すみません
原因はe関数の中にありました
解決しました
有難う御座いました。