お願いします。
fortran全くの初心者です。
今、他人が作ったプログラムに苦戦中です(ーー;)
どなたか助けてください。。

プログラムをコンパイル後、実行すると以下のメッセージが返ってきます。

exec(2):insufficient swap or memory available

そこで、以下のプログラムの一部を修正することで回避できました。

parameter
# (nxdm=10,nydm=5,nzdm=5,ipdim=4
# ,nxd6=nxdm+6,nyd6=nydm+6,nzd6=nzdm+6
# ,nvcdim=6*ipdim+4,iatdim=1
# ,nhfdim=nvcdim*(nvcdim+1)/2+3)

プログラム中のnxdm nydm nzdmの値を小さくすることで回避できました。
なんとなくの修正で回避していますが、メッセージとの関係がわかりません。
どこかを見たりすると定義する数字の限度とかわかるのでしょうか?

ほんの一部なのでわかりずらいと思いますが、こういうことがありえる!って
程度でもいいので教えてください。
お願いします。

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

配列 FORTRAN」に関するQ&A: fortran 配列実行結果

A 回答 (4件)

OSや処理系は何をお使いでしょうか?


私の数少ない経験では、大型計算機やワークステーションはメモリ管理がしっかりしているので、実行するたびにエラーメッセージが変わるというようなことは起きにくいのですが、RUN/FORTRANのような教育環境で使われるパソコン用の処理系ですと、少し大きなプログラムを作るとすぐにメモリを食い尽くしたり、プログラムを終了してもメモリリーク(メモリをつかんだまま解放しないこと)が発生したり、モニタモードなんてものがあったりして、初心者の場合、実行環境が裏で動いているにもかかわらず、それを知らずに新たにモニタを起動してしまったりしてメモリを食い尽くすことはあります。OSがWindowsなら、その可能性は大きいです。
こういうことは、あまりあってはいけないことなのですが、出来の悪いソフトを動かすと遭遇します。残念ながら。
    • good
    • 0

配列が(dimension文で)大きくとってあるのです。


コンパイル時は正常に済んでも、実行時に、他のウィンドウで別のプログラムが動作しているとかで、メモリ不足になったりならなかったりするのです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2001/11/26 11:56

たぶん、3次元配列を処理しているのだと思うのですが、そういうのは、メモリを大量に消費します。

エラーメッセージは、単にメモリが足りないということを意味しているので、配列を少なくすることでエラーを回避できるのは、道理にかなっていると思います。
ちなみに、使えるメモリの量というものは、OSやコンパイラに依存するものなので、ソースだけではなんともいえません。はい。

この回答への補足

ありがとうございます。

もうちょっと教えていただけますか?
初めの実行で正常に実行できて、実行を繰り返すたびに
配列を少なくしないと実行が出来なくなってしまう。
実行のたびに使えるメモリ数が減ってしまうというのも
普通のことなのでしょうか?

お願いします。

補足日時:2001/11/21 09:28
    • good
    • 0

確認していないのでわかりませんが,parameter文のなかで割り算は使えないのではないでしょうか?


つまり
nhfdim=nvcdim*(nvcdim+1)/2+3
の部分を変更すれば動くと思うのですが・・・.
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみます。

お礼日時:2001/11/21 13:13

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

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

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

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

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

Qメモリに余裕があるのにヒープが確保できないです。

趣味のプログラムなので切実な問題ではないのですが、
1秒間隔に処理を行うプロセスを-Xmx64Mの指定で6つ起動しようとするのですが、
6つ目でヒープが確保できなくて処理が走りません。
スレッドは1プロセスあたり15くらいです。
OSはWindowsXPでCPUはPentium Dual-core E2140で
メモリは2GBつんでいるのですが、
タスクマネージャでみると1GB強しかつかってません。
できれば6つ同時に走らせたいのですが、方法はありますでしょうか?

Aベストアンサー

ヒープエリアはたしか全プロセスで共通に使われるはずです。
-Xmx64M を -Xmx128M 等に変更して動かしてみて下さい。

Q${parameter:-word} と ${parameter:=word} の違い

bashのパラメータ展開で

${parameter:-word} と ${parameter:=word}

の違いが何なのかよく分らないのですが、何が違うのでしょうか?

http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html

