• 締切済み

おかしな現象が発生 問題の関数内のスタックが原因?

VisualC++2005でプログラムを書いているのですが、おかしな現象が発生しまして、皆さんも似たような経験をされたかどうかお聞きしたいです。 C言語の関数の動作テストしているのですが、問題の関数をコールした後、通るべきプログラムを飛ばして、次の行の命令から実行されます。 具体的には、n=a();という関数がありまして、 戻ってきた位置に if (n == 0) { // ------------------ (A) printf("通過すべき場所"); } があり、デバッグの自動変数ではnは0,であるため、「通過すべき場所」が 表示されるはずですが、実行中もでバック中もここを飛ばして、次の行から動作しています。 問題のa()はコールした時はアセンブラのような画面が出てきたので、おかしいなと思ったのですが、(A)の位置にブレークポイントを置きそこまで走らせると、そこで止まり、F11でステップインさせると、飛ばして別の行へいきます。 問題のa()内のスタックが壊れているのでしょうか? もう一度a()の関数を書きなおして、中で定義している配列の大きさなど調べた方が良いのでしょうか?

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.8

スタックサイズに関する補足を書くよりも、 ソースコードを載せる方が解決への近道である、 と思うのは私だけでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

スタックの破壊とスタックサイズは基本的に関係がありませんよ。

全文を見る
すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.6

そういうときは、 n=a(); をコメントアウトして、 n=0; と書いてみて、動作を確認するのがよいです。 これでprintfが実行されたなら、a()が怪しいし、やっぱり実行されないなら、原因はa()以外のところにある可能性が高い。

全文を見る
すると、全ての回答が全文表示されます。
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.5

私もスタックを壊している気がします。 皆さんがおっしゃるように、 配列の終わりを越えて書き込んだ可能性もあります。 もう一つは "再帰"で終わらなくなってしまう場合です。 念のため、解説します。 ”再帰”とは関数の実行途中で自分自身を再度呼び出すことです。 ”再帰"はきちんと作られていれば、便利なのですが、 誤っていた場合(return が実行されない場合) あっという間にスタックが消費されてしまいます。 私も、たまにやるのですが、 C++のvirtual 関数で派生クラスの関数から 基本クラスの関数を呼び出す際に ついうっかり 基本クラス:: をつけるのを忘れることがあります。 これは、自分では再帰なんて使っていないつもりでも 再帰になってしまいます。 このように、自分でも気づかないうちに、再帰になる可能性もありますので 調べてみてはいかがでしょうか?

bazax
質問者

補足

ご回答ありがとうございます。 スタックのサイズはデフォルトがわかりませんが プロパティ  構成プロパティ   C/C++    コマンドライン 追加のオプション /F 1000000000 953MBのスタックで約1Gのスタックはできるのでしょうか? また、実行ファイル(exeファイルから)スタック領域がわかる方法があるのでしたら知りたいです。

全文を見る
すると、全ての回答が全文表示されます。
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.4

私もスタックか何か分からないが壊れていると思います。 n=0とのことですが、if(n==0)の前後に念のためにnを printしたいですね。デバッガ見たものでなく、プログラ ムが見たものを知りたいです。

全文を見る
すると、全ての回答が全文表示されます。
  • apple_mon
  • ベストアンサー率100% (1/1)
回答No.3

説明が理解できない。 ソースを10行程度貼った方が回答者の負担が少なくてすむんじゃないだろうか。 感覚的には最適化が聞いているのが問題なような気もするけど。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

(A)の前後のコードと、a()の中身を見せてください。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

スタックが壊れているんだろうね? n=a();の前に定義したバッファかなんかにデータを移す命令はありませんか? 多分バッファオーバーフローとかのスタック破壊と思われます。 バッファの定義を大きくしたら解決するかも?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 関数重複の問題

     VBScriptで同じ関数名があってもエラーが出ずに、処理が実行されてしまいます。(呼び出しが早い方が実行されるみたい。)  自分で関数名の管理をやっておればよいのですが、プログラム自体が大きくなっていくと、関数の重複によるプログラムエラー?(意図しない動き)が懸念されます。  また、クラス内ではPrivate関数と同じ関数名があった場合などクラスでの問題もおきてくるのではないかと考えます。(Private関数の方が優先される?←試していないのでわからない。)  変数に関しても同様です。  これらの問題を回避する方法として、関数名/変数を管理する技術等はありますでしょうか?ご教授のほど、よろしくお願いいたします。

  • 関数の書き方と使い方

    Nを引数として受け取り、 y=1+x+x^2+x^3+...+x^N ただし |x|<1 を計算する関数 float func1(float x, int N) を定義してその動作を確認するプログラムkadai3-1.cを書きなさい。 ただしNとxはキーボードから次で入力するものとする。 scanf("%f %d", &x, &N); 答えは以下で出力されるものとする。 printf("answer = %f\n", answer); 実行例 $ gcc kadai3-1.c $ ./a.out 0.1 5 answer = 1.111110 よろしくお願いいたします。

  • Debug.exe実行時にWinMainCRTStartup()でエラーが発生する

    WindowsXP VisualC++.net2003 で開発をしています。 VC上で実行すると問題なく実行できるのですが、Debugファイルから実行するとエラーが発生します。 エラーの発生場所は setSBUpLow() 行409+ 0x9となっています。 この関数はWinMainCRTStartup()で呼び出されています。この関数はAPIです。 Windowを初期化するときに自動的に呼ばれているようです。 自分のプログラムのどの部分でエラーが起こっているか調べたところ、クラスのコンストラクタ内で行っている次の処理が原因のようです。  int **test;  test= new int*[10];  for(int i = 0; i < 10; i++){   test[i] = new int[10];  } この部分をコメントアウトするとエラーが発生しなくなります。 new演算子でメモリを確保しているときにエラーが発生 しているようです。 なぜ、Debug.exeで実行したときだけ エラーがでるのでしょうか? また、エラーが発生しないようにするにはどうすればいいのでしょうか?

  • Excel VBA ステップインが途中で通常実行になってしまう

    VBEでF8キーを一回ずつ押して一行ずつステップインでコードを実行していくと、 Workbooks.openの行を実行した途端、 それ以下のすべての行が通常実行されてしまいます。 すべての行をステップインで実行するにはどうすればよいのでしょうか。 例)Workbooks.Openの行でF8を一回押すと、すべて通常実行されてしまう。   (2行目以下も一行ずつ動作を確認したい) ---- Sub test() Workbooks.Open ("C:\test.xls") Range("A1").Value = 1 Range("A2").Value = 2 Range("A3").Value = 3 End Sub ---- よろしくお願いいたします。

  • 三角関数の定積分の問題です。

    三角関数の定積分の問題です。 ∫(π-a→π+a)sin(nx)dx    という問題で =[(1/n)sin(nx)](π-a→π+a) ここでsin(n(π-a))とsin(n(π+a))は0になりますか?

  • C#の実行関数トレース

    C#プログラムのプロジェクトに途中から参画しています。 まだプログラムの全容を理解していないため、どのメニューを実行したときにどの関数が呼ばれるのか、を追うだけでいちいち時間がかかってしまい、困っています。 あるメニューを実行したときにコールされる関数名をすべて出力できるような方法やツールはありますか?

  • Linux上で実行関数使用

    Windowsで作成したphpプログラムをLinuxに移動させようとしています。 そのプログラムの中ではC言語で作成したプログラムの実行形式(.exe)をshell_execを使って実行させています。 Linux上で動作させる場合は.outを実行すればよいとはわかるのですが、 どの実行関数を試してみてもパスが通らないか、通っても動作していなor結果が返ってこないようで、全く反応がありません。 .outを単体で実行させた場合は問題なく動作するので、C言語のプログラム上の間違いではないです。 どなたかLinux上で、phpで実行形式を動かす方法を知りませんか?

    • 締切済み
    • PHP
  • 関数がうまく作れません。

    okame5131 C言語をやり始めたばかりなのですが、関数がよく理解できず困っています。 関数で*(アスタリスク)とスペースを使って*マークの図形を出力するというプログラムを作ろうと思っているのですが、うまくできません。 visual studio 2005でプラグラムを作り、デバック無しで実行すると http://www.dejavu.jp/~webmaster/upbbs/users/test/img/1215012104.jpgのようなアスタリスクの形を作るにはどうしたらいいでしょうか? 私はこの図形を上の部分、真ん中、したの部分に分けて考えて、 色々な関数を組み合わせて*の形作りたいのですが・・・。 自分で途中まで作ってみたのですが、訳が分からなくなってきました。 自分で作ったやつは(関数部分だけです) void hoshi(int n) { int i1,i2,cnt,j; //n=辺 i=行 j=数     n1=0 n2=n for(cnt=1;cnt<=n;cnt++) { for(j=1;j<=2;j++) { printf("* "); まで作ったのですが、混乱してきました。 どなたか*を作るためのプログラムを教えていただけませんか? また、作る際のアドバイスがあったらお願いします。

  • アセンブラからCの関数を呼び出すには?

    「OS自作入門」を読んで試しています。 フロッピーのブートセクタに自作のブートプログラムを 書き込み、ブートプログラムから自作のOSを呼び出して実行 しています。自作といっても前述の参考書の物まねですが・・・・。 ここまでは全てアセンブラでプログラムを書いてきました。 NASMを使っています。ずっとアセンブラではきついので C言語で書きたいのです。 まずは自作のOSからCで書いた関数を呼び出して実行したいの です。つまり・・・ OS.ASM + TEST.C→OS.BIN としたいのです。OS.ASMは自作のOSです。TEST.CにはCの関数を 書いておき、OS.ASMから呼び出すようにします。 これらをくっつけてOS.BINというファイルにしたいのです。 どうすればいいでしょうか?  (1) ブートプログラムの中で16ビットモードから32ビットモードに 切り替えており、自分でセグメントを決めてあります。TEST.Cも それにあわせる必要があるかと思いますが、どうすれば? (2) OS.ASMとTEST.Cをどうやってくっつけるのかがわからない。 リンカーとか使うのでしょうか?

  • 関数 左辺値 参照 返り値 

    こんにちは。宜しくお願い致します。 > たとえば,下のサンプルプログラムでは関数fが参照を返すようになっているため,この関数fを代入の左辺においた,f(a, n) = 10;のような式が許される. > > #include <iostream> > using namespace std; > > int& f(int* a, int n) > { (2)~ return a[n]; > } > > int main(void) > { > const int n = 5; > int arr[n] = { 1, 2, 3, 4, 5 }; (1)~ f(arr, 3) = 10; > for (int i = 0; i < n; ++i) > cout << arr[i] << endl; > return 0; > } 上のサンプルプログラムで左辺値に参照を返す関数が(1)~あるのですが 動作が分りません。 関数内部の(2)~return a[n];というところで、関数の返り値int&の参照はa[n]という変数になるので、(1)~の結果としてa[n]に10が代入されるのでしょうか?教えてください。

無線ルータのトラブル
このQ&Aのポイント
  • 無線ルータのトラブルについての質問です。
  • ノートパソコンを使用していないときに時々インタネットアクセスができないときがあります。
  • 原因と対処方法をお知らせください。
回答を見る