重要なお知らせ

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

電子書籍の厳選無料作品が豊富!

今、FORTRANでg95でプログラムを作っているのですが、動的割り当てで理解出来ない現象が起きたので質問させていただきます。
real(8),dimension(:,:,:),allocatable :: a
と三次元の動的配列aを定義し
allocate(a(0:10,0:10,0:10))
としています。
ここで、外部のファイルから各成分0~10の配列の所に値を読み込ませます。
私の理解では、これは0~10の添字までしか扱えないものと思っていたのですが、write文でa(11,11,11)という要素を書かせてみると、実際に値が出力されてしまいます。動的割り当てとはそういうものなのでしょうか。

また現在作っているプログラムではこれが値を持っているとまずいので、doループで11の値のところだけをif文で0にしようと試みたのですが、そのif文を反映してくれません。
(つまり
do i=0.11
do j=0,11
do k=0,11
if (i==11.or.j==11.or.k==11) then
.・・・
の時、・・・のところで0にしようしてもそれが反映されない)
始めはコードが間違っているのかと思いましたが、doループの10の値のところを同様に0にしてみたら成り立っていました。
(つまり
do i=0,10
do j=0,10
do k=0,10
if (i==10.or.j==10.or.k==10) then
・・・
の時、・・・のところで0にしようとするとそれが反映される)
これはやはり定義してないa(11,11,11)が出力されることと関係があるのでしょうか。

初歩的な質問かもしれませんが、よろしくお願い致します。

A 回答 (1件)

要するに、範囲を超えて指定するのは自己責任。


想定外なら、単なるプログラミングミスということで。

ちなみにこういうのも:

$$ cat -n a.f95
1 program hello_world
2 implicit none
3 integer, dimension(:), allocatable :: a
4 allocate( a(0:10) )
5 print *, "hello, world.", a( 11 )
6 end program hello_world
$ f95 -fbounds-check a.f95
$ ./a.out
At line 5 of file a.f95
Fortran runtime error: Array reference out of bounds for array 'a', upper bound of dimension 1 exceeded (11 > 10)
hello, world.$
$
    • good
    • 0
この回答へのお礼

動的割り当てのことがあまりよく分かっていませんでした。
解決しました。ありがとうございました。

お礼日時:2010/12/15 19:39

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