①void の関数の中で、②voidの関数を呼び出すと、②void関数の前後で①voidの関数の内の変数の値が変わっていました。
これはどういうことなのでしょうか?
どう対処すればいいですか?
とりあえず、①voidの関数内で、先頭に②voidの関数を呼び出すことで、治りましたが
何か良い方法が無いでしょうか?
もしかすると、ヘッダファイルで定義した関数を①void関数でも②void関数でも使っているのですが(なので、ヘッダのクラス::①void関数 ヘッダのクラス::②void関数という形です)、それが原因でしょうか?
関数呼び出し
- spaaaark・∀・
- 記事: 66
- 登録日時: 10年前
- 住所: 埼玉
- 連絡を取る:
Re: 関数呼び出し
ソースコードがないので何とも言えないのですが、ひとまず同じクラス内ならメンバ変数を関数①内で変更している
可能性があります。その場合はその値を別のローカル変数に入れ、処理を行うことで現象が解決するはずです。
クラスの場合メンバ変数の値はクラス内のすべての関数で同じ値が使われます。(クラス内のグローバル変数みたいな感じ)
これを迂闊に変更すると動作のバグを引き起こす原因となりますので、一度確認してみてください。
可能性があります。その場合はその値を別のローカル変数に入れ、処理を行うことで現象が解決するはずです。
クラスの場合メンバ変数の値はクラス内のすべての関数で同じ値が使われます。(クラス内のグローバル変数みたいな感じ)
これを迂闊に変更すると動作のバグを引き起こす原因となりますので、一度確認してみてください。
クリエイティブな生活で刺激的な毎日を!
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 関数呼び出し
ローカル変数はポインタミスや配列の添字外参照で値が書き変わる場合があります。
そもそも変数を初期化していなかった可能性もあります。
問題を再現できるソースコードを投稿してもらうのが一番ですね。
そもそも変数を初期化していなかった可能性もあります。
問題を再現できるソースコードを投稿してもらうのが一番ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 関数呼び出し
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は書かれていない
}
こんな感じです。行数が多いので、関係のなさそうなところは割愛させてもらいました。
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は書かれていない
}
こんな感じです。行数が多いので、関係のなさそうなところは割愛させてもらいました。