
OpenCOBOL1.1で巨大なテーブルを記述すると
TEST0000.cob:6: Error: Size of 'AA' exceed maximum '2147483647'
とエラーを吐きますが、これを回避する方法はありますでしょうか?
gfortranでは問題無く動いているものを、COBOLに移植しようとして困っています。
要するに、64bit BINARY の10**9個=8GBのテーブルを作りたいだけなのですが‥‥
回避できるオプションはありますでしょうか?
環境は、Windows 10 v.1909 64bit WSL上です。メモリは32GBなので十分あります。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
OpenCOBOLのマニュアルの場所を知らないので、エラーメッセージからの想像ですが、
・配列の添え字の上限が 4バイト符号付整数の上限 2**31-1
・1つの変数のサイズ上限が 2GB
のどちらかだと思います。前者なら(2**31-1, 4)の2次元配列にして、本来の添え字を4で割った商と余りに分割して、それぞれを添え字に使ってアクセスする。
後者だと面倒ですが、4つの2GBの配列を作って、本来の添え字を4で割った商と余りに分割して、余りをIFで判断してそれぞれに対応する配列のどれかをアクセスする。javascript:void 0;
全変数のサイズ合計値の上限があったりすると、もうどうしようもないので、ファイルにするしかないですね。
メモリは十分あるので、RAMDISKを作って、そこにそのファイルを置くのでしょうか。
エラトステネスの篩で10^nまでの素数を求めるプログラムを
Pythonの内包表現で書いていました。
例えば、64bitの一次元配列を並べて左からビット毎に
オン/オフして素数か否かを表現してます。
32bitや64bitどちらでも動くようにしてます。
def p(n):
def f(k):l[k//b]^=1<<a(k)
g=lambda k:l[k//b]&1<<a(k)
a=lambda k:b-k%b-1
m=lambda n:int(n**0.5)+1
b=[32,64][sys.maxsize>2**32]
t0=tm.time()
l=ar.array(["L","Q"][b>32])
E,R,c=eval,range,"5"*(b//4-1)
d=[E("0x3"+c),E("0x5"+c)]
{l.append(d[i>0])for i in R(n//b+1)}
{f(j)for i in R(3,m(n))if g(i)for j in R(i+i,n+1,i)if g(j)}
t1=tm.time()
p=[i for i in R(2,n+1)if g(i)]
return"10**"+str(int(ma.log10(n))),str(int(t1-t0))+"sec",len(p),p[:10]+["...",p[-1]]
これをFortran95に書き直すと、10^8でPython3は88秒、
gfortranで1秒と圧倒的な差が出ます。
そこで、COBOLではどうなるかと思って移植を始めた次第
です。
確かに、ご指摘通り分割すれば良いことは分かりますが、
そう言う解じゃ無くて、64bit版の対応の仕方をお訊ね
してる訳です。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
LGノートPCグラムについて
-
構造体から平均点を求める方法
-
C言語 配列の再初期化
-
C++ CString の 配列
-
銀行ATMの数字キーの配列
-
差分法でのメッシュ分割
-
【速いブラインドタッチ】手を...
-
C言語初心者 ポインタについて...
-
intel fortranコンパイラについて
-
2次元配列を戻り値とする関数?
-
C言語 変換指定%sについてです。
-
defineを使った配列
-
配列を使わずに、変数名を動的...
-
C言語 少しの疑問
-
関数から配列を返すには?
-
c言語
-
C++DLLからC#へのコールバック...
-
データ数が多い場合のソート
-
CStringからchar*への型変換に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
C# Listを使わずに2次元配列の...
-
配列を使わずに、変数名を動的...
-
複数の選択範囲の行番号を個別...
-
配列で格納したものをmsgboxで...
-
【速いブラインドタッチ】手を...
-
C言語で特定列だけを抽出して配...
-
配列をEraseしてもメモリが開放...
-
配列を含む構造体の初期値について
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
メモリの初期値
-
C++ vectorに配列をプッシュしたい
-
Redimした動的配列はEraseする...
-
VBで構造体の配列を関数に渡す...
-
【C言語】配列の中に配列を入れ...
-
ExcelVBAで質問です。離れた二...
-
Functionの戻り値を2次元配列...
-
ガウスの消去法のプログラム
おすすめ情報