- 締切済み
変数を全部初期の状態にすること出来ますか?
void func(){ static int a=1; } とか書いている、このaみたいな関数の中にある静的変数を一括で 最初の状態(この場合a=1)に出来ませんか? プログラムを再起動する他無いんでしょうか・・。 もし再起動するしかない場合、自分自身を再起動する方法はありますか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
予約語は register です>#5. で #4 で「関数の名前がregistというのはいくらなんでもあんまりだ」と書かれているのは, おそらく*そんな単語は存在しない*ということを指摘しているのではないかと思います. 「抵抗する」なら resist だし, 「登録する」なら register だから.
- sha-girl
- ベストアンサー率52% (430/816)
#4さんの指摘の通り registは予約語でした。すみません。。。 (直接書いただけでコンパイルテストもしてません。) reg_ptrとでも置き換えてください。
- sakusaker7
- ベストアンサー率62% (800/1280)
関数の名前がregistというのはいくらなんでもあんまりだ。
- sha-girl
- ベストアンサー率52% (430/816)
>変数全体を初期化 これは根本的な解決にはなっていないと思います。 原因を把握せず、そのまま放っておくことは 更なるバグを生む原因になります。 まずバグの場所を断定するべきだと私は思います。 開発環境はわかりかねますが、 そもそもにしてデバッガの持っている機能を利用できていないのでは? 例えばVisual C++の ブレーク機能ではある特定のメモリが書き換わった瞬間に ブレークするような機能はありますがそういった機能は 利用しているでしょうか? >現在作っているゲームがもうコードは数万行になってしまっていて、 私自身ゲームメーカーに勤めていますが、市販ゲームのソースコードなんて 数万行どころではありません。 バグがあればそれをアセンブラレベルで追うこともありますし、 バグ発見用のコードを作る事も多々あります。 仮にソースコードが10万行あったとしても #1さんが提示してあるようなコードに書き換える作業は1日でできると思います。 もちろんそれはスマートな方法とは思わないですし、 その時間でソースコードに別の工夫をする余地があるでしょう。 C++ですが#1さんの方法を少し拡張してmapを使った方法ですが static int a = 1をstatic int a = 1;regist(&a , 1)に置き換えるだけで init()を呼び出すだけで初期値に戻せるようにしました。勿論これは根本的な解決方法ではありません。 ※「#define STATIC_INT( A , B ) static int A ; regist( &A , B )」としてSTATIC_INT( a , 1 );としても良いかもしれません。 #include <map> #include <stdio.h> std::map<int*,int> ptr_list; void regist(int* ptr,int val) { if( ptr_list.find(ptr) == ptr_list.end() ) { ptr_list.insert( std::pair<int*,int>(ptr,val) ); } } void init() { for( std::map<int*,int>::iterator it = ptr_list.begin() ; it != ptr_list.end() ; ++it ) { *(it->first) = it->second; } } void func() { static int a = 1; regist(&a , 1); a = 2; init(); printf("%d",a); } int main() { func(); return 0; }
- jacta
- ベストアンサー率26% (845/3158)
処理系不明なので何ともいえませんが... スタートアップでやっているのと同じことをやれば済むケースが結構あります。 ただし、初期値付きオブジェクトの場合、初期値がどこにもないと元の状態を復元できません。ブートの方法をコントロールできるのであれば、そこから見直す必要があります。 また、C++ということであれば、状況はさらに複雑になります。
- aigaion
- ベストアンサー率47% (287/608)
int *ap = NULL; void func(){ static int a = 1; ap = &a; } void init(){ if(ap != NULL) *ap = 1; } このように書くことで,可能かと思います. func()内のaは,func内でしか呼び出せないのでポインタを使ってアドレスを覚えておきます. func()を一回でも呼び出せば,apにfunc内のaのアドレスが保存されます. それを元にfunc内のaの内容を初期値に戻せばよいです. よほどのことがない限り,このような方法はよろしくはないので 可能であればアルゴリズムを再考したほうが良いと思います.
お礼
ありがとうございます。 現在作っているゲームがもうコードは数万行になってしまっていて、 恐らく静的変数が初期化できてないからではないかと思われるバグがあるのですが、 一つ一つ延々と見ていっても原因がわからなかったのです・・。 再起動すると直るので、静的変数を一括初期化出来ればと思いました。 とりあえず1時間位延々とリプレイ映像を流し続ける必要があるだけなので、 再起動の方向で行ってみようかと思います・・。