- ベストアンサー
Fortranエラー発生!副プログラムでデータの並べ替えを実行しようとしたら...
- fortranで副プログラムを使ってデータを昇順または降順に並べ替えるプログラムを実行しようとした際、Unexpected junk in formal argument list at (1)とTwo main PROGRAMs at (1)という2つのエラーメッセージが表示されました。
- 初心者の方が簡単なところで間違えている可能性もあるため、エラーの改善方法についてアドバイスをいただきたいです。
- 提供されたプログラムの中で副プログラムkoukanにおいて、変数の宣言やループ処理の順番に誤りがある可能性があります。正しい書き方に修正してみてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
エラーメッセージを必ず読むこと。またエラーが起こった場所もかかれているはずです。 今回のエラーは,仮引数にゴミがあるというのだからゴミを取り除きましょう。 誤 subroutine koukan(i,x(i),shoujun,koujun) 正 subroutine koukan(i,x,shoujun,koujun) それに付随して,こちらも修正しましょう。 誤 call koukan(i,x(i),a(i),b(i)) 正 call koukan(i,x,a(i),b(i)) 主プログラムが2つあるというエラーメッセージは,1つ目のエラーによって副プログラムが副プログラムであると認識されていないためです。 で,これらを修正すると,動くようにはなるけど,非常に無駄なことをしているプログラムになります。少し修正するだけで1/1000の計算量になります。
その他の回答 (3)
- f272
- ベストアンサー率46% (8467/18126)
> アクセスする順番を変えるとはどういうことでしょうか? 例えば配列aが昇順に並んでいるのなら do i=1,n write(10,'(i4,2f10.3)') i,a(n+1-i) end do で書き出されるのは降順になります。
お礼
丁寧なご説明のおかげで、理解することができました。 今回は、大変勉強になりました。本当にありがとうございました!
- f272
- ベストアンサー率46% (8467/18126)
do i=1,n call koukan(i,x(i),a(i),b(i)) write(10,'(i4,2f10.3)') i,a(i),b(i) end do でkoukanを1000回呼び出しています。でもkoukanでは配列xの中身をソートしているようです。つまり1000回ソートしているわけで,無駄ですよね。ループの外で1回呼び出せばよい。 ついでに言うと,koukanではxの中身を書き換えていますが,それとは別にソート後の配列も別に用意しています。ソート後の配列を使うのならソート前の配列を書き換えるべきではないし,ソート前の配列を書き換えるのならソート後の配列は不要です。 それから昇順と降順は,一方があれば他方はアクセスする順番を変えるだけです。2つとも計算するのは無駄でしょう。
補足
ループ内での呼び出しは無駄、ソート前の配列を書き換えるならソート後の配列は不要、というのはその通りですね、ありがとうございます。 昇順と降順の2つとも計算するのは無駄だと思っていましたが、効率的な方法が思いつかずにいました。こちらの理解不足で申し訳ありませんが、アクセスする順番を変えるとはどういうことでしょうか?
- redslove10
- ベストアンサー率41% (397/968)
subroutine koukan(i,x(i),shoujun,koujun) じゃなくて subroutine koukan(i,x,shoujun,koujun) かな
お礼
すみません、補足の方は解決しました。 早いご回答ありがとうございました!
補足
ありがとうございます!! 無事エラーはなくなり、output-data-1.txtのファイルを作成することができたのですが、このファイルを開いてみても何も入力されていませんでした。このファイルに結果を出力するにはどうすれば良いのでしょうか…。
補足
ありがとうございます!! そうですね、エラーメッセージの意味をきちんと読み取れるようにしたいと思います。 最後の少しの修正とは、どのようなものでしょうか…。今後に役立てたいため、教えて頂けると幸いです。