• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:FortranにあってCにない関数?について)

FortranとCの関数の違いと配列の扱いについて

このQ&Aのポイント
  • FortranとC言語の関数の違いや配列の扱いについて疑問を持っています。
  • Fortranには配列の総和を求める関数があるのに対して、C言語に同じような組み込み関数は存在しないのでしょうか?
  • また、Fortranでは一行で複数の配列要素の和を計算することができますが、C言語では多次元配列の要素を個別に計算する必要があるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

Fortran の多次元配列は「前の添え字から」変化します. つまり integer :: A(2, 3, 4) とあるとメモリ上 A(1, 1, 1), A(2, 1, 1), A(1, 2, 1), A(2, 2, 1), ... と並びます. 一方 C では (そもそも本来の意味での「多次元配列」が存在しないが) int a[2][3][4]; はメモリ上 a[0][0][0], a[0][0][1], a[0][0][2], a[0][0][3], ... と並びます. この辺を意識する... のは C が低レベルだからで, Fortran のようにできてしまえばコンパイラに全部任せればいい. その理由で質問文に書いてある 3重ループの方が逆順にするよりも高速になりやすいです. さておき, C++ だと valarray というのがあって std::valarray<int> a(10), b(10), c(10); としておくと c = a + b; と書いたり int sum = a.sum(); と書いたりできます (効果は, まあ想像通り). とはいえ多次元配列はやっぱりきつい.

knock123
質問者

お礼

コメントありがとうございます。 多次元配列はきびしいのですね。あきらめてFor分を重ねたいと思います。

その他の回答 (5)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.6

>Fortranと比べてCは組み込み関数が少ないという印象を持ったのですが実際そうなのでしょうか? 組み込み関数が少ないどころではなく、ありません(コンパイラ独自拡張によるものは除く)。

knock123
質問者

お礼

コメントありがとうございます。

回答No.5

C++ なら、numeric の accumulate、algorithm の transform が使えます。多次元配列については、わかりません。 http://pastebin.com/BAxVZYSy 出力: 1 2 3 4 5 Accumulate: 15 11 22 33 44 55

knock123
質問者

お礼

C++ であれば、Cよりも数値計算向きの関数があるのですね。 まだCをヨタヨタ?使っている状態なので、ある程度なれたらC++も勉強したいと思います。 コメントありがとうございます。

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.3

そんな便利な機能、やFORTRAN66にはありませんでしたよ(泣)。 A=SUM(B)やa(0:n)=b(0:n)+c(0:n)はスーパーコンピュータで導入されたベクトル演算やパイプライン演算と非常に相性の良い書き方です。こう書いておけば、コンパイラはこの部分をベクトル演算器や複数プロセッサに割り振って演算できます。 ですから、こういう記法が導入されたのは、初期の汎用スーパーコンピュータであるクレイ1などが登場して以降になります。 FORTRANは数値演算を目的として使われることが多いですから、こういった演算器を最大限に使えるようなコーディングが登場したのでしょう。 私事になりますが、私が数値計算を仕事にしていた頃、3日掛かる計算(テープ交換の為に泊まり込む必要があった)がスーパコンピュータ導入で30分で終わるようになり、残業手当が劇的に減りました。 一方、Cは最初はともかく、発展過程はPDP-11のシステム記述言語です。OSを各言語ですから、マシン語に落ちた上体をコーディング時に想定できる必要があります。 例のforループであれば、インデックスレジスタiを終了条件判定(j/kも同様)、そのインデックスのアドレスからレジスタに値bをロード、cを加えてaにストア、その後インデックスれをインクリメントしてループトップに戻るという一連の流れがそのままコーディングされています。 実は工夫すればマクロで実装できないこともないのですが、これはプログラムの可読性を徹底的に破戒する禁じ手なのでまともなプログラマになろうと思ったら、絶対にやってはいけません。 その悪い例を集めたものとして林晴比古「Cプリプロセッサパワー」という珍書があります。怖いもの見たさでどうぞ。 http://www.amazon.co.jp/exec/obidos/ASIN/493079594X/bloofjav-22/

knock123
質問者

お礼

コメントありがとうございます。 Fotranは、Fortran77->90になる時に かなり自由度が上がったという印象がありますよね・・・自由形式で書けるようになりましたし、Do文にわざわざ行番号を対応させなくても良くなったり。 当方もFortran77->C->Fortran90と使用言語を変えた経緯があります。 数値計算をするならCよりもFortranのほうが使いやすいですし高速ですし。おかげで、同僚の研究者にはすべてFortranでコーディングしていてC言語のちょっとしたことを聞きたくても、聞けません(泣)。 Cというものはそもそも数値計算用ではない、と割り切って面倒ではありますが、地道にFor文を重ねたいと思います。

  • kngj1740
  • ベストアンサー率18% (197/1052)
回答No.2

こういう繰り返しの多い計算はどのような機械語(アセンブラ)に落とされるかを考えないと。CPUのキッシュを有効利用出来るように。見た目のスッキリよりも。例のケースではkインデックスの配列が連続するように。FortranとCでは割り当て方も違うと思うので。

knock123
質問者

お礼

回答ありがとうございます。 確かCはFotranと反対で、インデックスiを最内のループに入れなければならないのでしたよね。 留意して書き換えます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

端的に言えば C にそんな機能はないので, 頑張って自分でなんとかしてください ということになります. C++ なら多少は何とかなるけど....

knock123
質問者

補足

コメント有難うございます。 C++なら出来るのですか?ちなみにどんな風に簡略化できるのかご教授願えませんでしょうか?

関連するQ&A