スタックオーバーフローを起こす簡単プログラムを作れって、
大学の教授に言われたんですけど、さっぱり分かりません。
コンパイルと実行の仕方しかわからない自分にそんな過酷な課題を・・・
誰か助けてください。
そもそもスタックオーバーフローってなんなんですかね・・・。

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

A 回答 (5件)

スタックオーバーフローについては既に説明があるので、


サンプルプログラム
こんな感じでスタックを浪費するプログラムを作ればいいと思います。
sum(n)は、1~nまでの数値を足し込むプログラムですが、9000あたりでスタックオーバーフローします。
sum(10000)は50005000で、単純に計算すれば、intの範囲で計算できます。
------------------------------------------------------------

public class Calc {
static int sum(int n){
if(n>0)
return n+sum(n-1);
else
return 0;
}
static public void main(String[] argc){
System.out.println(sum(10000));
}
}

この回答への補足

これをスタックオーバーフローを起こさないようにするためには、
何か1文加える必要があるのでしょうか?
本当に素人なんで、初歩的な質問ですみません。

補足日時:2005/10/21 10:39
    • good
    • 0

#3>これをスタックオーバーフローを起こさないようにするためには、


答えの求め方自体に問題があるので、別の方法にするとか
例えばn*(n+1)/2で答えが求められます。
そうではなくて、例外が起こったときにもプログラムが終了しないようにするという意味ならエラーが起こりそうなところをtry{ }で囲み、catch{}で例外発生時の処理をします。
    • good
    • 0
この回答へのお礼

例外が起こったときにもプログラムが終了しないようにするという意味です。
質問があいまいで申し訳ありませんでした。
try{ }
catch{ }
という方法があるということは、非常に勉強になりました。
ありがとうございます。

お礼日時:2005/10/21 14:01

Javaで書くもっとも簡単な(短い)スタックオーバーフローを起こすものといえばこんな感じでしょう。


永遠に自分を呼びつづけるので一瞬で落ちます。

public class ErrorTest {
public static void main(String[] args) {
main(args);
}
}
    • good
    • 0

メソッドの呼び出しをすると、そのメソッドが終了したら呼び出し元に制御が戻りますよね?



これを実現するため、どこから呼んだのかを記録しておくのがスタックです。

ですから、ものすごくたくさんの回数のメソッドの呼び出しを行えば、スタックに記録しきれなくなりスタックオーバーフローが発生します。

ではどのくらい呼び出せばオーバーフローするかというと、とにかくたくさんで、普通にプログラムを作ったぐらいではオーバーフローはまず起こりません。

あとは自分で考えてみてください。
    • good
    • 3

スタックオーバーフローとはスタック(変数などを格納するメモリ領域)で発生するバッファオーバーフローのことです。

バッファオーバーフローについては参考URLで解説しています。
ただJavaではスタックオーバーフローが起こってもStackOverflowError()にスローされるので致命的な事態にはなりません。

Javaでは配列やStringではスタックオーバーフローを起こせません。そこで、再帰関数による無限ループなどを実行することでスタックオーバーフローエラーが起こります。

参考URL:http://e-words.jp/w/E38390E38383E38395E382A1E382 …

この回答への補足

FORTRANでも同じことが言えるのでしょうか?

補足日時:2005/10/20 17:02
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QμITRONのスタック見積もりについて

μITRON4.0準拠のNORTi+ARMを使用し組み込み開発をしています。
質問は、スタックでオーバーフローの可能性があるため、スタックの見積もりを行いたいのですが、
(1)タスクのスタックの見積もり方法が、タスクごとにスタックを計算し足し算でよいのか(タスクごとにスタック容量を設定するので)、タスクの発生パターンを考えてそれの合計のスタックを見積もればよいのか分かりません。また計算してくれるコマンドやツールはあるのでしょうか?
(2)割り込みハンドラ等の非タスクコンテキストとタスクコンテキストのスタックの関係、両者を含めてオーバーフローを考えるべきなのでしょうか?
よろしくお願いいたします。

Aベストアンサー

