[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 01/23 11:34 / Filesize : 200 KB / Number-of Response : 550
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれFORTRAN(超初心者用)その3



1 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 09:55:26 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)
pc8.2ch.net/test/read.cgi/tech/1138063703/

くだすれFORTRAN(超初心者用)その2
pc11.2ch.net/test/read.cgi/tech/1164121236/

●関連スレ
FORTRAN W
pc8.2ch.net/test/read.cgi/tech/1163319215/

47 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 12:38:35 ]
>>46
もともとは77で書いてあったコードなんですよね.
説明用のサンプルをいつものくせで90で書いてしまいました.

コードの量が膨大なものでできればそのまま使いたいんですよー
ちなみに再コンパイルするのはCore2Duo用の最適化のためです.
どうか方法教えて頂けませんでしょうか?

48 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:58:27 ]
>>47
元コードがF77なら話は通る。
>>45でCVFで通ったと書いてあったが、通るわけないので勘違いだと思っていた。

解決法は簡単で、サブルーチンと呼び出しルーチンを別ファイルにして、分割コンパイルされるように
すればいい。多分、元は別ファイルになっていたのをまとめたりしているのでは?

F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
無いのでエラーは出ないはず。

同一ファイル内に書いてあると、コンパイラが親切にも引数の整合性チェックなどをしてくれる。


49 名前:48 mailto:sage [2007/12/21(金) 01:00:28 ]
ちょっと訂正

>F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
>無いのでエラーは出ないはず。

F77なら"分割コンパイル時や”リンク時の引数チェックは何もしないので


50 名前:デフォルトの名無しさん [2007/12/21(金) 09:48:30 ]
F77を使用しています。
データから、2列目の数値のみをメインプログラムに入力したいんですが、
方法がわかりません。
例えば、下のようなデータの2列目のみを取り出すにはどうすればいいんでしょうか。

1.0 2.0 3.0
4.0 5.0 6.0

do 10 i=1,2
read(1,*) x(i),y(i),z(i)
10 continue
とするのは1列目も取り出してるので反則なんです…
read(1,*) (y((i+1)/3),i=2,5,3)
としてもうまくいきません。
超初歩かもしれませんがほんとわからないです。アドバイスお願いします。

51 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 13:59:25 ]
read(1,*)
read(1,*) x(i),y(i),z(i)


52 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 14:12:39 ]
>>48
ありがとうございました.
解決しました.

53 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 16:55:41 ]
一般的かわからないけど自分はダミー変数作って読み飛ばしてる

do i = 1, 2
read(1,*) xdum, y(i), zdum
enddo


>>51
それって1「行」目を読み飛ばしてるのでは・・

54 名前:50 mailto:sage [2007/12/21(金) 21:29:14 ]
レスありがとうございます。
>>51
「列」方向(縦方向)のデータを取り出す方法なんですが…
>>53
ダミー…考えはしたんですが、いいのかどうか迷ってました。
書いていただいて自信が持てました。ありがとうございます。



55 名前:デフォルトの名無しさん [2007/12/21(金) 22:23:51 ]
F77を使用しています。
出力した値をエクセルに貼り付けたいと思っているのですが、出力方法がコマンドプロンプトに表示する方法しかわからず困っています。
出力した値をメモ帳などに保存する方法はないのでしょうか?




56 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 22:40:56 ]
>>55
WRITE文の出力先をファイルに変更する。

手っ取り早くやりたかったら、リダイレクトで
hoge.exe > output.txt

57 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 23:01:08 ]
>>56
できました!ありがとうございます。

58 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:38:50 ]
常微分方程式y´+y=e^(-x)を
関数 Function f(x,y)
   F=
Return
end

であらわすにはどうしたらいいのでしょうか? 77です。

59 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:11:36 ]
このスレだとPGIコンパイラ使ってる人いそうなのでお聞きします。
ホームを表す~ですが、Intelコンパイラだと解釈してくれますが、PGIだとしてくれませんよね。
何気に不便なのですが、何か方法ないでしょうか?

60 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:33:45 ]
getenv('HOME')

61 名前:59 mailto:sage [2007/12/27(木) 23:25:35 ]
>>60
HOMEには当然ホームの値が入ってますよ(これはコンパイラに拠らないと思いますが)

62 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 02:58:13 ]
fortran90の練習で自分でライブラリを作ってみようとしているのですが、
interface文での総称指定がどうもうまく行きません。
あまりmodule文やinterface文がよくわかっていないのが原因と思っていろいろ調べてるのですが
行き詰ってしまい、ここで質問させてください。
以下のソースだと、コンパイルする段階で
main.o: In function `MAIN__':
main.o(.text+0x11a): undefined reference to `check_vector_int_'
main.o(.text+0x12c): undefined reference to `check_vector_double_'
main.o(.data+0xa0): undefined reference to `check_vector_double_'
main.o(.data+0xa4): undefined reference to `check_vector_int_'
という表示が出てa.outは出てきません

63 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 03:02:14 ]
module inte !interfaceで総称指定
interface check_vector
subroutine check_vector_int(x)
integer,intent(IN) :: x(:)
end subroutine check_vector_int
subroutine check_vector_double(x)
double precision,intent(IN) :: x(:)
end subroutine check_vector_double
end interface check_vector
end module inte
module check !引数ベクトルにintとdoubleがある
private
public :: check_vector_int,check_vector_double
contains
subroutine check_vector_int(x)
integer,intent(IN) :: x(:)
write(*,*) (x(i),i=1,size(x))
end subroutine check_vector_int
subroutine check_vector_double(x)
double precision,intent(IN) :: x(:)
integer :: i
write(*,*) (x(i),i=1,size(x))
end subroutine check_vector_double
end module check
program main !主プログラム
use inte
use check
integer :: a(5)
double precision :: b(5)
data a/1,2,3,4,5/b/5.0d0,4.0d0,3.0d0,2.0d0,1.0d0/
call check_vector(a); call check_vector(b)
end program main

64 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 03:09:07 ]
うわ 2chだとタブ文字使えないんですね
ごめんなさい

65 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 13:13:51 ]
全角空白を使うのがお約束みたいね
コピペしたあと再編集が必要なのがめんどいけど



66 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 13:25:10 ]
>>62
module inteの部分を

module inte
use check
implicit none
interface check_vector
module procedure check_vector_int, check_vector_double
end interface check_vector
end module inte

として module check よりも後ろに持って行く。
(checkモジュールができるよりも後にコンパイルされるようにする)

または、module checkの先頭部分を以下の様にする。

module check
implicit none
private
public :: check_vector
interface check_vector
module procedure check_vector_int, check_vector_double
end interface check_vector
contains
・・・


67 名前:62 mailto:sage [2008/01/03(木) 16:05:13 ]
>66
ありがとうございます! どちらの方法でもできました!
管理のしやすさなら、後者の方法で書きためて行った方がよさそうですね。
分野毎にmoduleで分けて、1module1ファイルで。

これで大体わかったので、色々と役に立ちそうなものを書いていけます。
ありがとうございました。

68 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 11:55:29 ]
プログラムを実行させてみると
Segmentation fault (core dumped)
というエラーが出て止まってしまいます。
そこで原因を探ろうと
write(*,*)'OK'
見たいなのを打ち込んでいたら、不思議なことにプログラムが最後まで進みました。
変数の値を変更することもしないはずなのになぜおこるのでしょうか?
そしてSegmentation faultが出る原因はどのようにしたらよいのでしょうか?

69 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:49:08 ]
不正なメモリにアクセスしにいったときに関係ないデバッグ文で動くようになったりするよ。

宣言文、引数の整合性など、幅広く探すこと。

落ちた場所だけ見ても解決しないことが多いよ。

70 名前:68 mailto:sage [2008/01/08(火) 01:05:36 ]
な、なるほど。ありがとうございました。色々洗ってみることにします。

71 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 14:04:11 ]
教えてください。

FORTRANからC(C++)の関数を呼ぼうとしていますが、文字列の受け渡しがうまくいきません。
開発環境はVisualFortranです。

FORTRAN側のソースコード
---
subroutine hogefor(str1,str2,isw)
!DEC$ ATTRIBUTES C :: hogec
character str1*(*)
!DEC$ ATTRIBUTES VALUE :: str1
character str2*(*)
!DEC$ ATTRIBUTES REFERENCE :: str2
!DEC$ ATTRIBUTES REFERENCE :: isw
call hogec(str1,str2,isw)
return
end

-----------------
C側のソースコード
void hogec(char str1[],char str2[],int isw)
{
  ...
}
-----------------
xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_03_05.htm
このサイトを参考にしましたが、
第1引数と第2引数の文字列の取得ができません。
なにがまちがっているのでしょう。。。
すみません。だれかおしえてください。

72 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:31:13 ]
すみません。まちがえました。
>!DEC$ ATTRIBUTES VALUE :: str1
!DEC$ ATTRIBUTES REFERENCE :: str1
です。

だれかおしえてください。。。。

73 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:02:34 ]
INTERFACE文を書いて、仮引数を定義しましょう

74 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:46:06 ]
program main
interface
subroutine hogec(str1, str2, isw)
!DEC$ ATTRIBUTES C, ALIAS: '_hogec' :: hogec
character(len=*) :: str1
!DEC$ ATTRIBUTES REFERENCE :: str1
character(len=*) :: str2
!DEC$ ATTRIBUTES REFERENCE :: str2
integer :: isw
end subroutine hogec
end interface
character(len=10) :: s1, s2
s1 = "Hello"C
s2 = "World!"C
call hogec(s1, s2, 123)
end program main


75 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:30:53 ]
write文に関して質問なんですが
write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1=0.12



76 名前:デフォルトの名無しさん [2008/01/17(木) 14:32:18 ]
write文に関して質問なんですが
write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1= 0.12
のように=と数値の間に半角スペースが一つ入ってしまいます。これをなくすことはできないんでしょうか?


途中で投稿してしまいました。すみません。

77 名前:デフォルトの名無しさん [2008/01/18(金) 00:58:57 ]
>>76
FORMATを使え!


78 名前:76 mailto:sage [2008/01/19(土) 00:29:52 ]
な、なるほど。ありがとうございます。色々みてみます。

79 名前:デフォルトの名無しさん [2008/01/20(日) 20:22:50 ]
出力しようとすると、ハンドルされてない例外が発生しました。
ってでるんだけどどうすればいいでしょうか?

80 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:52:10 ]
>>79
エラーメッセージを貼ってくれ。


81 名前:デフォルトの名無しさん [2008/01/20(日) 20:56:09 ]
>>80
コンパイルにエラーはないんですが、出力しようとすると、新しい画面がでてきて、
ハンドル・・・とでるんです。

82 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:47:51 ]
その「新しい画面」の内容を何とか工夫して伝えないと
伝わらないぞ

83 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:09:44 ]
>>81
それがランタイムエラーだっちゅーの。

エラーメッセージは省略せず一字一句表示された通り書け。
使ってるOSとコンパイラの種類もな。

84 名前:デフォルトの名無しさん [2008/01/22(火) 07:41:38 ]
開発環境 :Conpaq Visual Fortran 6
言語Ver :Fortran77+Fortran90(混在状態)
OS :Windows 2000

の上記の開発環境があります。

質問はプログラムを走らせたとき、途中の過程がどこまで行われたか知りたいと考えています。
上記のソフトでFortranを実行したときコマンドプロントが出るのですが、ここに計算課程を表示させたいです。

現在のプログラム内では結果の出力にWRITE文を使用し、OPEN文で出力装置を宣言させています。
私はOPEN文の出力装置の宣言をコマンドプロントに変えることで実行できると考えています。
しかし、出力装置の宣言にコマンドプロントを宣言する方法がわかりません、どなたかご教授お願いいたします。

ちなみに現在は以下のように使用しています。

:
OPEN (5,FIEL = 'OUTPUT.dat')
:
WIRTE (6,*) Func1, Func2,
:

どなたかお願いいたします。

85 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 11:38:50 ]
>>84
すでに標準出力をデフォの6番に割る振っているのだから、この上5番までも割り振ることは出来ない。
ただ、UNIXとかだとerr出力を割り振ったりできるのでCVFで絶対出来ないとは言わない。
マニュアル読めば出来るかもしれない。

しかし、ここは素直にコピーを作って、それのWRITE(5 をWRITE(6,に置換すれ。
目的はそれで達成できる。
オリジナルをいじると元に戻せなくなるので注意w




86 名前:デフォルトの名無しさん [2008/01/23(水) 14:48:20 ]
>85氏
返答どうもありがとうございました。
指示通り、プログラムのコピーを作成し、マニュアルを探って検証した結果うまくいきました。

方法はすごく単純で、以下のように書き換えるだけでした。

:
OPEN (5,FIEL = 'OUTPUT.dat')
OPEN (6,FILE = 'CON')
:
WIRTE (6,*) Func1, Func2,
:

と書き加えたところ、コマンドプロントへ結果が出力されました。

ご教授ありがとうございます!

87 名前:デフォルトの名無しさん [2008/01/23(水) 15:45:53 ]
f77をしようしています。

2つの整数の約数と、最大公約数と最小公倍数を求めるという
プログラムを書いてもらえませんか?

88 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:40:48 ]
>>87
最大公約数 最小公倍数 fortran でググレ

89 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:51:56 ]
>>87
素直に宿題で出ました。困ってます
と書いたら、誰か書くかも。

90 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:00:34 ]
宿題は自分でやれ

91 名前:88 mailto:sage [2008/01/27(日) 14:55:01 ]
>>87
最大公約数 最小公倍数 fortran でググったのか?
検索結果の一番上に出てくるが。

92 名前:デフォルトの名無しさん [2008/01/28(月) 17:49:50 ]
自分も宿題なんですけど質問します
数値積分で、n個の台形の総和で近似する場合のプログラムなんですけど、
繰り返し文使いますよね?
DOからCONTINUEの間に、面積の総和をSWA、何番目かの台形の面積をSとして
SWA=SWA+S
って書き込みました
SWA=0.0みたいにSWAを初期化する言葉は必要ですか?
家のパソコンではプログラミングできないので教えてください

93 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:38:46 ]
FORTRAN の仕様としては初期化は必要ないが、
中には 0 初期化してくれないコンパイラもあるので
初期化しておいた方が無難。

94 名前:88 mailto:sage [2008/01/28(月) 21:45:51 ]
>>93
むしろ、subroutine 化したときの暗黙save属性の方が怖くない?
オレは A = A + B 型の処理があれば、
脊髄反射でA = 0d0 を加える癖にしている。

95 名前:92 mailto:sage [2008/01/28(月) 22:19:21 ]
レスどうもです
初期化したほうが良さそうですね
失礼します



96 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:37:58 ]
fortranのプログラムを書くソフトは何を使えばいいのでしょうか?
講義では秀丸をつかってたのですが有料で買えません。
代わりのソフトウェアは何をつかえばいいのでしょうか?

97 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:04:49 ]
>>96
汎用フリーエディターなら、TeraPad
www5f.biglobe.ne.jp/~t-susumu/
をよく聞くね。

CPad for Salford FTN77
www.vector.co.jp/soft/win95/prog/se153699.html
なんてどう?

98 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:30:49 ]
>>93
FORTRANの規格では初期値は不定じゃなかったけ?
IBM育ちなので、方言なのかもしれんが。
おすえて。


99 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:53:37 ]
>>97
ありがとうございました。
下のリンクのほうつかってみます。




100 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:57:34 ]
fortran77をダウンロードしセットアップして再起動したのですが、
すべてのプログラムのsalford software というところには
デバッッカー(?)と説明文みたいなものだけでfortran77本体らしきものが
ありません。
何か問題があるのでしょうか?

101 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:55:24 ]
>>100
Cpadを使え

102 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 15:59:59 ]
本に載っていたコード何ですが文番号やらgotoがいっぱいついていてややこしいので
文番号などを使わない形に書き換えようとしています。
自分でやってみたのですが一部分からないところがあったのでみていただきたいと思います。

103 名前:102 mailto:sage [2008/01/29(火) 16:01:49 ]
    do 90 lz=lun,lup
      do 80 lx=llf,lrg

      if (j.le.0) goto 80
      if (j.eq.i) goto 80
      do 11 jj=1,10
        if (je(i,jj).eq.j) then
         jk=jj
         goto 70
        end if
 11 continue
      do 12 jj=1,10
       if (je(i,jj).eq.0) then

        goto 70
       end if
 12 continue
 70   xj=x0(j)



104 名前:102 mailto:sage [2008/01/29(火) 16:02:19 ]
     if (gap.lt.dsqrt((ri+rj)*(ri+rj))) then
      if (i.gt.j) then

        do 555 jj=1,10
        if (je(j,jj).eq.i) then
          j0=jj
          goto 554
        endif
555 continue
554 call actf(i,j,jk,as,ac,gap)

       endif
      else
 85 en(i,jk)=0.d0

   endif
 80 continue
 90 continue


105 名前:102 mailto:sage [2008/01/29(火) 16:10:06 ]
以上が本のコードです。
条件文以外は削除しております。

doループの80,90やgoto80などは何とか分かったのですが
goto70や、goto554がどうなってるのかがさっぱりで・・・
申し訳ないですがアドバイスお願いします。


先ほどの投稿では書き忘れてましたが
最後の方にある文番号85に関しては無視していただいて結構です。
探して見たところどこにもgoto85はなかったので
本のコードにゴミが残っていたと思われます。



106 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:36:49 ]
>>105
f90 を使っていいかどうかと、使用コンパイラーを書こう。
f77 では、cycle exit が(標準では)使えない。

107 名前:105 mailto:sage [2008/01/29(火) 17:57:47 ]
失礼致しました。
一応はFortran77なのですが
コンパイラはg77なのでcycle,exitなどは使えたと思います。

108 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:44:49 ]
85は放置、70はjeを探しているだけなので合併で大丈夫なはず、
554のexit はif構文に無関係

    do lz=lun,lup
     do lx=llf,lrg
      略
      if (j.le.0) cycle
      if (j.eq.i) cycle
      do jj=1,10
       if (je(i,jj).eq.j) then
        jk=jj
        exit
       end if
       if (je(i,jj).eq.0) then
        略
        exit
       end if
      end do
      xj=x0(j)
      略


109 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:45:10 ]
      if (gap.lt.dsqrt((ri+rj)*(ri+rj))) then
       if (i.gt.j) then
        略
        do jj=1,10
         if (je(j,jj).eq.i) then
          j0=jj
          exit
         endif
        end do
        call actf(i,j,jk,as,ac,gap)
        略
       endif
      else
       85 en(i,jk)=0.d0
       略
      endif
     end do
    end do


110 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 11:06:40 ]
>>108
11と12のdoループは、
 je=jとje=0の両方が真になることがあれば,合併不可
 常に、少なくとも一方は「10回全て偽」になれば、合併可

111 名前:105 mailto:sage [2008/01/30(水) 16:06:53 ]
返事が遅くなって申し訳ないです。
みなさまレスありがとうございます。
11,12ループの所だけを省略せずに抜き出してみました。
     do 11 jj=1,10
        if (je(i,jj).eq.j) then
         jk=jj
         goto 70
        end if
 11 continue
      do 12 jj=1,10
       if (je(i,jj).eq.0) then
        jk=jj
        je(i,jj)=j
        goto 70
       end if
 12 continue
 70   xj=x0(j)

je=jとje=0の両方が真になるかどうかなんですが
これをみるかぎり、やってることは両方jk=jjを代入してるだけなんで
      do jj=1,10
       if (je(i,jj).eq.0) then
        je(i,jj)=j
       end if
       if (je(i,jj).eq.j) then
        jk=jj
        exit
       end if
      end do
     xj=x0(j)
にしてもいいのかな、と思ったのですが。どうでしょうか?

112 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:26:11 ]
>>111
111のプログラムは間違い。
je(i,7)=j je(i,3)=0 それ以外は偽、のとき、
jkに何が入るべきか、考えてごらん。

je の取りうる値がわからないので、
この部分だけでは判断できない。
多分、合併はダメ。

113 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 18:24:44 ]
すみません、fortranのプログラムで助けて欲しいのですが

open(50,file='test.txt')
do i=1,ii
read(30,4000)dummy3,(a(i,j),j=1,jj)
write(50,4000)dummy3,(a(i,j),j=1,jj)
enddo
4000 format(A7,144F8.2)
pause

というプログラムの144F8.2について
144を変数として扱いたいのですがどのようにすればよいでしょうか・・・
line=144としたとき
format(A7,'line//F8.2')
format(A7,'line'//F8.2)
などではダメでした。整数だと144F8.2の状態だと問題なく走ります。
お助け下さい



114 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 18:36:34 ]
すみません、もっと簡略化して以下でお願いします

do i=1,ii
read(40,4000)dummy3,(a(i,j),j=1,jj)
enddo
4000 format(A7,144F8.2)

115 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:11:48 ]
>>113
>>4 内部ファイルを参考にする。
Intel 系コンパイラなら、書式に<>が使える。
number = 144
4000 format(A7,<number>F8.2)



116 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:06:06 ]
俺の方法は
character(len=50):: fmt
integer:: line
write(fmt,*) "A7,", line, "F8.2"
do i = 1, ii
read(40,fmt) dummy3,(a(i,j),j=1,jj)
enddo
てやると思う。

数字書き出すときに1桁、2桁、3桁それぞれ別書式にする場合に使ってる。




117 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:45:46 ]
しかし、FORMAT文の動的変更は200レス毎に1回くらいは必ず来るなw
これが教科書に載っていないという点で、一体教科書執筆者は何をやっているのかと問いつめたい。

漏れ自身の場合も、この方法を知ったのはFORTRANやり始めて5年目くらいだったか。
他人のソースを読んでいて、意味不な変なことやっているなと、最初は思ったw

改めて文法書を読めば、確かに内部ファイルの項目はあったのだが、読み飛ばしていた。
文字変数が無くて整数変数に文字をつっこんでいたFORTRAN66のホレリス時代の聖遺物かと思っていたw


118 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:36:12 ]
良くも悪くも数値計算用言語ですから、
数値を上手く取り扱う方法に目がいって
その辺の所は教科書書く人も勉強する人も興味ない。

119 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:25:45 ]
>>115
>>116
無事にいけました☆本当にありがとうございました!

120 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:55:37 ]
>>118
読者は興味ありまくりんぐじゃないの。この質問ばっかりで無限ループしているジャン。

まぁ、
1.フォーマット文が文字列や文字変数で与えられる。
2.内部ファイルによって、文字列⇔数値変換が出来る。
という、あまり知られていない2点を同時に使うので、教育の威力が如実に現れる項目であるはずなのだが。



121 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:23:33 ]
執筆者予備軍としての一言

 ・VB やJAVA のようにさまざまな発刊企画があれば、
  上級者向け書籍が作れるが、Fortran では無理。

 ・初心者向け書籍では、内容を厳選するよう要請される。
  頁数を少なく、文字数を少なく、挿し絵を充実、などなど。
  common や内部ファイルは真っ先に削除対象となる。

122 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:27:04 ]
COMMON文の説明なんて要らないから
純粋なFortran95の解説書出してよー
F2003でもいいけど

123 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:55:12 ]
COMMON 文は F77 では必要悪だが
F95 だとバグを産む素でしかない。

124 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:35:44 ]
>>121
コラムとか付録のサンプルとかで、何とか突っ込んでくれ。


125 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:53:35 ]
動的の説明を書かないにせよ
character(len=20):: fmt
fmt = 'A5,2X,I10'
100 format(fmt)
って例が載っているだけでも、
あーこんな使い方できるんだ〜
って思えるよなあ。



126 名前:118 mailto:sage [2008/02/04(月) 01:00:23 ]
>>120
質問してくるのは、勉強中の人じゃなくて一通り基礎を勉強して、
より実用的、応用的なプログラムを組んでる人だと思うんだよね。
Fortranは数値計算とセットでやる事が多いだろうから
優秀な大学じゃないと内部ファイルまでやれないよ。
無理してそこまでやっちゃったら、大切な部分が疎かになったり
数%しか単位取れませんでしたとか言う事態になっちまう。

127 名前:デフォルトの名無しさん [2008/02/04(月) 16:50:31 ]
symbol A is not an array

こんなエラーが出るんですが何がいけないんでしょう?

128 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 18:59:12 ]
シンボルAは配列ではありません

129 名前:デフォルトの名無しさん [2008/02/04(月) 19:58:45 ]
Statement function statement cannot occur here

invalid forward reference to label 117

>>128ありがとうございます
ちなみにこれはどうすればいいんでしょう?

130 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:17:37 ]
>Statement function statement cannot occur here
文関数はここに存在することが出来ません

実行文の後ろなど、文関数の定義を置けないところに文関数の定義がある。
配列や関数の引用の書き方が間違っている可能性もある。

>invalid forward reference to label 117
ラベル117の無効な前方参照

文番号117が参照されているが見つからない。


どれも簡単な英文で、読めば全てではないにしろ大まかに察しが付くような文なので
エラーメッセージは自分でよく読むように習慣づけよう。

131 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:17:27 ]
>>129
>>130氏を補足しよう。

>Statement function statement cannot occur here
これは未宣言の配列を用いるとよく出てくるメッセージだ。
配列を宣言し忘れていたり、綴りを間違い、かつ添え字に変数を使っていると出てくる。

FORTRAN77では文関数なるものが導入された。
これは一行で書ける関数を宣言文のところで宣言しておくと、実行文のところで利用できるというものなのだか
大して役に立たないのでほとんど使われない。それだけならよかったのだが、とんでもない副作用が生じてしまった。

実行文のところに、たまたま変数を添え字とする宣言し忘れの配列を使ったとする。
すると見かけ上は文関数の定義のように見えるので、(そういうパターンにマッチしてしまうので)
上のようなエラーメッセージが現れることになる。



f(i) = 5 * i + 1

これが宣言文のとこに現れば、f(x) = 5 x + 1 という関数を文関数で宣言したことになるし、
DIMENSION f(10)
i = 1
f(i) = 5 * i + 1
....
のような形で現れれば、配列fのi番目の要素に、5i + 1を入れる代入式と解釈される。


この文関数がらみのエラーは、だされるメッセージと実際のエラーの内容が食い違っているので、
FORTRAN77初心者を惑わす罠になっている。
これは必ず通る道なので、まぁ文句言わずにあるがまま受け入れろw


132 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 07:36:18 ]
>こんなエラーが出るんですが何がいけないんでしょう?

俺なら「おまえの頭」っていうところだけどな


133 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 11:07:31 ]
>>132
うっせー おまえこそ すっこんでろ!w

ここはくだスレだからFORTRAN振興のために、宿題も解く甘やかしスレだ!

134 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 02:24:45 ]
FORTRANってなんですか?
アプリケーションを作れたりするプログラミング言語なんですか?

135 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 10:59:57 ]
科学研究をするログラミング言語です



136 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 15:48:50 ]
Linuxでの実行モジュールを作るには、Linuxで開発・コンパイルするしかないんでしょうか?
WindowsのVisualStudioに慣れてしまったので、この上で全部できればいいなと思うんですが・・・

137 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:42:45 ]
Linuxでやるしかないかな。

だけど、コーディングをLinuxでやる必要はないので、
そんなに大変じゃないと思う。

コンパイルオプションをLinux版に変えるだけで
頑張ってMakefile書くくらいで終わりっしょ。


特にVisual Studio + Intel fortran
から
Intel fortran Linux
に行くだけなら
つまづくこともかなり少ないと思われ。


138 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:12:16 ]
gcc をクロスコンパイル用にコンパイルしてしまえば
別に Windows 上でも Linux 用のバイナリを作ることはできるが、
Visual Studio 上となると・・・。
自分で makefile 書けば一応いけるのか?
まあ、一番の問題はデバッグが大変ってことか。

139 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 22:58:55 ]
./a.out


140 名前:136 mailto:sage [2008/02/08(金) 00:16:57 ]
>>137
ということはWindowsとLinux両方買わないといけない、ってことですよね?
コンパイラスイート買う予定ですが、Academicでも10万超えは堅いですね・・・

>>138
gccはGNUなだけにその辺偉いのですが、速度が・・・
数値計算だとどうしてもLinuxが主流なので、色々と悩ましいところではありますね。

141 名前:136 mailto:sage [2008/02/08(金) 00:21:06 ]
今気づいたのですが、Intel FortranコンパイラをVisual Stuido上で使った場合
出てくるロードモジュールはもしかしてマネージコードになるんでしょうか?

142 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:52:57 ]
>>140
学術目的ならLinux版は無期限ライセンス版が落とせる。

>>141
普通のEXEバイナリを吐く。



143 名前:136 mailto:sage [2008/02/08(金) 10:07:16 ]
>>142
>学術目的ならLinux版は無期限ライセンス版が落とせる。
↓ですね。
ttp://www.intel.com/cd/software/products/ijkk/jpn/224378.htm
コンパイラ以外も可とは、気前いいですね。
ただ、いくつかはPage Not Foundになってたりしますが・・・

>普通のEXEバイナリを吐く。
そうですよね、安心しました。
そういえばLinuxにはmonoがあるから、いちおうマネージコードでも動くことは動くのかなぁ

どうもありがとうございました。勉強になりました。

144 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 19:45:07 ]
VisualStudioがあるのにIntel C++コンパイラ必要?
Intelのほうが速いから?

145 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 23:58:28 ]
>>144
FORTRANと組み合わせるならIntelC++の方が楽。
BLASの類のライブラリのこともあるし。SSE、並列化等のCPUの最適化もIntelのほうが対応が早い。
またLINUXとWinとで同じにやろうとするなら条件がそろうのでIntelの方がいい。
無論C++でWin32API叩いたりするならMSの方が有利だろう。



146 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 01:56:22 ]
>>145
なるほど
thxです

147 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:58:08 ]
かなりどうでも良いことなんですが、
vimで.f90のソースを書いていると、
勝手にインデントをスペースに置き換えられるんですよね。
まあnoexpandtabすればタブ文字で書けるんですが、
syntaxの設定上タブ文字が赤く表示されてなんだか不安な気分に。
これもsyntaxファイルを改変すれば変えられるのでしょうけど。

fortranの世界ではソースにタブ文字を使わない事が常識なんでしょうか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef