- 締切済み
配列のサイズが明示的でない計算について
Fortranを例にとった場合、 行列A,Bの積Cを計算する場合、例えば以下のようなループで計算していました。(Fortran77) do i=1,10 do j=1,10 sum=0.0 do m=1,10 sum=sum+a(i,m)*b(m,j) enddo c(i,j)=sum enddo enddo それが今では、以下1行です。(Fortran95) c=matmul(a,b) 配列1つ1つの成分について計算する必要がないと言えそうです。Pythonなんかは全部こういう思想ですね。 プログラム言語はすべてこういう方向に進んでいるように思えます。 これがやや不安に思えるところがあります。配列のサイズを指定していないのでどこまで使って計算しているかわからないからです。 古い方(上段)では配列のサイズや上限を指定しているので、指定しているところより先がどうなっていてもとりあえず被害はありません。 しかし、サイズについてのケアがないと思いがけないような計算をしてくるんじゃないかと思うのですが。計算のバグ取のときここ大丈夫かな?となって疑心暗鬼ということにならないかと思うのですが。 配列の最大値なども関数1つと言う感じですが、どこまでの範囲での最大なの?と聞きたくなるわけですが。 いかがでしょうか。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- mitoneko
- ベストアンサー率58% (469/798)
今回限りの関数を作るのなら、提示の組み方で充分でしょう。 では、毎回縦と横のサイズが違うとなったら、どうしますか? 発想の一つは、関数の引数に、各次元の要素数をセットすることです。 ところで、コンパイラは、例えば、 integer a(3); と宣言したら、aの配列は、3つの要素を持っていると知っているはずじゃないですか。 b(3:5)と宣言したら、添字の数字は、3から5だよとやっぱり知っているはずですよね。 コンパイラが知っていて当然の数字ですから、ちゃんとそれを取得する方法があります。 まずは、「size(a)」。先の宣言なら、この結果は3になります。これで、配列のサイズを関数の引数にしなくても、要素の大きさはプログラム内でわかりますから、書かなくて良くなります。 bのような宣言の可能性があるのなら、lbound(b)・ubound(b)を使えば、添字の下限と上限を知ることができます。 引数に配列名を取り、要素数を指定する必要のない関数は、大概、この手で要素数を取得して、計算に使用します。 じゃ、 integer c(100) と定義して、実は、10個しか使ってないんです・・・なんて場合は、もう無理です。(未定義のエリアが存在しますから、これで、配列内の最大値とやったら結果は未定義ですね。) ところで、最近の言語では、生の配列を使わないことが多いです。代わりに、例えば、Arrayクラスなんてのを使います。このクラス(型)は、いくつもの機能がありますが、最大のポイントは、変数を作る時に大きさの指定をしなくても良いことです。配列の大きさは、実際に値を追加・代入したり、要素を削除したりした時に、自動的に増減し、要素の数もそのときに合わせて管理するように設計されています。これだと、かなり柔軟な対応ができますね。
- wormhole
- ベストアンサー率28% (1626/5665)
それをいいだすと他人が用意した関数等は信用できないってことになりますけど。
お礼
回答ありがとうございます。 プログラム開発では”絶対間違いない!”と思ってやっぱり間違っているというのの連続のように思います。そのため極力”ひょっとしたら...かも知れない”というのは排除していかなくてはなりません。なので、”そういうことはありません”という言質というか保証を確定していきたいと思っているのですが。多分大丈夫なんだろうと思いますが。 プログラムだけで飛行機操縦しようという時代なので。
お礼
回答ありがとうございます。 "integer c(100)と定義して、実は、10個しか使ってないんです"は、やってました。その時は使うときは必ず範囲を決めています。もちろん、範囲<サイズです。範囲を超えたところは知らんよと。実際は使う前にゼロクリアとかしますが。そこでサイズ指定しないで配列の内容が自然数の最小は何かと聞くと、ゼロと答えてしまいそうです。 動的配列は1つの方法だと思いますが、それも間違いそうな気がするのですが。