1.タスクスタックを個別にするには、cre_tskでのスタックアドレスを渡してあげること。
2.その他のスタック(カーネル、割り込みハンドラ)は、スタック用メモリ
  が使われ、そのサイズは、STKMSZ で定義したサイズが使われます。
3.タイムイベントハンドラは、スタックセクションから直接使われるようです。

使われるというのは、生成したときに固定サイズで割り当てされると考えたらよいと
思います。ですので、それぞれがオーバーしないサイズにしないといけません。

以下 蛇足かもしれませんが
1)スタック必要サイズを調べるのは設計上必要な作業
 オーバーしてから調べるのではなく、本来設計上いくら必要か算出しておく
 べき内容です。設計データとして算出し、ドキュメント化しておくことを
 お勧めします。 カーネルスタックはぜひ、ミスポさんに問い合わせください。
 もし、こんなことも回答できないようなら、有償OSとして選ぶ意味がないと私は思います。

2)稀に暴走する場合の対処
 いろんな原因があって、難しいケースもあります。設計に立ち返って
 たとえばスタックオーバーを仮定してそれを調査しなおすのもひとつかと思います。
 ICEが今使えないということですが、使えるようになったら、デバッガーのトレース
 機能で調べたらよいかと思います。(ARMのそれがトレースできないならできませんが)

1.タスクスタックを個別にするには、cre_tskでのスタックアドレスを渡してあげること。
2.その他のスタック(カーネル、割り込みハンドラ)は、スタック用メモリ
  が使われ、そのサイズは、STKMSZ で定義したサイズが使われます。
3.タイムイベントハンドラは、スタックセクションから直接使われるようです。

使われるというのは、生成したときに固定サイズで割り当てされると考えたらよいと
思います。ですので、それぞれがオーバーしないサイズにしないといけません。

以下 蛇足かもしれま...続きを読む

Qjavaの課題でコンパイルエラーが出てきて困っています

学校の授業でjavaの課題が出たのですが、

