プログラムをコンパイルはできるのですが、実行するとエラーが出てしまいます。
run-time error R6000
-stack overflow
と出るのですが、これはどういう意味なのでしょうか?
どこを直せばいいのかわからず困っています。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

 スタックとはメモリの一部で、主にローカル変数の確保や関数呼び出し元のアドレス保存、関数へのパラメータ受け渡し領域として使われます。


 stack overflowとは、スタックとして割り当てられているメモリ領域を使い切ってしまったというOSからのエラーメッセージです。

 考え得る原因はpunchan_jpさんのおっしゃる通りです。その中でも一番ありがちなのが、巨大な配列の関数内確保ですね。
 簡単な解決策はグローバル変数にすることです。グローバル変数はスタックとは別のメモリ領域に確保されます。関数内でもstaticを付けて宣言すれば同様になります。
 また、mallocによってメモリを動的確保するのも手です。この場合初期化はできませんが。

 再帰関数の終了条件設定ミスもよくあります。これはアドバイスできる範疇ではないので、もし思い当たるならば、補足辺りにその関数を載せてもらわないと回答はムリですね。
    • good
    • 0
この回答へのお礼

ありがとうございました!おかげで解決し、実行できるようになりました!!

お礼日時:2001/06/07 20:01

使っているのは Visual C (もしくは MSC) ですよね。



コマンドラインでコンパイルをしているのであれば、 /F オプションで
指定します。

d:\> cl /F20000000 ...

プロジェクトを作っているのであれば、プロジェクトの設定で、「リンク」
というタブがあるはずで、そこでスタックのサイズを指定できます。
多分、「スタックアロケーション」の「リザーブ」となっているはず。

指定は、バイト単位で、デフォルトでは 1Mbyte なので、それよりも
大きな数字を設定することになります。


もし、スタックが足りなくなっている原因が関数の呼出しが深すぎる
ことが原因であれば、スタックサイズの指定をしても問題は解決しません。
プログラムの見直しをしましょう。

ただし、普通の呼出しかたでは、めったにこうなることはありません。
プログラムの中で、関数の再帰呼出しをしていなければ、スタックサイズの
指定でいけるはずです。
    • good
    • 0
この回答へのお礼

ありがとうございました!おかげで解決し、実行できるようになりました!!

お礼日時:2001/06/07 20:01

stack overflowということは、関数の呼び出しが深すぎるか、


関数にローカルな変数が多すぎるかです。

関数から自分自身を呼び出す再帰呼出しをしていて、
その終了条件が誤ってませんか?
巨大な配列変数を関数内で宣言していませんか?

もし、それらに問題ない場合、stack のサイズが小さすぎるのかもしれません。
UNIXであればシェル内で stack のサイズを増やすことができると思います。
とはいえ、デフォルトの stack サイズでも overflow しないように書くのが
本筋でしょう。
    • good
    • 0
この回答へのお礼

ありがとうございました!おかげで解決し、実行できるようになりました!!

お礼日時:2001/06/07 20:00

コンパイルオプションのスタックサイズを大きく設定するか、スタックチェックをしないように設定して下さい。



(あれ、リンカオプションだったかな?)

OSとコンパイラ(出来ればバージョンも)をはっきりさせないと正解は来ないかも、
メッセージは、MS-DOSのMSCににているけど。
    • good
    • 0
この回答へのお礼

ありがとうございました!おかげで解決し、実行できるようになりました!!

お礼日時:2001/06/07 20:00

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QRun-Time Check Failure #3というエラーが出ます。

//Run-Time Check Failure #3 - The variable 'Data' is being used without being defined.
//というエラーが出ます。どうしたらいいですか?
//プログラムの内容は、数値を格納するときに、二分木構造で格納していくというものです。
//多分違うような気がしますが、、
//よろしくお願いします。
#include<stdio.h>

struct DATA
{
DATA *Small;
DATA *Large;
int Number;
};
void InputData(DATA *Dat,int num)
{
if(Dat==NULL){Dat=new DATA;Dat->Number=num;return;}
if(Dat->Number<num)
{
Dat->Large=new DATA;
Dat=Dat->Large;
InputData(Dat,num);
}
else if(Dat->Number>num)
{
Dat->Small=new DATA;
Dat=Dat->Small;
InputData(Dat,num);
}
return;
}
int main()
{
DATA *Data;
InputData(Data,20);//<-ここでエラーが出ます。
InputData(Data,10);
InputData(Data,30);
return 0;
}