Aベストアンサー

 :-の方は、parameterの値が変わりません。:=は変わります。どちらもparameterに既に値が入っている場合は何も起こりません。
 別の言い方をすると、:=の方はこの後bashが(子プロセスとして)起動するプロセスの環境変数にも$parameterがwordになりますし、:-はなりません。:=は何らかのプログラムを起動するスクリプト内で空っぽならデフォルト値を設定するというような用途に使用します。
 以下、bashですけど$が出てきまくると紛らわしいのでプロンプトを%とします。

% echo ${SAMURAI:=LAST}
LAST
% echo ${DORA:-YAKI}
YAKI
% echo $SAMURAI
LAST ←さっきのでSAMURAIにLASTが代入された
% echo $DORA
   ←さっきのでDORAにYAKIが代入されていない
%

QC/C++言語のメモリについて

C言語でメモリを2種類?に分けると、スタックとヒープがあります。
ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。
そのスタックは通常、何バイトまで可能なのでしょうか?

あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、
どこに作られるのでしょうか?

私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか?
また、一番多くメモリを確保できるなら、OSはなんでも構いません。

解釈等も間違っていたらご指摘していただきたいです。

Aベストアンサー

マイコン向けのプログラムを書いてます、Interestと申します。

> C言語でメモリを2種類?に分けると、スタックとヒープがあります。

間違いではありませんが、ちょっと足りません。プログラムで使用するメモリはもう少し細かく見ると、次のようになっています。

(P) 実行される命令(ProgramとかCodeと呼ばれます)
(C) 定数など変更されないデータ
(D) 初期化されるデータ
(B) 初期化されないデータ
(H) プログラムから動的に割り当てられるメモリプール(これがヒープです)
(S) ローカル変数、関数の引数、呼び出し元関数へのリンクに使用する比較的短命なものに使用するメモリプール(これがスタックです)

> そのスタックは通常、何バイトまで可能なのでしょうか?

開発環境によって初期値が決まっているようで、どれだけ割り当てるか変更できるようです。OSには依存しません。Visual C++ 6.0の場合、スタックサイズの初期値は1MBだそうです。
参考 http://okwave.jp/qa2645032.html

> あと関数外のファイルの先頭に int[1000000];とした場合、
> このメモリはmallocで確保していませんが、どこに作られる
> のでしょうか?

最初に説明した内容に照らすと、一般に外部変数は0で初期化されますから、(D) 初期化されるデータ の領域に確保されることがわかります。

> 私のパソコンはメモリが2GBでWindows2000ですが

WindowsなどのOSは物理メモリが足りなければハードディスク上の仮想メモリも使用しますので、単純に何バイトまで使えます、とはお答えできません。

> 一番多くメモリを確保できるなら、OSはなんでも構いません。

どのようなプログラムを組もうとしているのですか?

マイコン向けのプログラムを書いてます、Interestと申します。

> C言語でメモリを2種類?に分けると、スタックとヒープがあります。

間違いではありませんが、ちょっと足りません。プログラムで使用するメモリはもう少し細かく見ると、次のようになっています。

(P) 実行される命令(ProgramとかCodeと呼ばれます)
(C) 定数など変更されないデータ
(D) 初期化されるデータ
(B) 初期化されないデータ
(H) プログラムから動的に割り当てられるメモリプール(これがヒープです)
(S) ローカル変数、関...続きを読む

QVBAのプログラムで、DIAG = 1# / A(L, L) や R(

VBAのプログラムで、DIAG = 1# / A(L, L) や R(I) = 0# の数字1、0の後についている番号記号#は何を意味しているものでしょうか?

http://www.index-press.co.jp/books/excel/excel-04.pdf

の記事内にあるプログラムで使用されていますが、解説がありません。
調べてみましたがシャープと読まないことぐらいしかわかりませんでした。

どうぞよろしくお願いします。

Aベストアンサー

Pdf拝見しました。
凄く読みづらいプログラムで、どうにか修正したい欲に
かられるわけですが。

ここでいう♯記号などは、「リテラル」というもので型を
暗黙に示すもので、#はDouble型を示すものだと思います。

言語が違いますが仕様が似てますので参考まで。
3-1 変数と定数
 http://msdn.microsoft.com/ja-jp/library/dd314343.aspx
 …真ん中のほう:
 …VB .NET はリテラルのデータ型に応じて、以下のような表記をします(表 3-2)。
 …の明示的な記述方法の列

1♯ はDouble型の1ということになります。
基本的に、Dim i as Double と宣言すれば i はDouble型に決まって
いますので♯は要りませんが。

稀に Dim i as Variant(何でも型)と宣言したとき、i=1#とすると
Double型として明示代入ができます。
とはいえ、変数の中身が訳がわからなくなるので、こんな書き方は
通常はしません。
プログラム文中を判りやすく見せているだけだと思います。


とはいえ、このプログラムは読みづらいです。
変数、配列のインデクサ、ループカウンタなど殆どが英字2文字以下の
意味のない単語変数なので、可読性のよいプログラムクォリティとしては
よろしくないと思います。

Pdf拝見しました。
凄く読みづらいプログラムで、どうにか修正したい欲に
かられるわけですが。

ここでいう♯記号などは、「リテラル」というもので型を
暗黙に示すもので、#はDouble型を示すものだと思います。

言語が違いますが仕様が似てますので参考まで。
3-1 変数と定数
 http://msdn.microsoft.com/ja-jp/library/dd314343.aspx
 …真ん中のほう:
 …VB .NET はリテラルのデータ型に応じて、以下のような表記をします(表 3-2)。
 …の明示的な記述方法の列

1♯ はDouble型の1ということになります。...続きを読む

Qヒープ領域の限界値設定

大量にメモリを消費するアプリケーションを下記環境で動作させようとしています。
WindowsXP SP2, 1GB RAM
タスクマネージャの物理メモリの利用可能 674,500K位
この状態でヒープ領域をレジストリで変更しようと思っているのですが
限界値が不明です。
徐々に3071⇒4096⇒8192と上げていっているのですが、限界値を超してしまうとOS自体が起動できなくなる恐れがあるので怖いです。
アドバイスください。

Aベストアンサー

回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。

また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。

ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。


「mallocが使用するヒープ領域」がどこから来るのかは、コンパイルに使用した言語環境のライブラリ関数mallocの動作内容に依存します。

仮にMicrosoft Visual C++(VC++ Version 6.0以降)を使用してコンパイルし、ライブラリ関数は標準添付のものを使用したとすると、mallocはWindows APIのHeapAllocで取得したメモリ領域をライブラリ内で細分(サブアロケート)して返します。またこの場合、HeapAllocで取得できるメモリ領域の量に固定の上限はなく、PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限り、いくらでもHeapAllocはメモリを割り当てて返すことができます。

ですので上記の場合、mallocも同様に「PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限りいくらでも」メモリを割り当てて返すことができます。

なお、上記動作はライブラリのソースコードを見て確認したものですので、使用しているコンパイラがVC++ではない、あるいはVC++でもVersion 6.0より古い場合、mallocが「いくらでもメモリを割り当てて返すことができる」かどうかは分かりません。(しかし、返すメモリ領域が「デスクトップ ヒープ」と違うものであることだけは変わりません。)

回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。

また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。

ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。


「mal...続きを読む

Q変数使わない場合の言語プログラムとかエクセルで、=三+三は6とはでません。

「プログラム言語」では1 2 3 の数字は他の「文字・文字列」とは違い計算ができます。
しかし、「文字・文字列」は変数を与えない限り、計算はできません!

 数字はリテラルだからできる・・リテラルの意味がいまいちわかりません!
そんな特徴のことをリテラルというのでしょうか?
 よろしくお願いします。

Aベストアンサー

こんにちは。

リテラルというのは、変数を使わないで直接書き入れることを言います。
プログラミングでは、

「リテラルとは、コード中に、表現が定数として直接現れており、記号やリストで表現することができないものを指します。
  数値リテラルの例:  10(Integer型)
  文字列リテラルの例: "こんにちは。"
 
リテラルの使用は、コードの可読性・保守性を下げてしまいます。これを防ぐためには、定数を使用するようにしてください。
(出典『超図解 VB.NET ルールブック』エクスメディア)

プロクラミングでは、ちょい書きプログラム以外は、リテラルは基本的には、禁止なんだと覚えておけばよいと思うのです。そのことだけを頭に入れていればよいのですが、そういうことをごちゃ混ぜにしてしまうと、何かよいのか分からなくなってしまいます。

>数字はリテラルだからできる
うーん、そういう限定した意味ではないと思うのですが。'literal' コンピュータ用語では、直定数というものの、直に書くことだと思います。

それをまかり通していくと、データ型は、数値のままになっていくと思うのです。それが思わぬ結果にならないとも限らないような気がしているのです。なぜかというと、コンピュータは、2進ですから、数値がどこかで丸められている可能性もないとは言えません。

もちろん、文字を入れる時は、直にはなっても、入れる場所は決められていますから、やたらに入れることはありません。しかし、例えば、URLやFull Path ファイル名などは、直ではなく、変数を取って書くことが多いはずです。

こんにちは。

リテラルというのは、変数を使わないで直接書き入れることを言います。
プログラミングでは、

「リテラルとは、コード中に、表現が定数として直接現れており、記号やリストで表現することができないものを指します。
  数値リテラルの例:  10(Integer型)
  文字列リテラルの例: "こんにちは。"
 
リテラルの使用は、コードの可読性・保守性を下げてしまいます。これを防ぐためには、定数を使用するようにしてください。
(出典『超図解 VB.NET ルールブック』エクスメディア)

プロクラ...続きを読む

Qメモリをたくさん使うテストプログラム

Linuxで、メモリをたくさん使うようなテストプログラムを作りたいのです。
メモリといっても、プログラムコードの入っているテキスト領域、データの入っているデータ領域、ヒープ領域などがあると思いますが、
これらのいずれかのみをたくさん使うようなプログラムを作りたいのです。
例えば、サイズの大きなプログラムであれば、テキスト領域が大きくなったり、
大容量の文字列を扱ったりすると、データ領域が大きくなったりするんでしょうか?
関数とメモリ使用量の関係があまり分かっていません。
どうか教えてください。

Aベストアンサー

#1です。
>テキスト領域を大量に確保するには、無駄に長いプログラムを書けばいいのでしょうか?
はい、その通りです。
>mallocした領域にデータを書き込むと、今度はデータ領域がたくさん使われるのでしょうか?
いいえ、mallocした領域は、ヒープ領域であり、ヒープ領域にデータを書き込んだからといって、データ領域が増える訳ではありません。

コーディングでは、以下のようになります。
-----------------
#include ....ヘッダファイル
char data1[256];  ・・・・データ領域
main()
{
data data2[256];  ・・・・スタック領域
if (・・・){    ・・・・テキスト領域
・・・
}
malloc(3000)    ・・・ヒープ領域へ確保
}

main等の関数の外側で確保した領域は、データ領域に取られます。
main等の関数の内側で確保した領域は、スタック領域に取られます。(static指定を除く)
実際に命令(if文など)は、テキスト領域にとられます。
mallocで確保したメモリはヒープ領域に取られます。
(但し、テキスト領域の言葉は正しいかどうか不明です。参考URLを参照下さい)
ところで、どうして、メモリをたくさん使うようなテストプログラムを作りたいのですか、よかったら教えて下さい。そのほうに興味があります。

参考URL:http://www1.cts.ne.jp/~clab/hsample/Point/Point19.html

#1です。
>テキスト領域を大量に確保するには、無駄に長いプログラムを書けばいいのでしょうか?
はい、その通りです。
>mallocした領域にデータを書き込むと、今度はデータ領域がたくさん使われるのでしょうか?
いいえ、mallocした領域は、ヒープ領域であり、ヒープ領域にデータを書き込んだからといって、データ領域が増える訳ではありません。