javakadai.java:41: ここにインタフェースが必要です。
class javakadaiPanel extends JPanel implements ActionListener,ActionEvent{

というエラーが出て困っています。
どなたか解決方法を教えてくれませんか?

ソースは以下です。
よろしくお願いします。

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JCheckBoxMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JRadioButtonMenuItem;
import java.awt.Container;

public class JavaKadai {
public static void main(String[] args) {
JavaKadaiFrame frame = new JavaKadaiFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

class JavaKadaiFrame extends JFrame {
JavaKadaiFrame() {
super();

setSize(300, 300);
setLocationRelativeTo(null);
setTitle("JavaKadai");

Container c = getContentPane();
c.add(new JavaKadaiPanel(getRootPane()));

}
}

class JavaKadaiPanel extends JPanel implements ActionListener,ActionEvent{
Color color = Color.black;
JCheckBoxMenuItem miR = new JCheckBoxMenuItem("R");
JCheckBoxMenuItem miG = new JCheckBoxMenuItem("G");
JCheckBoxMenuItem miB = new JCheckBoxMenuItem("B");

public JavaKadaiPanel(javax.swing.JRootPane root) {
setBackground(Color.black);

//メニューバーはJFrameのルートペインに追加
JMenuBar bar = new JMenuBar();
JMenu mnBack = new JMenu("BACK");

//メニュー構成
bar.add(mnBack);
mnBack.add(miR);
mnBack.add(miG);
mnBack.add(miB);

//ルートペインへメニューを追加
root.setJMenuBar(bar);

miR.addActionListener(this);
miG.addActionListener(this);
miB.addActionListener(this);

mnBack.setMnemonic('B');//[Alt]+[B]でアクセス
miR.setMnemonic('R');//[R]でアクセス
miG.setMnemonic('G');//[G]でアクセス
miB.setMnemonic('B');//[B]でアクセス
}

public void actionPerformed(ActionEvent e){
int R = miR.isSelected() ? 255:0;
int G = miG.isSelected() ? 255:0;
int B = miB.isSelected() ? 255:0;

color = new Color(R,G,B);
repaint();

}

public void paintComponent(Graphics g) {
super.paintComponent(g);

// 幅、高さ
int height = g.getClipBounds().height;
int width = g.getClipBounds().width;

// 塗潰し
g.setColor(color);
g.fillRect(0, 0, width, height);
}
}

まだ途中なので、現時点では不必要なimport文があります。
よろしくお願いします。

学校の授業でjavaの課題が出たのですが、

javakadai.java:41: ここにインタフェースが必要です。
class javakadaiPanel extends JPanel implements ActionListener,ActionEvent{

というエラーが出て困っています。
どなたか解決方法を教えてくれませんか?

ソースは以下です。
よろしくお願いします。

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing...続きを読む

Aベストアンサー

class JavaKadaiPanel extends JPanel implements ActionListener,ActionEvent{

class JavaKadaiPanel extends JPanel implements ActionListener{

Qハードウェアでスタック構造をサポート2

(c)一般的なアーキテクチャではハードウェアでスタック構造をサポートしているものが多いが、その機構を説明せよ。

スタック操作という手法がある。スタック操作は,スタック・ポインタで操作するアドレスを保持し,スタックへ書き込み(押し込み)したデータ数だけポインタ値を調整する手法のこと.スタックへのデータ格納命令(PUSH,CALLなど)を実行すると,スタック・ポインタが保持するアドレスは格納データ数だけ若くなり,逆にデータ取り出し命令(POP,RETなど)を実行するとそのデータ数だけポインタ値は大きくなる。



(d)前問で説明したストック構造の代表的な使い方を説明せよ。
アドレス修飾レジスタの中でスタックポインタ(SP)を持つものがある。スタックポインタはアドレスレジスタの一種で、コールスタックの先頭を指すポインタレジスタである。これが示すアドレスの内容を読み出すと同時にアドレスを増やす、逆に、示すアドレスに書き込むと同時にアドレスを減らす、といった動作を行えるものが多い。


というふうにまとめてみました。ご確認お願い致します。
 

Aベストアンサー

#2です。

質問者さん色々考えてらっしゃるので、「私ならどう答えるか」を参考までに書いてみます。

c) スタック構造とは主として先入れ・後出しの機能を備えたデータ構造であり、データ列の途中にデータを挿入したり、データ列の任意の場所にあるデータを削除したり、あるいはデータ列を分岐させたりといった機能は通常想定されていない。このため一般的に、ハードウェア上でスタック構造をサポートする場合には、連続したメモリ空間に格納されたデータ群をスタックに格納されたデータ列とみなし、最も最近格納された場所に対応するアドレスを格納するレジスタを用いて、スタック構造に対しプッシュする場合にはそのレジスタの値を1ワード分「後ろ」にずらしてからその場所へ書き込み、ポップする場合にはその逆に、そのレジスタの値を目印に格納されたデータを読み取って、その後レジスタの値を1ワード分「前」にずらす、という処理を行う場合が多い。ただし、ここで言う「後ろ」や「前」は必ずしもメモリ上の実際のアドレスの後ろ及び前を意味するとは限らず、むしろ「後ろ」にずらす場合には減算し、「前」にずらす場合には加算するという処理を行う方が一般的である。

d) ハードウェア実装されたスタック構造の代表的な使われ方としては、(1) 現在の演算系レジスタ等の状態を保存し、復帰する為の一時的な記憶領域として用いる、(2) 「関数」又は「サブルーチン」と呼ばれる考え方を用いてプログラミングを行う場合に、サブルーチンから「復帰」した次の瞬間に実行すべき命令がどのアドレスから始まっているかを一時的に記録しておく領域として用いる、(3) 高水準言語で、一時変数等の現在の環境を作成し、保存し、及び復帰する為の一時的な記憶領域として用いる、等が挙げられる。

#2です。

質問者さん色々考えてらっしゃるので、「私ならどう答えるか」を参考までに書いてみます。

c) スタック構造とは主として先入れ・後出しの機能を備えたデータ構造であり、データ列の途中にデータを挿入したり、データ列の任意の場所にあるデータを削除したり、あるいはデータ列を分岐させたりといった機能は通常想定されていない。このため一般的に、ハードウェア上でスタック構造をサポートする場合には、連続したメモリ空間に格納されたデータ群をスタックに格納されたデータ列とみなし、最も最近格納...続きを読む

QJAVAコンパイルと実行

はじめまして。質問があります。

eclipseで開発したjavaのソースを実行するとき、メニューからメインクラスを指定し実行するだけでプログラム実行されますが、そのプログラムをコマンドプロンプトで実行する場合、できるプログラムとできないプログラム(例外:NoClassDefFoundError)があります。

コンパイルはeclipceのほうで勝手に.classファイルが生成されるので、そのclassファイルをjava [ファイル名]と打つだけだと思います。

実行できるプログラムとできないプログラムの違いは以下の通りです。

・実行できるプログラム
eclipseで新規でプロジェクトを作成。その直下にソースが存在し、クラスファイルも同じディレクトリに生成されます。

・実行できないプログラム
eclipseで新規でプロジェクトを作成。ソースフォルダ(src)を作成し、その下からパッケージ、クラスを作成しました。そうすると、エクスプローラでそのプロジェクトを見ると、binフォルダが生成されていました。その中にクラスファイルが生成されます。

違いはこのような感じです。実行できないプログラムをコマンドプロンプトで実行させるためにはどうしたらよいでしょうか?eclipseの使い方はだいぶわかってきたのですが、どのように動作しているか(java自体も)がわかりません。ご教授宜しくお願い致します。

OS:windows2000
開発環境:eclipse 3.0(J2SE 1.4.2_03)

はじめまして。質問があります。

eclipseで開発したjavaのソースを実行するとき、メニューからメインクラスを指定し実行するだけでプログラム実行されますが、そのプログラムをコマンドプロンプトで実行する場合、できるプログラムとできないプログラム(例外:NoClassDefFoundError)があります。

コンパイルはeclipceのほうで勝手に.classファイルが生成されるので、そのclassファイルをjava [ファイル名]と打つだけだと思います。

実行できるプログラムとできないプログラムの違いは以下の通りです。
...続きを読む

Aベストアンサー

eclipse使いではないので詳細は分かりませんが,eclipseのヘルプからeclipseコミュニティなどのサイトにアクセスしてみてはいかがですか?

もしくは”eclipse”でネット検索してみるとご希望のサイトが見つかるかもしれません。

Qスタック接続って何ですか?

HUBのカタログを見ていて分からなかったのですが、
スタック用とかスタック接続って何ですか?マスター用とかも
ありましたが、何が何なのか分かりません。
1.スタック接続について
2.スタック用、マスター用の違いについて
ついでに、
3.SNMPについて
以上、お教え下さい。

Aベストアンサー

下記で確認して下さい。

参考URL:http://www5a.biglobe.ne.jp/~insquare/yougo/kaisetu/h_05.html

Q明示的にコンパイルしてから実行するには

java eclipse3.5を使ってプログラミングの勉強をしています。

ThreadMain.javaというプログラムを動かすのにEchoProtocolFactoryと
ThreadPerDispatcher.javaとPoolDispatcher.javaを明示的にコンパイ
ルする必要があるのです。あるサイトを見たら、【プロジェクト】ー>【すべて再ビルド】を
選択すればよいとかかれていたのでやってみたのですが、次のようなエラーが出てしまいます。

Exception in thread "main" java.lang.ClassNotFoundException: EchoProtocolFactory

これらのクラスが書かれたソースファイルはすべて同じsocket.110というパッケージに入っています。

このエラーを取り除くには、どうすればよいのでしょうか?
分かる方お願いします。

ThreadMain.javaを載せますので、アドバイスお願いします。
package socket_110;



import java.net.*; // ServerSocket
import java.io.*; // IOException


public class ThreadMain {



public static void main(String[] args) throws Exception {



if (args.length != 3) //

throw new IllegalArgumentException("Parameter(s): [<Optional properties>]"

+ " <Port> <Protocol> <Dispatcher>");



int servPort = Integer.parseInt(args[0]); //

String protocolName = args[1]; //

String dispatcherName = args[2]; //



ServerSocket servSock = new ServerSocket(servPort);

Logger logger = new ConsoleLogger(); //



ProtocolFactory protoFactory = (ProtocolFactory) //

Class.forName(protocolName + "ProtocolFactory").newInstance();



Dispatcher dispatcher = (Dispatcher) //

Class.forName(dispatcherName + "Dispatcher").newInstance();



dispatcher.startDispatching(servSock, logger, protoFactory);

}

}

java eclipse3.5を使ってプログラミングの勉強をしています。

ThreadMain.javaというプログラムを動かすのにEchoProtocolFactoryと
ThreadPerDispatcher.javaとPoolDispatcher.javaを明示的にコンパイ
ルする必要があるのです。あるサイトを見たら、【プロジェクト】ー>【すべて再ビルド】を
選択すればよいとかかれていたのでやってみたのですが、次のようなエラーが出てしまいます。

Exception in thread "main" java.lang.ClassNotFoundException: EchoProtocolFactory

これらのクラスが書かれた...続きを読む

Aベストアンサー

細かい確認ですが、

> ThreadMain.javaというプログラムを動かすのにEchoProtocolFactoryと
ThreadPerDispatcher.javaとPoolDispatcher.javaを明示的にコンパイ
ルする必要があるのです。

エラーに出ているEchoProtocolFactoryだけ拡張子がないですが、ソースファイルではない、ということでしょうか? それともこれがファイル名そのものなんですか?
ファイル名に拡張子がついてない、というオチだったりしないでしょうか。

Qスタックを用いたプログラム

http://okwave.jp/qa4433705.html
先日教えて戴いた事でスタックがどういったものなのかは
わかりましたが、実際にプログラムを作ってみると、
なかなかうまくいけません。再びアドバイスを戴ければと思ってます。

<プログラムの仕様>
入力数値をスタックに格納し'a'が入力されたら、
スタックに格納されている数値を全て取り出し、
平均値を出力するプログラム

・スタックは、push()関数およびpop()関数を実装する
・スタックへの要素の追加はpush()関数で行う
・スタックからの要素の取出はpop()関数で行う
・スタックのサイズは任意とする
int push(int push_data);
 引数: スタックに追加するデータ
 戻り値: 成功の場合1、失敗の場合0を返す
int pop(int *pop_data);
 引数: スタックから取り出した値を格納するポインタ
 戻り値: 成功の場合1、失敗の場合0を返す

いざ、自分で作ってみると、
仕様通りには全く作れず、結局main関数ですべてを作って
しまうことになってしまいます・・

http://okwave.jp/qa4433705.html
先日教えて戴いた事でスタックがどういったものなのかは
わかりましたが、実際にプログラムを作ってみると、
なかなかうまくいけません。再びアドバイスを戴ければと思ってます。

<プログラムの仕様>
入力数値をスタックに格納し'a'が入力されたら、
スタックに格納されている数値を全て取り出し、
平均値を出力するプログラム

・スタックは、push()関数およびpop()関数を実装する
・スタックへの要素の追加はpush()関数で行う
・スタックからの要素の取出はpop(...続きを読む

Aベストアンサー

サンプルです。
コメントが少ないですが、見ればわかると思います。
#include <stdio.h>
#defineSTACK_MAX(100)//100個のスタック
intstack[STACK_MAX];
intstack_ctr = 0;//スタックカウンター
//1:成功 0:失敗
int push(int push_data)
{
if (stack_ctr >= STACK_MAX) return 0;
stack[stack_ctr] = push_data;
stack_ctr++:
return 1;
}
int pop(int *pop_data)
{
if (stack_ctr == 0) return 0;
stack_ctr--;
*pop_data = stack[stack_ctr];
return 1;
}
int main()
{
intdata;
ret = push(25);
printf("ret=%d\n");
ret = push(251);
printf("ret=%d\n");
ret = push(2512);
printf("ret=%d\n");
ret = pop(&data);
printf("ret=%d data=%d\n");
ret = pop(&data);
printf("ret=%d data=%d\n");
ret = pop(&data);
printf("ret=%d data=%d\n");
ret = pop(&data);
printf("ret=%d data=%d\n");
return 0;
}

サンプルです。
コメントが少ないですが、見ればわかると思います。
#include <stdio.h>
#defineSTACK_MAX(100)//100個のスタック
intstack[STACK_MAX];
intstack_ctr = 0;//スタックカウンター
//1:成功 0:失敗
int push(int push_data)
{
if (stack_ctr >= STACK_MAX) return 0;
stack[stack_ctr] = push_data;
stack_ctr++:
return 1;
}
int pop(int *pop_data)
{
if (stack_ctr == 0) return 0;
stack_ctr--;
*pop_data = stack[stack_ctr];
return 1;
}
int main()
{
intdata;
ret =...続きを読む

QEclipseがコンパイル、および実行時に吐くコマンドについて

Eclipseがコンパイル、および実行時に吐くコマンドについて

JAVA初心者です。

JAVAのプログラムを作成した際、

$javac hoge.java
$java hoge

等とすると思います。

ここで質問なのですが、

###############  質問  #################

Eclipseで実行のボタンをおしてJAVAプログラムをコンパイル、実行した場合に、Eclipseが吐くコマンドを確認するためにはどのようにすればよろしいでしょうか?

######################################

というのも、http://oshiete.goo.ne.jp/qa/5928481.htmlで質問させていただいたことについて、Eclipseだとうまく実行できたので、Eclipseが吐くコマンドが確認できれば「自分の打ち込んだコマンドのどこが誤っていたのか」を知るヒントになると考えたからです。

どなたか方法をご教授頂けないでしょうか。よろしくお願いします。

Aベストアンサー

質問そのものへの回答ではないが、あちらが締められたのでこちらで補足。
前の質問の例であれば、
java -classpath twitter/twitter4j.jar:. Application
でtwitter4j.jarとカレントディレクトリ(/now)下のApplication.class等へのクラスパスが通ると思う。
linux系の場合は必要なパスを:で区切って-classpathまたは-cpで渡せばよい。

Qスタック

乗用車2台分のスタックを搭載
始動時にスタックに...二次バッテリーが必要

などのスタックとは何のことでしょうか
調べてもわかりません。

Aベストアンサー

全文がないので2つ考えられます。

燃料電池車の場合は『stack』、1個のセルを『積層』という形で
直列接続するといった意味。

NO1の方のトヨタのリンクをみますと、この場合は『積層』の意味でしょう。

もうひとつは
複数のバッテリを『並列』にする場合です。

電気関係では同じアンテナを並列にするのをスタックっていいますが
その時々で造語もでてきますので、かなり異訳しないとわからなくなります。

電子部品でも『スタック型積層コンデンサ』なるものがあります。
積層した1個の部品を2個並列にしたものです。
リンクの通り、原理図を見ないとわからない品名になっていると思います。
http://www.maruwa-g.com/products/information/electronic_parts/000113.html

車でもstuckになると全く意味が違ってきます。

Qコマンドプロンプトでは、コンパイル実行できるのに、Eclipseではエラーが出ている。

javaを学習している者です。

「鉛筆パズルゲームプログラミング」という本で勉強しているのですが、その本のコードがコマンドプロンプト上で、与えられてたバッチファイルを実行すると、うまく実行できるのですが、今まで使っていたAll in one Eclipse3.1にソースコードをインポートするとエラーが出てしまいます。

なぜこうなってしまうのか、もし分かる方がいたら、よろしくお願いします。

Aベストアンサー

バッチファイルの中身を確認してみましょう。
ただ指定したソースコードファイルをコンパイルしているだけでなく、例えばクラスパスなどの環境変数を独自に設定しているなどの操作を行っているのかもしれません。だとすると、同じようにEclipseのプロジェクトにも設定する必要があります。

また、初歩的なことですが、ソースコードファイルの保管場所を間違えている(パッケージのディレクトリを正確に指定していない、など)というケアレスミスの可能性も再度確認してみては。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング