重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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件)

OpenCOBOLのマニュアルの場所を知らないので、エラーメッセージからの想像ですが、


・配列の添え字の上限が 4バイト符号付整数の上限 2**31-1
・1つの変数のサイズ上限が 2GB
のどちらかだと思います。前者なら(2**31-1, 4)の2次元配列にして、本来の添え字を4で割った商と余りに分割して、それぞれを添え字に使ってアクセスする。
後者だと面倒ですが、4つの2GBの配列を作って、本来の添え字を4で割った商と余りに分割して、余りをIFで判断してそれぞれに対応する配列のどれかをアクセスする。javascript:void 0;

全変数のサイズ合計値の上限があったりすると、もうどうしようもないので、ファイルにするしかないですね。
メモリは十分あるので、RAMDISKを作って、そこにそのファイルを置くのでしょうか。
    • good
    • 0
この回答へのお礼

エラトステネスの篩で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版の対応の仕方をお訊ね
してる訳です。
ありがとうございました。

お礼日時:2019/11/30 08:00

OpenCOBOL1.1 って、10年前の規格ですからねぇ。

    • good
    • 0
この回答へのお礼

ご指摘は正しいのですが、現在でも1~2割の資産が残って
おり、逆にFortranは64bitに対応してますよ。

お礼日時:2019/11/30 07:30

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