コーディングでは、以下のようになります。
-----------------
#include ....ヘッダファイル
char data1[256];  ・・・・データ領域
main()
{
data...続きを読む

QVB6, VB2005,VC# どれを学習したらよいでしょうか。

VB6, VB2005,VC# どれを学習したらよいでしょうか。
やりたいことはデータベースやテキストファイル処理、インターネットコネクションのプログラミングです。

仕事でExcelVBAを時々使うので、以前から持っているVB6かと思ったのですが、なぜかMSDNがなくリファレンスがなく微妙です。本かウェブしか頼れない・・・。
ある程度の処理速度を求めていますのでExcelVBAではない方がいいのですが、これからのことを考えたらVB6よりもVB2005でしょうか?
それともどうせVB2005はexcelとは大幅に文法が変わってしまうのだからC#?
いろいろ調べるほどわからなくなってしまいました。
なおエクセルVBAも本に一通り書いてあることも満足にできない程度です・・・。(こちらにも役立てられるとさらにうれしいです)

Aベストアンサー

process9です。
>仕事上でVBAのマクロを書く機会がたまに(1週あたり50行ぐらい?)あるので、仕事面との相乗効果という観点からVB6との比較ではC#はどうでしょうか。

やりたいことが仕事に関係があるかどうかだと思います。
関係がある場合、仕事上での使用でVBAを使うとのことでしたので、VB6を私は押します。学習スピード、使用マシンのスペック、周りの方の環境などで当面作れればよいと思われますし、使える人が多数いるのでこういうQAでもレスポンスなどが早いし、正確。リファレンス自体はWEBで十分だと思われます。周りと自身の仕事環境が変化(バージョンUPなど)したときにVC#などに乗り換えた方が効率がよいかと思います。

仕事に関係ない(趣味で作成する)ということであれば、将来性、言語としての完成度からVC#をお勧めします。ただ、.NET系はまだ発展途上なので、動作の安定性、配布性に問題があります。でも、クライアントプログラムの世界では、将来的に(3~5年後くらい?)には標準の開発言語になりうると思われます。

Qjava string 配列の使用メモリ

String[][][] arg = = new String[x][x][x];
でxが638の時にjava.lang.OutOfMemoryErrorになってしまいます。
VM起動時のヒープ最大値は1GBまで試しましたがダメでした。

このときargオブジェクトはどれだけのメモリを必要とするのでしょうか?

Aベストアンサー

このnewで作られるオブジェクトは、配列オブジェクトだけです。Stringオブジェクト自体は作られません。
なので、オブジェクトのサイズとしては、配列オブジェクトのサイズだけを考えればよいことになります。
(ちなみに、メソッド本体はクラスに1つあるだけで、作成したオブジェクトの数だけできるわけではないですから、オブジェクトを作ると、新たにメソッドの分のメモリが必要になるわけではありません)

さて、argオブジェクトのサイズですが、1つのオブジェクトへの参照を保持するのにまず何バイトが必要か考える必要があります。
32bitのJavaだったら、たぶん32bit=4バイトでしょう。
この配列の要素数はx^3個ですので、1つあたりが4バイトとなると、x^3 * 4 バイトのメモリが最低限必要ということになります。
もちろん、他にも多少メモリが必要でしょうが、xが大きいときのことを考えるわけですし、無視しても問題ないでしょう。

x=638の場合を計算してみると、638^3 * 4 = 1038776288 となります。
これは約990MB で、だいたい1GBです。
ヒープの最大値を1GBで試したということですので、計算と合っているのではないでしょうか。

このnewで作られるオブジェクトは、配列オブジェクトだけです。Stringオブジェクト自体は作られません。
なので、オブジェクトのサイズとしては、配列オブジェクトのサイズだけを考えればよいことになります。
(ちなみに、メソッド本体はクラスに1つあるだけで、作成したオブジェクトの数だけできるわけではないですから、オブジェクトを作ると、新たにメソッドの分のメモリが必要になるわけではありません)

さて、argオブジェクトのサイズですが、1つのオブジェクトへの参照を保持するのにまず何バイト...続きを読む

QC#のプログラムで作業フォルダを取得できない (IIS5.1+.NET

C#のプログラムで作業フォルダを取得できない (IIS5.1+.NET 2005)

IIS5.1のサイトで、C#で作ったプログラムを実行します。
プログラムは同じフォルダーにあるiniファイルを読み込んで作業します。
問題は、正しい作業フォルダーを取得できないとのことです。
下記のメソッドの戻り値は「c:\windows\system32」になっています。
Directory.GetCurrentDirectory()
Environment.CurrentDirectory
しかし、それはEXEファイルのフォルダーではないです。
どうやって本当の作業フォルダーを取れますか?

ちなみに、当サイトでvb6で作ったプログラムもあります。
そちらは「App.Path」で本当の作業フォルダーを取れます。

Aベストアンサー

string path = System.Reflection.Assembly.GetEntryAssembly().Location;

これではだめでしょうか?


人気Q&Aランキング