//Run-Time Check Failure #3 - The variable 'Data' is being used without being defined.
//というエラーが出ます。どうしたらいいですか?
//プログラムの内容は、数値を格納するときに、二分木構造で格納していくというものです。
//多分違うような気がしますが、、
//よろしくお願いします。
#include<stdio.h>

struct DATA
{
DATA *Small;
DATA *Large;
int Number;
};
void InputData(DATA *Dat,int num)
{
if(Dat==NULL){Dat=new DATA;Dat->Number=num;return;}
if(Dat->Number<num)
{...続きを読む

Aベストアンサー

とりあえず、題名のエラーに付いてですが、
それは、mainの中での初期値を設定していない為に、
変数に不定値が入っていた為に起こった現象です。

で、#2に付いての質問ですが、まずは、main関数での宣言の
DATA *Data ;
は、アドレスを格納する変数と言うことです。

また、InputData関数の引数の
DATA **Datに付いては
アドレスを格納する変数のアドレスを引数とするという事です。

ですから、質問時のInputDataの引数の
DATA *Datでは
Datと言う変数のアドレスを受け取ると言うことで
アドレスを格納する変数では無く、実体(値)を格納する変数となります。

で、#2のようにDATA **Datとすると *Datのアドレスを
受け取ると言うことになり、アドレスを格納する
変数と言うことに成ります。
(引数で記述するのはあくまでも変数宣言と同等です。)

以上が今回のエラー及びプログラムの間違いです。
(説明が下手で申し訳ありませんm(_ _)m)

詳しいアドレス及びポインタに付いては、C言語の
書籍にポインタに付いて記述されていると思いますので
探してみてください。

でも、ポインタに付いて詳しい説明をしている書籍って
・・・本1冊分になるような気がする(汗

それと、余計なアドバイスに成りますが、
ローカル変数とグローバル変数の違いもお勉強されると
良いかもしれませんね。
ローカル変数は、宣言するだけでは初期値は不定とかね。(だから、必ず初期化が必要なんです。)
そうすれば、今回のエラーの意味もすぐにわかると思います。

これも、余計な事かもしれませんが、#2の
お礼の部分に記述してあるプログラムに付いてですが、
せっかくですから、InputDataの中でデータと
データの間に挿入すると処理を追加すれば、
DATA *Top;
DATA *TopTmp;
をmainで使用しなくても動作すると思います。

では、頑張って見て下さい。

とりあえず、題名のエラーに付いてですが、
それは、mainの中での初期値を設定していない為に、
変数に不定値が入っていた為に起こった現象です。

で、#2に付いての質問ですが、まずは、main関数での宣言の
DATA *Data ;
は、アドレスを格納する変数と言うことです。

また、InputData関数の引数の
DATA **Datに付いては
アドレスを格納する変数のアドレスを引数とするという事です。

ですから、質問時のInputDataの引数の
DATA *Datでは
Datと言う変数のアドレスを受け取ると言うことで
アドレ...続きを読む

QVC++6.0 Stack Overflow !!

私はVC++6.0で画像処理のプログラムを作っています。
再帰構造を用いたある関数を呼ぶと、対象の画像によって、スタックオーバーフローでプログラムが止まってしまいます。

これを避ける方法や、スタックのサイズの変更方法がありましたら教えてください。

なお、現在、VC++のメニューの「プロジェクト」→「設定」→「リンク」タブ→「アウトプット」カテゴリからスタックアロケーションの予約のところを適当な大きな数を入力しているのですが、効果はありません。

Aベストアンサー

実際の実行時の再帰の段数は調べました?
あまり深いようなら、論理の再設計したほうが性能面での改善も得られ、一石二鳥かと。

浅い段数で潰れるなら、auto変数から static変数やHeap領域への転換を評価してみては?

Qコンパイルすると error C1083 が出てしまいます

 -スペック-
Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
以下のプログラムを実行すると、error C1083: include ファイルを開けません。'myhelper.h': No such file or directory

っていうエラーが出ます。
----------------------------------------------------------------
 -プログラム-
 - mymain.cpp の中身 -
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}

 - mymain.h の中身 -
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();

 - myhelper.h の中身 -
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;

myhelper.h はコピペなので間違ってはない。
----------------------------------------------------------------
まだC言語初心者なので、どのようにすれば直せるのかわからないので
詳しくお願いします。

一応サイトで検索などをして、自分なりに調べてきて
定義が間違ってないかを見ましたけどそれでもまだわかりません。


それでは宜しくお願いします。

 -スペック-
Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
以下のプログラムを実行すると、error C1083: include ファイルを開けません。'myhelper.h': No such file or directory

っていうエラーが出ます。
----------------------------------------------------------------
 -プログラム-
 - mymain.cpp の中身 -
#include "myhelper.h"
#include "mymain.h"

//...続きを読む

Aベストアンサー

画像、わかりやすいねぇ、便利な世の中だ。

エクスプローラで、"...\my"っていうフォルダの中身が見えてるけど、その中には、"myhelper.h"が無いね。このファイルを見つけて、"...\my"フォルダに移動かコピーしてみるか、myhelper.hのあるフォルダをインクルードサーチパスに追加する。で、解決したらいいな。

sakana20zbさんは、書きました:
> >mymain.cppと同じところにmyhelper.hがありますか?
> 同じファイル内にありますね。

同じフォルダには無いみたいに見えるなぁ。myhelper.cppはあるけどmyhelper.hは無い。回答No1.bardfishさんのアドバイスと同じだから、もう一度読んで確認してごらん。

Magna

Qコンパイルに失敗しました、と出て実行出来ません

学校のC言語の講義で
http://www.soci.ous.ac.jp/~kuroda/
http://www.soci.ous.ac.jp/~kuroda/second_semi2009/c_pro/weekly_quiz/7th/prog071.zip
先生のHPからC言語ファイルをダウンロードしてから実行するのですが、CPad for Borland C++Compilerでコンパイル+実行を選ぶと「コンパイルに失敗しました、ファイル~~~(実行するファイルです).exeは存在しません。
と出てしまって実行することが出来ません。

どうすれば実行出来るでしょうか?
ご存知の方がおられましたら、よろしくお願いします。

Aベストアンサー

ダウンロードしたファイルをそのままコンパイルしてる?
途中が[ 1 ]のように空欄になってるから,適当に自分で文を書いてからコンパイルするんだよ。

Qerror C2065: error C2057: が出てしまいます。

VC++6.0 ダイアログベースです。

自動で作られたダイアログのヘッダファイルを
自作で作ったクラスのヘッダファイルでインクルードした所
下記のようなエラーが出てしまいました。
  
error C2065: 'IDD_MY_DIALOG' : 定義されていない識別子です。
error C2057: 定数式が必要です。
  
まだ自作で作ったクラスはクラスになる前のインクルードのみ書かれた
状態ですが・・・。
    
//自作する予定のヘッダファイル(まだインクルードのみ)
#pragma once
#include "DLGTEST.h"//自動で作られたダイアログ

//自作のファイル(まだインクルードのみ)
#include "stdafx.h"
#include "gakusei.h"
  
自動で作られたファイルをインクルードすることは出来ないのでしょうか?
もしインクルードできるならどのようにしたらインクルードできるのでしょうか?
オンラインマニュアルで調べたのですが、良くわかりませんでした。

/**オンラインマニュアルより、解決方法**/  
stdafx.h からの VC_EXTRALEAN 行を定義する 1 つソリューションが#を削除できます。
これは、通信とレジストリとほかのエリアの MFC によってプロジェクトで直接が使用されない Win32 API を保持します。
含められない代替は、#のセットでの行が「#が VC_EXTRALEAN を定義するのを」置き換えるために、
上記で一覧された行を定義しこと、そしてハードウェアがそれその#が定義する削除によって選択的に登録されこと、です。
たとえば 通信 API が呼び出される場合、#がすべて上記で stdafx.h に「#が NOCOMM を定義すると、」行の以外、
一覧された行を定義するのを持つ可能性があります。

VC++6.0 ダイアログベースです。

自動で作られたダイアログのヘッダファイルを
自作で作ったクラスのヘッダファイルでインクルードした所
下記のようなエラーが出てしまいました。
  
error C2065: 'IDD_MY_DIALOG' : 定義されていない識別子です。
error C2057: 定数式が必要です。
  
まだ自作で作ったクラスはクラスになる前のインクルードのみ書かれた
状態ですが・・・。
    
//自作する予定のヘッダファイル(まだインクルードのみ)
#pragma once
#include "DLGTEST.h"//自動で作...続きを読む

Aベストアンサー

#include "resource.h"
を作られたファイルに書けば大丈夫です。
リソースIDは上記ファイルに書かれています。


人気Q&Aランキング

おすすめ情報