関数呼び出し

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sekken

関数呼び出し

#1

投稿記事 by sekken » 9年前

①void の関数の中で、②voidの関数を呼び出すと、②void関数の前後で①voidの関数の内の変数の値が変わっていました。
これはどういうことなのでしょうか?
どう対処すればいいですか?

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

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

アバター
spaaaark・∀・
記事: 66
登録日時: 10年前
住所: 埼玉
連絡を取る:

Re: 関数呼び出し

#2

投稿記事 by spaaaark・∀・ » 9年前

ソースコードがないので何とも言えないのですが、ひとまず同じクラス内ならメンバ変数を関数①内で変更している
可能性があります。その場合はその値を別のローカル変数に入れ、処理を行うことで現象が解決するはずです。
クラスの場合メンバ変数の値はクラス内のすべての関数で同じ値が使われます。(クラス内のグローバル変数みたいな感じ)
これを迂闊に変更すると動作のバグを引き起こす原因となりますので、一度確認してみてください。
クリエイティブな生活で刺激的な毎日を!

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

Re: 関数呼び出し

#3

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

ローカル変数はポインタミスや配列の添字外参照で値が書き変わる場合があります。
そもそも変数を初期化していなかった可能性もあります。
問題を再現できるソースコードを投稿してもらうのが一番ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sekken

Re: 関数呼び出し

#4

投稿記事 by sekken » 9年前

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は書かれていない

}


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

sekken

Re: 関数呼び出し

#5

投稿記事 by sekken » 9年前

訂正します
CProconAI→C
eaction→e
shokikakousin→kousin
です

sekken

Re: 関数呼び出し

#6

投稿記事 by sekken » 9年前

すみません
原因はe関数の中にありました
解決しました
有難う御座いました。

閉鎖

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