12/08/16 20:58:00.31 .net
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その5
スレリンク(tech板)
●過去スレ
くだすれFORTRAN(超初心者用)その4
スレリンク(tech板)
くだすれFORTRAN(超初心者用)その3
スレリンク(tech板)
くだすれFORTRAN(超初心者用)その2
スレリンク(tech板)
くだすれFORTRAN(超初心者用)
スレリンク(tech板)
2:デフォルトの名無しさん
12/08/16 21:32:02.53 .net
, r‐‐ 、_
, ´ ̄ ´ ̄  ̄ミ 、 ____/: : : : ヽ、
__./ `¨ \/: : : : : : : : :: : : : : : : : : : : }
/ /// // / ,.、 / / : : : : : : : : : : : : : : : /
_,ァ≫イ/ / / / <、\>′ ヽ{ : :\ フ: : : : :/
イ/| //ー-、 />/`Y ∧\.:: : : :ヽ /: : : :/ ) (
彡' ノ,イ{/{__///「/¨ヽ.! ! | .}} /: : :.i /: : : : :/ ( )
彡' ノ }イ:::} ´´ r=ミ、 }ノ 1 小 /: : : : :/ ( ノ �
3:ア、これは>>1乙じゃなくて 片ソ /:::しヘ从 j/从.ゝ 彡/: : : : :/ |\ レンコンしそ餃子の湯気なんだからね {:::::、 廴::/}{/ ,'{/ / ,': : : : / ( (. |: : \ 今後は、気をつけなさい!! ヽ ー ::::: ∨{彡'.:.:.:.:. :/i: : : : :{ ( ) |: : : :.ヽ \__ イ≦_¨\ \_ {: : : : :丶_______.ノ: : : : : } 、____xー|. |, -、` ヽ _.: '.: : : : : : : : : : : : : : : : : : : : : : /_ / // / ー / /》ー--、 l-‐ \: : : : : : : : : : : : : : : : : : イ ゙ ヽ ノ // /ヘ/ /// \ / /,,r"i/ ,r"i/,,r"i/,,r"i 、 ヽ / // ,'⌒/. /// }/ ./ /#; / /#.; / //#; / ,/#; / .," i | V // i / /// `ヽi. /#; / ,/#; ./ /#;; / ,/#; / .,' / / 片厶≦j/ヘ //〈 /. |〃/ ,|〃/ ,|〃/ , |〃/ .,"..;;/ / `ー'⌒Y⌒ヽ // ヽ-====< ヽ ヽゝ' `ヽゝ~ ヽゝ ~ヽゝ' " / ゙ ー-- 、、... _ __,,,,, .... --―"
4:デフォルトの名無しさん
12/08/17 02:14:17.73 .net
> 初心者に適切な指導もなくプログラム書かせているのはアカハラの域に達してるな。
これって割と多いような気がするな。
まあ分野によっちゃいずれ必要になることが前前から分かっていそうな気もするのだが
それも指導のうちと言えばそうだ
5:デフォルトの名無しさん
12/08/17 04:02:00.57 .net
do i=2,1000
write(*,*) '1otsu'
enddo
6:デフォルトの名無しさん
12/08/17 19:12:19.36 .net
>>3
昔は先輩が教えることが前提となっていたから成立したが、
最近、先輩がいなかったり、知らなかったりで、伝承が途切れている。
時代の変化に、サヨクかぶれの爺さんたちの現状認識が追いついていない。
連中は鳩山みたいに夢を見て、管みたいに怒鳴り散らしてるからw
7:デフォルトの名無しさん
12/08/17 20:00:57.70 .net
前スレくだすれFORTRAN(超初心者用)その5の>>999さん
アドバイスありがとうございます。引き続きよろしくお願いします。
変更点の件ですが、
入力文
character (len = 20) :: filenm
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(11,file= TRIM(filenm) )
出力文
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)
close(14)
という修正をくわえればよろしいでしょうか?
8:デフォルトの名無しさん
12/08/17 20:51:34.50 .net
>>6
それだと出力してない。
OPEN と CLOSE の間で出力する。
ただ一度に欲張らず、まず固定された入力ファイルと出力ファイルで
ちゃんと計算できるプログラムをつくって確認しておくべき。
その後、色々ループさせたり、ファイル名を変えたり出来るようにすべき。
ものには順番があり、近くから遠くへ及ぼすべしとは、四書のはじめ大学にも書いてあるw
9:デフォルトの名無しさん
12/08/17 21:14:43.76 .net
これまでの教えていただいたプログラムが下記になります。
program test
implicit none
integer, parameter :: ndata = 400
real :: a(18, ndata), x(3, ndata), y(3, ndata)
real :: s, sx, sy, tx(ndata), ty(ndata)
integer :: i, j, icol
character (len = 20) :: filenm
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(11,file= TRIM(filenm) )
open(12, file = 'input2.txt')
open(13, file = 'input3.txt')
!
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
10:デフォルトの名無しさん
12/08/17 21:16:18.67 .net
! exel data y
do i = 1, ndata
read(12, *) (y(j, i), j = 1, 3)
end do
!
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
print *, 'input column '
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy
write(*,'(a,$)') 'File Name : '
stop
end program test
11:デフォルトの名無しさん
12/08/17 21:38:35.93 .net
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)
write(*,*) 'result=', s ! <--だから結果を書きだせってw
close(14)
12:デフォルトの名無しさん
12/08/17 21:39:27.86 .net
write(14,*) 'result=', s ! <--だから結果を書きだせってw
思わず間違えたwwww
13:デフォルトの名無しさん
12/08/17 21:52:24.90 .net
>>10>>11
アドバイスありがとうございます。とろいのですいません。
出力文
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)
write(14,*) 'result=', s ! <--結果を書き出すプログラム。
close(14)
こういうことでしょうか?
14:デフォルトの名無しさん
12/08/17 22:03:15.16 .net
そうそう。欲しい結果を書きだす。
本来は、入力ファイル名や計算したカラム(列)番号のような
付加的な情報も書いておくべきだろうが・・・
open(14,file = trim(filenm) ) ! <- こっちもTRIMで尻の空白を削っておくべし。
15:12
12/08/17 22:16:41.91 .net
>>13
最後の方は、こういう感じでプログラムすればうまく動きますかね。
print *, 'input column '
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file = trim(filenm) ) ! <- TRIMで尻の空白を削る。
write(14,*) 'result=', s ! <--結果を書きだす。
close(14)
stop
end program test
こちらの掲示板に来て良かったです。
色々こんなデキの悪い自分に付き合ってくださってありがとうございました。
16:デフォルトの名無しさん
12/08/17 23:15:49.56 .net
character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= TRIM(filenm_in) )
・・・・
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=trim(filenm_out))
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s ! <--結果を書き出すプログラム。
close(14)
として、読み込んだファイルと、使ったコラムも出力ファイルに書きだしておくと、
あとで何の計算したのかヒントになっていいぞ。
とろくさいと、どのファイルに何を書きだしたかすぐ忘れるだろうから、こうしておけwww
17:12
12/08/17 23:31:33.54 .net
>>15
度々すみません。親切にありがとうございます。
プログラムに組み込ませていただきます!
今日もかれこれ5時間くらいネカフェにいますが、
そろそろおいとまします。自転車こいで橋を越えた甲斐がありました。
また色々教えてください。
18:12
12/08/17 23:46:42.05 .net
最後にプログラム全体を書き込ませてください。
program test
implicit none
integer, parameter :: ndata = 400
real :: a(18, ndata), x(3, ndata), y(3, ndata)
real :: s, sx, sy, tx(ndata), ty(ndata)
integer :: i, j, icol
character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= TRIM(filenm_in) )
open(12, file = 'input2.txt')
open(13, file = 'input3.txt')
!
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
! exel data y
do i = 1, ndata
read(12, *) (y(j, i), j = 1, 3)
end do
19:12
12/08/17 23:47:39.05 .net
!
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
print *, 'input column '
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=trim(filenm_out))
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s ! <--結果を書き出すプログラム。
close(14)
stop
end program test
20:12
12/08/17 23:48:58.52 .net
本日もどうもありがとうございました。
お先に失礼します。
21:sage
12/08/21 14:51:00.60 .net
わからないので教えてください。
メモ帳(a.txt)のなかにデータがあります。
A B C D
1 1 1 1
2 2 2 2
‥‥‥‥
100 100 100 100
みたいな感じでデ-タがあるのですが、
B列の1行から100行まで
D列の1行から100行までのデータを取り出して
計算(B*D)する際に連動させたいのですが
どのようにプログラミングしたらいいでしょうか。
連動というのは、B列10行の時にD列10行の値を使うということです。
上手く説明できませんがお願いします。
22:デフォルトの名無しさん
12/08/22 00:48:53.83 .net
program test
implicit none
integer, parameter :: ndat = 100
real :: x(4, ndat), y(ndat)
open(10, file = 'a.txt', status = old)
do i = 1, ndat
read(10, *) x(:, i)
end do
y = x(2, :) * x(4, :) ! B * D
print *, y
stop
end program test
23:12
12/08/23 20:46:06.15 .net
以前こちらの掲示板でお世話になった>>12です。お久しぶりです。
すみませんが、壁にぶち当たってしまいまして、お力をお貸しください。
コンパイルした後、作成したアプリの方で3,6,9,12,18列を同時に読み込んで一つのメモ帳に
書き込めるようにプログラムしたいのですが、可能でしょうか?
以下に現在のプログラムデータを載せさせていただきます。以前アドバイスしていただいた「trim」
なんですが、buildしたらエラーになってしまったので、そこを入力と出力の両方消したら
コンパイルしてくれたので、バージョンが20年前のものだからではないかと思います。
あと、師に確認してもらったところ計算結果が誤っていると指摘されたのですが、もし
おかしなところがあったらアドバイスお願いします。一週間やってみたのですが、どうにも自分
では原因を見つけられないでいます。
一個一個メモ帳やエクセルのデータを読み込んだらclose
すべきという指摘がありました。あと、fortranでは原則iを実数にしないといけないと指摘されたので、
変更しました。これもソフトが古いからなのでしょうか?
program test
implicit none
integer, parameter :: ndata = 400
real :: a(18, ndata), x(3, ndata), y(3, ndata)
real :: s, sx, sy, tx(ndata), ty(ndata) ,i!iを実数にしたつもりです。これくらいで計算結果は変動しますか?
integer :: j, icol
character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= filenm_in)
open(12, file = 'mydata1.csv')
open(13, file = 'mydata2.csv')
24:12
12/08/23 20:50:05.82 .net
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do !ここはclose(11)とか不要でしょうか?
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
! exel data y
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
print *, 'input column ' !ここの読み込み時に3,6,9,12,15,18列を同時に読み込み計算させたいと考えています。
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s ! <--結果を書き出すプログラム。
close(14)
stop
25:12
12/08/23 21:03:18.85 .net
自分の作りたいプログラムの内容を載せさせてください。連投になってしまい、すみません。3つのファイル(メモ帳1つ、エクセルファイル2つ) を読み込み
対応した列の積分および除算を行い結果を新規ファイルに書き出せるようにしたいと考えています。
メモ帳のデータで読み込みたいデータが1~18列あり、メモ帳内のデータすべてを読み込み、上から「いらない行1~6」を読み飛ばすようにプログラミングし、
1~18列の中の任意の列のみを計算に組み込ませたいと考えています。(一度の計算処理で3列目のみとか6列目のみ指定して計算させたいです。)
いらない行1
いらない行2
いらない行3
いらない行4
いらない行5
いらない行6
1 .000E+00 .121E+06→→→.115E+07 .000E+00 .703E+06 .703E+06(18列)
2.
3.
↓
↓
↓
(全部で400行のデータが存在します。)
さらに以下のエクセルデータx,yを読み込んで合計値を算出、除算を行いたいと考えています。
エクセルデータxを組み込んだ計算式:sx=s+(real(i)*50.0-25.0)*?*x3
エクセルデータyを組み込んだ計算式:sy=s+(real(i)*50.0-25.0)*?*y3
(x3,y3は上記エクセルデータの左から3行目のデータを読み込ませているつもりです。)
(?にはメモ帳の1~18列を任意で選択できるようにプログラムしたいです。)
を作ってこれら二つを除算し、その結果を記録していくようにプログラムしたいと考えています。
プログラミングでいうと、下記エクセルデータの各行にx1,x2,x3,y1,y2,y3と名前を付け、x3,y3のみ読み込んで
計算過程に組み込ませたいです。
26:12
12/08/23 21:04:12.98 .net
エクセルデータx
2.50E+01 5.31E-01 2.75E-01
5.00E+01 2.27E-01 4.22E-02
↓ ↓ ↓
(x1 x2 x3)
(1~400個まで存在します。)
-------------------------------------------
エクセルデータy
2.50E+01 5.04E-01 2.70E-01
5.00E+01 2.08E-01 4.10E-02
↓ ↓ ↓
(y1 y2 y3)
(こちらも1~400個まで存在します。)
一回の計算でアプリケーション内で変更するパラメーターは以下の3つにしたいと考えます。
「入力するメモ帳のファイル名、各メモ帳の1~18列のどの列を入力するか、結果を出力する新規ファイル名」
(一回の計算で指定した1列だけの算出結果だけでなく、メモ帳内の3,6,9,12,15,18列をそれぞれの計算結果を一度に同じメモ帳の中で算出結果を
表示させたいと考えています。
稚拙な文章で申し訳ありませんが、よろしくお願いします。
27:デフォルトの名無しさん
12/08/24 16:55:29.16 .net
>>20
Fortran で i は整数だぞ。聞き間違いか、そのおっさんがアホかどっちかだ。
後者の場合、かなりキているwww
すぐ学生相談所に駆け込んで指導教官を変える実績作りを始めるべきw
close は、プログラムが終われば自動で閉じられるので、今の場合
たいした問題じゃない。
TRIMに関しては、コンパイラが手元にないのでよく分からんが、
エラーが出るとは思えない。まぁそれで動くというならよし、
文字列の尻に空白がついて困るというなら、なんとか考えるべしw
データを一度に計算したいというなら、大した計算量ではないので
計算は全データについて実行して、出力の所で選択するようにすればよい。
そのために、配列を拡張しておく必要がある。s, sx, sy
program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j, icol
28:デフォルトの名無しさん
12/08/24 16:56:50.09 .net
! exel data y <----EXCELな
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
close(11)
close(12)
close(13)
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) )
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。
close(14)
stop
end program test
29:デフォルトの名無しさん
12/08/25 00:14:21.45 .net
> i
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
↑強いて言えばこの実数計算に i が入ることが気に入らないんじゃないか
整数*実数は実数計算になるはずなので的外れだが。
> エクセルデータxを組み込んだ計算式:sx=s+(real(i)*50.0-25.0)*?*x3
> エクセルデータyを組み込んだ計算式:sy=s+(real(i)*50.0-25.0)*?*y3
-----------------------------------↑
この s って sx か sy の誤記?それとも別の変数?
30:デフォルトの名無しさん
12/08/28 04:12:53.24 .net
>>27>>28
返信遅くなってすみません。家の方で一週間以上経っても書き込み規制が解除されないみたいで、
またネカフェからです。月曜日に現状の報告会があったので、準備やらなんやらで閲覧が
遅れてしまい、申し訳ありません。
毎回教えていただきありがとうございます。
>この s って sx か sy の誤記?それとも別の変数?
この質問なんですが、私の持っているfortranの本にシグマ(Σ)を使った合計値の算出のプログラム例に記されていたので
そのまま作ったものです。ですので、この形で載っていただけので、そのまま使っています。sは一応s=s+1みたいな感じで
s=1とすると右辺に数値が代入され、左辺にs=2と計算させるような感じで入力した値を表現したつもりです。
31:12
12/08/28 04:34:43.09 .net
以下に順序を変更してみたプログラムデータをコピペします。
program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j, icol
character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= filenm_in)
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do
close(11)
open(12, file = 'mydata1.csv')
! excel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
close(12)
32:12
12/08/28 04:41:41.98 .net
! excel data y
open(13, file = 'mydata2.csv')
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
close(13)
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) )
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。
close(14)
stop
end program test
こういう順序の違いで計算結果って違ってきますか?
あと、最近ビルドした後コンパイルエラーばかり出てしまいますが、workplaceは一回ごとにこちらもcloseしないと
前のデータが残ってしまい、正しい計算ができない原因と考えられますか?
すみません、どんなことでも結構なので教えていただけると幸いです。よろしくお願いします。
33:12
12/08/29 16:39:14.45 .net
program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j, icol
character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= filenm_in)
open(12, file = 'mydata1.csv')
open(13, file = 'mydata2.csv')
!メモ帳
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do !
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
34:12
12/08/29 16:39:45.01 .net
! excel data y
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
close(11)
close(12)
close(13)
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) )
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。
close(14)
stop
end program test
35:12
12/08/29 16:42:53.89 .net
上記で試してみたのですが、以下のようなエラーが起きてしまいました。(泣)
mydata1,2は自分で読み込みたいファイルを書いたのですが、、、
-------------------Configuration: 2012 - Win32 Debug--------------------
Compiling Fortran...
E:\2012.f90
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR3852: syntax error
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(24): error FOR3541: duplicated DO index variable - I
E:\2012.f90(29): error FOR3541: duplicated DO index variable - I
E:\2012.f90(36): error FOR3541: duplicated DO index variable - I
E:\2012.f90(41): error FOR3541: duplicated DO index variable - I
E:\2012.f90(55): error FOR3596: missing END DO statement
E:\2012.f90(55): warning FOR4265: symbol ICOL referenced but not set
Error executing fl32.exe.
012.exe - 12 error(s), 1 warning(s)
36:デフォルトの名無しさん
12/08/29 17:11:03.66 .net
>>34
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do !
↑
ここに全角文字の空白が入っている。それでエラーが出ている。
削れ。
残りのエラーは、それを直せば消える。
あんま全角文字は使わない方がいい。
37:デフォルトの名無しさん
12/08/29 17:48:31.37 .net
lexical error: Invalid character
エラーメッセージの意味を調べておくといいよ
38:12
12/08/29 19:26:06.86 .net
program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j
character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= filenm_in)
open(12, file = 'waterdata.csv')
open(13, file = 'polystyrene.csv')
!メモ帳
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
39:12
12/08/29 19:28:30.86 .net
! excel data y
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
close(11)
close(12)
close(13)
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) )
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.'
write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。
close(14)
stop
end
40:12
12/08/29 19:32:33.20 .net
>>35
上記でコンパイルすることができ、ご指摘本当にありがとうございました。
「icol」なんですが、warningがでてしまって、式に直接関係しない変数なので
消してみたら消えました。たぶん、自分の使っているバージョンが古いため
警告がでちゃったと思います。
(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
師からわかっている値なのでこっちにした方がよいと言われました。
あと、本日コンパイルまで無事こぎつけることができたのですが、どうも計算結果がおかしい
ということだったので、師が今日初めて細かくプログラム内容を見てくれたのですが、
私の説明不足ですみません。以下にメモ帳のデータのところで追記させてください。
>>36
そうしてみます。
41:12
12/08/29 19:52:05.28 .net
連投になって本当にすみません。
メモ帳のデータの全体像を以下に記載します。
いらない行1
いらない行2
いらない行3
いらない行4
いらない行5
いらない行6
1 .000E+00 .121E+06→→→.115E+07 .000E+00 .703E+06 .703E+06(18列)←ここが合計19列でした。すみません。
2.
3.
↓
↓
↓
400
(全部で400行のデータが存在します。)
(18列)と説明してたのですが、ここが(19列)なので計算値が一個ずつずれて計算されていたため計算結果
が正しく算出されなかったのではないかという指摘を受けました。左端に1-400の整数部分の縦列 を除く2-19列
の指数表示のデータを読み込めるようにしたいです。
先ほど説明不足と書きましたが、僕の説明の間違いです。すいませんでした。
なのでこの部分を変更すればいいでしょうか?
do i = 1, ndata
read(11,*)!ここに一個整数のみ読み込まないように適当な変数をつけるべきでしょうか?
read(11, *) (a(j, i), j = 1, 18)
end do
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
42:12
12/08/29 20:19:49.56 .net
>>36
返信おくれてすみません。
lexical error :invalid character
語彙の 間違い:不正文字
オペレーターの入力ミスということでしょうか?
43:デフォルトの名無しさん
12/08/29 20:42:53.64 .net
real :: dummy
read(11, *) dummy, (a(j, i), j = 1, 18)
または
integer :: idummy
read(11, *) idummy, (a(j, i), j = 1, 18)
44:デフォルトの名無しさん
12/08/29 20:46:18.21 .net
>(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
>師からわかっている値なのでこっちにした方がよいと言われました。
今時の常識では、数値述べたうちは避けて、常数にする。
Fortranの場合はparameterにするのがふつう。
45:デフォルトの名無しさん
12/08/29 21:38:00.28 .net
>>43
ありがとうございます。
parameterというのはC言語でいうconstのような、
変数として宣言はするが変更はできないものと捉えて問題ないでしょうか?
となりますと「不要な6行」もそれに倣って
integer, parameter :: ncolumn = 18, ndata = 400, gomi = 6
^^^^^^^^^
などとしておくべきでしょうか?
>>36
エラーの意味がやっと分かりました。
関数や変数に使えない文字を、クォートの外に書いてしまうと発生するエラーなんですね。
シンタックスエラーと似ていると思いました。
特に全角空白は識別しづらいので気を付けるよう留意します。
>>42
なるほど、ダミーを用意するのですか。こういう発想は素晴らしいと思います。
読み捨てるだけのために宣言される変数・・・儚いですね。
プログラミング自体が初めてなので右も左もわからない状態だったのですが、
みなさんのおかげで金輪際ここに来ることはないと思います。
長々とお付き合いいただきありがとうございました。
46:デフォルトの名無しさん
12/08/29 21:48:48.84 .net
> FOR4265: symbol ICOL referenced but not set
参照しているけど値が入ってない、だとさ。
> 全角空白
IME から空白文字の入力を常に半角にすると良いぞ。
> 常数
定数じゃないのと思ったがどっちでもいいのか
函数と関数のような。
この 400 とか 18 とか何の数だったっけ?
とならんように意味のある変数(名前)で置く。
18 列じゃなくて 19 列だったときも ndata の値を変えるだけだ。
47:12
12/08/29 23:48:03.00 .net
電車で帰宅してる間に携帯で見てたのですが、規制がかかっているので我慢できずに
ネカフェから書き込みます。
>>44
勝手に解決させないでください。あと僕になりすまさないでください。
初心者にしてはずいぶんとわかっている余裕感がうかがえますよ。
なんですか、この子供のような文章は?
>プログラミング自体が初めてなので右も左もわからない状態だったのですが
integer, parameter :: ncolumn = 18, ndata = 400, gomi = 6
^^^^^^^^^
などとしておくべきでしょうか?
>>36
エラーの意味がやっと分かりました。
関数や変数に使えない文字を、クォートの外に書いてしまうと発生するエラーなんですね。
シンタックスエラーと似ていると思いました。
特に全角空白は識別しづらいので気を付けるよう留意します。
うそですよね、少なくとも初心者にはこんなこと言えませんよ。書き込みの時間帯も僕の書き込めない時間ですし。
「あと金輪際この掲示板にこない」と随分と礼儀知らずな事をおっしゃっていますが、>>44さんが
金輪際このスレに来ないってことですよね?
僕は初心者だし、これからもfortranでつまずいたらこちらで伺うつもりなので勘弁してください。
とりあえず、すべてのファイルで計算実行して違う値が出たので、グラフを手書き
で作成して師に明日持っていこうと思います。確認してもらったらまた報告します。
本日はどうもありがとうございました。
スレ嵐はやめてください、迷惑です。44さん、時間がないのであなたとも言い争っている暇はないですが、迷惑行為だけは
よそのvisual basicの方にでもいってやってきてください。
僕が書き込めるのは、17~21時,それから帰宅の間は書き込めないので23時以降になります。
48:12
12/08/29 23:53:21.35 .net
>>42
今後ともよろしくお願いします。
自分は無礼な�
49:ュ言やおかしいことは言いませんので、 その44の人は別人だし無視してください。
50:デフォルトの名無しさん
12/08/30 01:04:47.20 .net
我々がこの「師」とやらと話し合った方が早いな
51:デフォルトの名無しさん
12/08/30 01:26:24.03 .net
> よそのvisual basicの方にでもいってやってきてください。
失礼しちゃうわw
52:デフォルトの名無しさん
12/08/30 01:30:42.54 .net
>>41 手元にマニュアルもないの? というか目を通してる?
どうやら荒らしらしい>>44にも有益な情報は含まれてるんだよな。
頭に血が昇ってるようだけど、もう少し言われたことについて自分で考えた方がいいぞ。
前スレから。
53:デフォルトの名無しさん
12/08/30 18:36:51.49 .net
>>44
>parameterというのはC言語でいうconstのような、
>変数として宣言はするが変更はできないものと捉えて問題ないでしょうか?
間違っとる。parameterはread onlyのprotecrted変数とは違う。
parameterはコンパイル時に確定している値で宣言のサイズにも使える。
実行時にならないと確定しない変数とは違う。
>integer, parameter :: ncolumn = 18, ndata = 400, gomi = 6
> ^^^^^^^^^
>などとしておくべきでしょうか?
考え方は正しいが、ngomiのように先頭文字をi-nの間で始めるのが、
Gentlemanのたしなみ。さらに常数なので、i,j,kを避けるのが育ちの良さ。
>エラーの意味がやっと分かりました。
>関数や変数に使えない文字を、クォートの外に書いてしまうと発生するエラーなんですね。
違う。関数や変数に使えなくても普通にシンタックスエラーが出る記号文字もある。
全角文字は、二つの1バイト文字に解釈されて、そもそもFortran規格で
許されない文字に対応してしまうことがある。
またクォート以外にもコメントでは許されている。
54:12
12/08/30 19:24:39.72 .net
お世話になります。
今日、師に計算結果をプロットしたグラフ用紙とそのプログラムを見せに行ったのですが、
確かに計算結果は正しい方向に向かっているが、ちょっと違うと言われました。
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) ) ←ここが師は不明だと言っていました。
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy
プログラムを確認してもらったところ、
上記より上に関しては正しいが、上記の方法はわしは知らん、もし間違っているなら
ここだろうとのことでした。
また、iを整数にしないと計算結果は正しく出ない場合があるから直してと言われました。
(i * 50.0 - 25.0)←この部分なんですが、指数表示のデータがExcelデータx,yの1列目に
すでに表示されているので、Excelデータの1列目を3列全部読み込んでいるので
1,3列読み込んで、対応した値同士で計算させた方が良いというアドバイスを受けました。
下記にエクセルデータの全体像を記載します。
55:12
12/08/30 19:25:33.04 .net
エクセルデータx
1列目 2列目 3列目
2.50E+01 5.31E-01 2.75E-01
5.00E+01 2.27E-01 4.22E-02
↓ ↓ ↓
(x1 x2 x3)
(1~400個まで存在します。)
-------------------------------------------
エクセルデータy
1列目 2列目 3列目
2.50E+01 5.04E-01 2.70E-01
5.00E+01 2.08E-01 4.10E-02
↓ ↓ ↓
(y1 y2 y3)
(こちらも1~400個まで存在します。)
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
ここを下記のように修正すれば良いでしょうか?
tx(i) = x(1, i)* x(3, i)
ty(i) = x(1, i)* y(3, i)
56:デフォルトの名無しさん
12/08/30 20:25:51.02 .net
修正すれば良いでしょうかじゃなくてまずはやってみろよ
前向きな姿勢は結構だけど結局は質問するばかり、
理解する力が著しく欠如しているのではないか
57:12
12/08/30 20:56:06.80 .net
報告します。
先ほど、ビルドに成功して同じファイルを読み込んだのですが、微妙に値がズレてきました!
もう一回明日師に確認してもらいます。
result= 1.035215 1.035760 1.036275 1.036669
1.036880 1.036755
result= 1.035272 1.036202 1.037060 1.037667
1.037912 1.037520
58:デフォルトの名無しさん
12/08/31 11:37:20.94 .net
tx(i) = x(1, i)* x(3, i)
ty(i) = x(1, i)* y(3, i)
↑
同じ数字が入っているはずだが、y(1、i)にした方がいいかな。
あと、
>エクセルデータy
>1列目 2列目 3列目
>2.50E+01 5.04E-01 2.70E-01
>5.00E+01 2.08E-01 4.10E-02
この数字が本当だとすると、 1カラム目は(i * 50.0 - 25.0) になっていないw
59:12
12/08/31 19:58:38.13 .net
>>56
アドバイス有難うございます。
tx(i) = x(1, i)* x(3, i)
ty(i) = y(1, i)* y(3, i)
これに直してコンパイルしたところ、うまく結果が算出され、
師に確認してもらったところ、まぁいいんじゃないという
評価のグラフが書けました。
みなさんのおかげでここまで
来ることができ、大変感謝しています。
まだ別のデータが後200ほど残っているので、頑張ってタイピングしようと
思います。またやっていて困った時は相談にのってやってください。
ありがとうございました。
60:デフォルトの名無しさん
12/09/05 15:32:34.90 .net
コンパイラを Intel visual fortran から PGI visual fortran に変更したところ、
ビルド時に
Unable to open MODULE file ifport.mod
でエラーになります。
ifport では access と DELFILESQQ を使用しているのですが、
PGIのコンパイラで使用できる同種のライブラリはありますでしょうか。
61:デフォルトの名無しさん
12/09/05 22:38:16.39 .net
>>58
少しはマニュアルくらい読めよw
DEC時代の名前で存在している。ifortでなくてdfortとかiをdに変えればおk。
62:デフォルトの名無しさん
12/09/07 20:00:53.25 .net
それで>>58は解決したのかよ。
PGIのCUDA対応に興味あるから、色々反応するの待ってんだけど。
63:58
12/09/10 16:56:11.03 .net
>>60
解決しました。ありがとうございます!
64:デフォルトの名無しさん
12/09/15 18:54:35.08 .net
急に質問してしまい申し訳ありません。
先月からfortranについて勉強し始めました。
ですが行き詰ってしまいました。
このような記述でディスプレイに計算結果を表示したのですが・・・
何故か表示される結果がCとDが2つづつ表示されるようになっています。
記述
WRITE(6,50)A,B
WRITE(6,60)C,D
50 FORMAT('|A|=',F16.12,' |B|=',F16.12)
60 FORMAT('C =',F16.12,' D =',F16.12)
結果
|A|= 0.999681111435 |B|= 0.025044224242
C = 0.025079839523 D = 0.000000000000
C = -0.000632444304 D = 0.000000000000
おそらくwrite文のフォーマットの記述がおかしいと思うのですが
どこがおかしいのか分からず質問させていただきました。
おかしな点を指摘していただけると幸いです。
65:デフォルトの名無しさん
12/09/15 19:24:02.52 .net
たぶんおかしくない。それより WRITE(6,60) でソースコードを検索してみるべき。
66:デフォルトの名無しさん
12/09/15 19:31:56.26 .net
↑すまん適当言った。C と D は複素数か配列じゃないだろうか。
67:62
12/09/16 17:07:32.38 .net
>>64
ありがとうございます!無事解が一つのみ表示されました。
ご指摘の通りCとDが複素数で宣言されていました・・・・
それにすら気づかず、write文のせいにしていたのが恥ずかしいです。
大変助かりました!
68:デフォルトの名無しさん
12/09/18 19:39:09.67 .net
すみません、質問です。
求めたい値=
(a*固定した数値1*メモ帳データx+b*固定した数値2*メモ帳データy+(1-a-b)*固定した数値1)/固定した数値1
a=1-exp(-11.88×s)
b=exp(-11.88×s)×1-exp(-11.88×t)
固定した数値1,固定した数値2,s,tはその都度自分の方で入力しようと思います。
メモ帳のデータx,yはどれも以下のような形式になっています。
1.010629 1.010828 1.011074 1.011356 1.012
1.010916 1.012412 1.014304 1.016474 1.012
1.011208 1.013878 1.017139 1.02069 1.012
1.011433 1.014934 1.019081 1.022747 1.012
1.011525 1.015284 1.019623 1.024372 1.012
1.011341 1.014313 1.017726 1.021465 1.012
ここから何行目の何列目を指定して一つの数値を計算式に代入して「求めたい値」を算出したいのですが
可能でしょうか?
69:66
12/09/18 19:44:05.52 .net
すみません、追記です。
メモ帳データの数値はすべて使用して計算結果として算出したいので、
一枚のメモ帳に結果がすべて表示できる方法があったらお願いします。
70:デフォルトの名無しさん
12/09/18 19:50:35.33 .net
この辺を見ておくといいよ
URLリンク(www.nag-j.co.jp)
71:デフォルトの名無しさん
12/09/19 03:23:00.74 .net
とりあえずファイルのデータを全部2次元配列に放り込んで
結果も2次元配列の内容を全部吐き出す感じでいいだろ。
x, y に任意の組み合わせを取るなら単純じゃなくなるが。
72:デフォルトの名無しさん
12/09/21 20:29:19.20 .net
プログラムの歴史を学ぼうと思って、FORTRANからやってみようと思いました。
FOTRANのバージョンとか歴史はある程度理解したんですが、
WikipediaのFORTRANの歴史に載っています所謂IBM 704用のFORTRANの最初期の形なんてのは今のPCじゃ動かないんでしょうか?
標準入出力の関係もまだなかったみたいですし、多分そもそも現代のコンピュータ上では実装できないんでしょうけど。
FORTRANの歴史
URLリンク(ja.wikipedia.org)
まぁ、今は諦めまして、Linuxにgfortranを入れたとこです。
Wikipediaの項目を見てたら下記リンクにあるのが昔の正規のドキュメントかなと思っているのですが、
さすがにコンパイラはIBMのものでしょうし、見ることができないですよね。出来たら初期の高級言語のコンパイラのソースも見てみたいんですけど。まぁ、見たってきっとわかりませんがね。アセンブラなんでしょうか?機械語?
Index of /pdf/ibm/704
URLリンク(www.bitsavers.org)
それで、これが一番最初のFORTRANの正式なドキュメントかな?と思っているのですが、当たりですかね?
URLリンク(www.bitsavers.org)
73:デフォルトの名無しさん
12/09/22 12:09:47.77 .net
もともとが業務用だからね。
74:66
12/09/24 16:11:25.31 .net
>>68>>69
ありがとうございます。
75:デフォルトの名無しさん
12/09/24 18:53:46.75 .net
>>70
FORTRANの歴史を知りたいなら、Comuter History Museumをチェックしなければ
いかんがねー。
URLリンク(www.computerhistory.org)
たしか、バッカスのFORTRANコンパイラを作りたいと上申書みたいなメモから
あった気がする。マニュアルの類も文法書の他運用書などたくさんある。
704のエミュはなかったが、後のIBM360やIBM1130のエミュは存在している。
その上でFORTRANIVは動いている。FORTRANIIも動いていたかもしれない。
この時代のソフトウェアは著作権の概念がなかったのかパブリックドメインに
なっているよう。時代の進んだIBM370とかFORTRAN77のFORT VSとかのエミュはない。
昔のFORTRANのマシンコードなんかはパンチカードだか、ダンプリストだかが
うpされていた気がするので機械語レベルでは転がってる気がした。
76:デフォルトの名無しさん
12/09/24 18:57:59.58 .net
エミュとかはComputerHistoryMuseumではなく、民間のおっさん達がやってる。
ググれば出てく
77:る。
78:デフォルトの名無しさん
12/09/24 19:22:07.62 .net
>もともとが業務用だからね。
?
もしかして“適用業務”のことかw
79:66
12/09/26 19:24:13.20 .net
結局、自分でプログラム組めるほど頭良くないので電卓で手打ち
でやってたんですが、エクセルでやることにしました。
フォートランは、エクセルと比べどういう計算処理をする場合に
特化しているんでしょうか?計算するんだったらfortranが一番
おすすめだそうなのでやってみたんですがチンプンカンプンです。
(>_<)
80:デフォルトの名無しさん
12/09/26 21:49:19.25 .net
Excel でできる程度の計算なら Excel でやれば良し。
Excel とか無い時代の産物なので、伝統か信仰によって勧められる事が多い。
81:デフォルトの名無しさん
12/10/16 20:22:35.55 .net
質問があります
FORTRANを使って連番ファイルを読み込ませるためのgnuplotのバッチファイルを書きだそうとしているのですが、writeでどうやって書き出すのかわかりません
どういうことかというと、たとえば
plot "output[i].txt" u1:2
をi=1,10でwriteで出力するとき
write(filenumber,*) "plot "output[" i "].txt u 1:2"
となるためwriteで文字を出力するために使う”と、出力する文字の一つとして扱いたい”が干渉してしまうんです。
”を文字として出力するためにはどうしたらよいでしょうか?
どなたかわかる方がいたら教えていただけませんか?
82:デフォルトの名無しさん
12/10/16 21:27:08.31 .net
>>78
確かにそういときどうすんだろ
考えたこともなかったわ
83:デフォルトの名無しさん
12/10/16 22:41:51.19 .net
言ってる意味わからんw
do i = 1, 10
write(filenumber, '(a, i2,2, a)') 'plot "output[', i, '].txt" u 1 :2'
end do
これでどうだ?番号は 01,02,... ,10 となるが。
84:デフォルトの名無しさん
12/10/16 22:54:18.30 .net
すまんこ。
>'(a, i2,2, a)')
i2.2 ↑ ピリオドな
ついでに。。。0が余計ならformatを動的に生成すればおk
integer :: i, klen, filenumber = 9
character (len = 80) :: fmt
do i = 1, 10
klen = int(log10(real(i))) + 1
write(fmt, '(a, i1, a)') '(a, i', klen, ', a)'
write(filenumber, fmt) 'plot "output[', i, '].txt" u 1 :2'
end do
85:デフォルトの名無しさん
12/10/16 23:03:43.98 .net
'(a, i0, a)'
でいいんじゃないの?
86:デフォルトの名無しさん
12/10/16 23:35:22.01 .net
>>82
うむ。
i0ってF2003からの機能だと思っていたが、F95から入ってたんだな。
勘違いしてたわ。
一応F95標準縛りをかけていたつもりだったので避けたが、i0 で楽勝だな。
87:デフォルトの名無しさん
12/10/17 00:21:39.81 .net
>>78
思いつくものを挙げてみると...
write(filenumber, '(a, i0, a)') 'plot "output[', i, '].txt" u 1:2'
write(filenumber, '(a, i0, a)') "plot ""output[", i, "].txt"" u 1:2"
write(filenumber, '(a, i0, a)') "plot " // char(34) // "output[", i, "].txt" // char(34) // " u 1:2"
write(filenumber, '(a, a1, a, i0, a, a1, a)') "plot ", 34, "output[", i, "].txt", 34, " u 1:2"
write(filenumber, '(13hplot "output[, i0, 12h].txt" u 1:2)') i
88:デフォルトの名無しさん
12/11/18 12:45:02.25 .net
バッチファイルをそのまま生成させるって頭いいな
89:デフォルトの名無しさん
12/11/23 13:59:34.03 .net
質問です。
配列を引数にする関数を定義したいのですが、
やり方がよくわかりません。
function FD(w)
implicit none
integer :: i
integer,parameter :: n = 10
real(8) :: w(0:n),FD(0:n)
do i = 0, n
FD(i) = exp( - w(i))
enddo
end function FD
が関数で、これをメインプログラムで使いたいのですが、
x = FD(w)
のような省略形だとちゃんと計算できるんですけど、
do i = 0, m
x(i) = FD(w(i))
enddo
みたいに配列を明示しようとすると
配列の形状が準拠していません。
とエラーが出ます。
()を省略しないで書く方法はないですか?
90:デフォルトの名無しさん
12/11/23 16:37:12.25 .net
>>86
w(i)は配列ではなく配列の要素(1個の変数)ですので
当然エラーとなります。
do i = 0, m
x(i) = FD(w(i))
enddo
の3行を、
x(:) = FD(w(:))
にすれば()付きの書き方にはなります。
91:デフォルトの名無しさん
12/11/23 18:30:14.20 .net
>>87
回答ありがとうございます。
まだ、違いがよくわからないのですが
例えば、
do i = 0, m
x(i) = FD(w(i)) + y(i+1)
enddo
とか
do i = 0, m/2
x(i) = FD(w(i))
enddo
do i = m/2, m
y(i) = FD(w(i))
enddo
のようなことは関数の場合、出来ないのですか?
(:)だと出来ることが制限されてしまうような気がするんです。
92:デフォルトの名無しさん
12/11/23 19:46:12.45 .net
>88
x(0:m) = FD(w(0:m)) + y(1:m+1)
とか
x(0:m/2) = FD(w(0:m/2))
y(m/2:m) = FD(w(m/2:m))
となるかな
93:デフォルトの名無しさん
12/11/24 14:54:58.79 .net
それか関数の方を 配列じゃなくて 数値を引数とするように変更するかだな
94:デフォルトの名無しさん
12/11/26 19:24:40.40 .net
fortran95 以降になるが、ELEMENTAL属性を使えばできる。
これはスカラーに対して定義しておくと、配列も受け付けるというもの。
ただし副作用のない PURE な副プログラムな必要がある。
elemental pure real(8) function FD(w)
implicit none
integer :: i
real(8), intent(in) :: w
FD = exp( - w )
end function FD
これでメインルーチン側で
x = FD( w )
と呼んでも
do i = 1, 10
x(i) = FD( w(i) )
end do
と呼んでもよろしい。
PURE が何かはマニュアルを見るか、鋼鉄天使くるみPUREを見る事。
シスタープリンセスREPUREでもいい。
95:デフォルトの名無しさん
12/12/01 20:48:26.42 .net
ELEMENTAL属性ってのは初めて聞いた 勉強になります
兄ぃありがとう
96:デフォルトの名無しさん
12/12/02 15:08:21.56 .net
(ELEMENTALはPUREでもあるから強調しなくてもいいんだけどな…
97:デフォルトの名無しさん
12/12/02 16:57:51.30 .net
x(:)=fd(w(:))
x=fd(w)
って同じ?
: つけとかないと配列であることを
忘れちゃうので
つける習慣にしているけど。
98:デフォルトの名無しさん
12/12/02 17:13:25.97 .net
同じだけど、括弧をつけて配列であることを明示したほうがいいね
99:デフォルトの名無しさん
12/12/03 19:08:16.44 .net
>>93
どっこい、それがF2008でELEMENTALだがI/Oを許すという風になったので、
ELEMENTALだからと言ってPUREとは言えなくなったのだよ。
妹たちの未来を考えて、ここはPURE。
>>95
これもF2003からは同じではなくなったのだよ。
RAEL,ALLOCATABLE :: a(:)
REAL :: x(100)
a = x
F2003では代入時に割り付け配列は、(再)割り付けされる。
a = x(1:10)
とすると、a はサイズ100から10に再割り付けされる。
a(:) = x(1:10)
の時は、元のサイズ100のまま代入される。
抽象度の高い記法の方が良いのだから、括弧をつけない方が正しいと思う。
F77からの移行期には、括弧を書いて置く方がわかり易かったのは理解できるが
数学だって行列を記号1個で書いて間違わないのだからだいじょぶDEATH
100:デフォルトの名無しさん
12/12/03 23:06:44.99 .net
(キリッ
101:デフォルトの名無しさん
12/12/04 13:45:46.84 .net
>>96
2003使ったことないけど、うーんと、
要は allocatable な変数は
allocate() 使わなくても、
: 無しで左辺において、
固定サイズ(か既に大きさの確定した配列)が右辺に来る代入式で
随時 deallocate して再び allocate した事にする、
ということなのかな?
・・・・すくなくともワシには危険な香りがするw
102:デフォルトの名無しさん
12/12/04 13:48:18.15 .net
ふとおもったけど、文字列で
mojiretsu='abcdefg'
write(*,*) mojiretu(2:4)
で bcd が表示できる例のように
文字列の番地管理の表記法って77からある(とおもうw)けど
これってかなり時代先取りだよね。偶然なのか
規格策定の時にすでにベクトル表現の思考が始まっていたのか
しらないけど。
103:デフォルトの名無しさん
12/12/04 17:50:34.81 .net
>>98
2003ではおっしゃる通り、サイズの違う配列が右辺に来ると、勝手にDEALLOCTAEして
右辺のサイズにALLOCATEし直して代入する。
Intel Fortranではデフォルトのオプションでこの機能が切られている。
最近の言語は動的なんちゃらで、みんなそんな感じだから流行り?
危ないけど便利。
>>99
90からはwrite(*,*) 'abcdefg'(2:4)と定文字列?でもできるぞ。
104:デフォルトの名無しさん
12/12/05 13:45:40.15 .net
へえ、しらんかった。
でも、どういう場面でつかうんだろう?
i=2
write(*,*) 'shit'(i:4)
とか、・・・英語複数形 s をだしたり隠したり、かな?
でも正直なところ、なくても困らんな。
105:88
12/12/05 18:22:09.77 .net
88です。みなさんありがとうございます。
お礼が遅くなってすみませんでした。
まだ難しくてよくわからないので、素直に括弧つけます。
106:デフォルトの名無しさん
12/12/06 14:46:49.96 .net
>>100 最近の言語は動的なんちゃらで、みんなそんな感じだから流行り
だろうね・・・でも量が多いと遅くなりそう。
そういう動的なことは Interactive な言語処理系でやればいいことで、
やることの量がだいたい前もって決まっていることを
なるべく早くたくさんがーっと処理したい、というのが Fortran 人wなので
・・・でもこのままでは老害って言われるし・・・うーん、むつかしいね。
107:デフォルトの名無しさん
12/12/06 15:58:43.84 .net
ヤングの諸君を引き寄せるには、ある程度流行りの機能を入れないとまずいんだろう。
それに動的自動割り付けは、FUNCTIONで不定個数を返せるようになったので、
それを受け取るには無いと困るというのがあると思う。
REAL :: x(10)
REAL, ALLOCATABLE :: y(:)
CALL RANDOM_NUMBER(x)
! f90
ALLOCATE( y( COUNT(x > 0.5) ) )
y = f(x, 0.5)
PRINT *, y
! f2003
y = f(x, 0.5)
PRINT *, y
CONTAINS
FUNCTION f(x, a)
REAL, ALLOCATABLE :: f(:)
REAL, INTENT(IN) :: x(:), a
f = PACK(x, x > a)
END FUNCTION
END
この例はあらかじめ必要な配列の大きさが分かるが、計算してみないと
必要な配列の大きさが分からない場合は、大きめに取っておくか
二回計算する必要がある。
108:デフォルトの名無しさん
12/12/06 17:15:11.18 .net
可変長文字列も動的割り付けで可能になった。
program varchar
implicit none
character(len = :), allocatable :: text
text = 'automatic allocation'
print *, text
text = 'variable length text'
print *, text
stop
end program varchar
109:デフォルトの名無しさん
12/12/06 17:49:33.18 .net
長さ同じだぞw
110:デフォルトの名無しさん
12/12/08 17:47:52.98 .net
モジュール内で定義したグローバル変数を
プログラム内で変更しないようにするにはどうしたらよいでしょうか?
(変更があったらエラーを吐くようにしたい)
parameter属性を付けるのが近いと思いますが、
そのグローバル変数はファイルからreadで読み込みます。
つまり、最初に一回だけファイルで読み込んで、
その後は変更せずに、各サブルーチンで参照できるようにしたいです。
111:デフォルトの名無しさん
12/12/08 23:34:47.37 .net
>>107
URLリンク(www.nag-j.co.jp)
112:デフォルトの名無しさん
12/12/10 21:50:33.71 .net
F2003でいいならprotected属性だな。
F90だったら、privateで隠匿して、値を使うところでは関数・サブルーチンで
値を取ってくるかな。
113:デフォルトの名無しさん
12/12/11 12:57:04.37 .net
protected つかわない、つかいたくない、つかえない
という時には他には intent(in) をあちこちに配置して
いちどどこかプログラム内で初期値設定した後は変えないようにする、って
手もあるけどこれは107さんの要望とはマッチしないなぁ。
protected がいちばん素直だとおもう。
114:デフォルトの名無しさん
12/12/15 21:23:37.92 .net
もりあがってますね
115:デフォルトの名無しさん
12/12/16 16:37:19.87 .net
月に一個くらい質問というかお題投下があって
2週間くらいで20スレいく程度で
まったりと
116:デフォルトの名無しさん
12/12/18 04:20:26.48 .net
f90から外部モジュールでf77を呼べますか? つまり固定形式で書かれたコードを外部モジュールで呼べるかってことなんですけど
117:デフォルトの名無しさん
12/12/18 14:41:34.63 .net
ん、コンパイル別々にしてリンクすればいいとおもうよん。
f77の継続行記号(6ケタ目の空白以外の任意文字)を継続前の行の最後の & に置き換える
だけで、原則f77はf90で解釈できるので、
そこだけいじって同じファイルに追加しちゃうという手もあるけどね。
118:デフォルトの名無しさん
12/12/18 14:41:50.10 .net
呼べる。
module f77module
contains
.....
ここにサブルーチン、関数ならべる。
....
end module f77module
固定フォーマットの独立したファイルにして分割コンパイルすればよし。
119:デフォルトの名無しさん
12/12/19 01:27:05.28 .net
旧形式のコードて今でも普通に書かれてるの?
仕方なく再利用してるだけで、新しいコードは全部新しい文法で書くべき?
120:デフォルトの名無しさん
12/12/19 13:23:10.08 .net
> 旧形式のコードて今でも普通に書かれてるの?
わしゃバリバリ固定書式で書いている。
左7つ開けとかないとムズムズするのでw
> 新しいコードは全部新しい文法で書くべき?
書くべきだとおもう!
思うが・・・・
121:デフォルトの名無しさん
12/12/19 17:31:47.38 .net
>>115
おおー、ありがとーございます。
122:デフォルトの名無しさん
12/12/20 00:16:24.69 .net
>>114
ということは、その処理をすれば固定形式と自由形式の混在したソースコードも
コンパイルできるということですか?
123:デフォルトの名無しさん
12/12/20 00:56:53.25 .net
新しい文法使ってもそれはそれで保守できるかという
自由形式として解釈できない固定形式の文法が継続行の扱いくらいかと
124:デフォルトの名無しさん
12/12/20 18:26:13.33 .net
素直に固定形式のファイルと自由形式のファイルと分けた方が良いと思うズラ
f77時代は1個のファイルにまとめた方が、引数チェックや最適化のメリットが
あったが、f90以降は、MODULEとか使えば、分割コンパイルにそれほど害はないズラ
125:デフォルトの名無しさん
12/12/21 15:22:10.79 .net
インテルだと
ifort -ipo
でファイルがバラバラでも最適処理してくれるよね。
126:デフォルトの名無しさん
12/12/22 20:57:03.97 .net
コンパイラが偉い
127:デフォルトの名無しさん
12/12/23 16:26:05.54 .net
>>122 ifort -ipo
インテルの中に
はじめの一歩の
母ちゃんのファンがいるに違いない
128:デフォルトの名無しさん
12/12/25 20:09:46.90 .net
年内にインテルFortranの更新来ないのかな?二か月に一回の周期来てんだが。
block..end block を早く入れて欲しいわ。
たまに loop index を局所的に確保したい。頭部の宣言部が重くなりがち。
129:デフォルトの名無しさん
13/01/04 12:57:56.98 .net
下記のようなループの外でopenしてループの中で書き足していくプログラムを書いているのですが,
ifortでコンパイルした場合,実行の途中でもファイルが更新されていくのですがpgiでコンパイルした場合はプログラム終了まではファイルが更新されず,
プログラム終了時に全部書き込まれます.pgiでコンパイルした場合でもプログラムの途中で適宜ファイルが更新されるようにできるのでしょうか
open(1000, file='data.dat')
do j = 1, N
write(1000, *), j
enddo
close(1000)
130:デフォルトの名無しさん
13/01/04 16:35:30.00 .net
fortran2003のFLUSH命令を使え。
131:デフォルトの名無しさん
13/01/04 17:18:02.62 .net
>>127
うぉー!ありがとうございます
132:デフォルトの名無しさん
13/01/09 11:54:21.56 .net
linuxでfortran 77のコンパイラってありますか?
gfortranというのを使うらしいのでそれをインストールして試したのですが知人に貰ったfortran 77のコードがコンパイルできませんでした
133:デフォルトの名無しさん
13/01/09 12:25:08.67 .net
>>129
gfortranは77に対応していません。
フリーってことでおk?
fortran77対応のフリーのコンパイラはg77が有名かな。
linuxならintel fortranもnon commercial版になるけどフリーであったはず。
研究や企業での利用はできないから注意。
個人的にはfortran77をいつまでも使っていないで、
90に書き換えて、折角インストールしたgfortranを使った方が良いと思う。
書き換え方は拡張子を変えるのと、改行の&ぐらいでとりあえずは動くでしょ
134:デフォルトの名無しさん
13/01/09 12:36:06.11 .net
>>130
g77でコンパイルできました
ありがとうございます
135:デフォルトの名無しさん
13/01/09 17:25:39.34 .net
gfortran って f77 コンパイルできないの?
f90 は f77 完全包括しているし、廃止事項をホントに廃止している
処理系はめったにないからオプション変えれば行けるんでね?
誰かおしへて。
136:デフォルトの名無しさん
13/01/10 00:32:04.71 .net
はじめからコードを倍精度で書くのと、コードは単精度でかいて倍精度はコンパイラのオプションに任せるのってどっちがやってる人多いのかな。
後者のメリットはコードがすっきりすることくらいか。
137:デフォルトの名無しさん
13/01/10 18:29:17.78 .net
AUTODBLは、べた書きの定数の桁がどう扱われるのかよく分からんとか
微妙な精度の問題が気になってIMPLICIT DOUBLE(A-H,O-Z)に乗り換えたわ。
あと、昔のプログラムだと整数とからんだCOMMONやEQUIVALENCEの整合が狂って
謎な挙動をしたりするから困る。
138:デフォルトの名無しさん
13/01/11 01:47:02.97 .net
>>132
g77の拡張機能つかってるコードをそうと知らずにgfortranでコンパイルしようとして互換性ないと勘違いした
139:デフォルトの名無しさん
13/01/12 13:32:51.48 .net
>>133
以前、同じことが気になったので、
中くらいの長さ200行ぐらいの単精度コードを手でw 倍精度化したのと、
コンパイルオプションで倍精度化したのを比べたことがある。
gfortran と ifort ではそれぞれで
実行バイナリが冒頭の一部分(コンパイル時刻?)以外は同一だった。
なので自作コードだけなら、違いはないか気にならない程度だとおもう。
third party library で
単精度と倍精度でサブルーチン名が違う場合があるので
その場合にどうなるか、はしらない。
140:デフォルトの名無しさん
13/01/12 13:34:36.19 .net
あと、OpenMP で並列化したやつもまったく同じだった。
MPI で並列したやつはまるで駄目だったので
これは泣く泣く手で倍精度に揃えたw
141:デフォルトの名無しさん
13/01/12 14:57:23.92 .net
third party というかソースのない、かつ組み込みでない関数/サブルーチンは
変換できないし、規定されていない方の値を渡すと意味不明な挙動になるぞ。
なお対応する interface 定義が提供される module を use して総称名で呼ぶと
コンパイル時に型にあった引数定義のサブルーチンが選ばれるようになる。
MPI はこういうトリックとは関係なく、1要素の大きさを渡すあたりに工夫が要るかと。
142:デフォルトの名無しさん
13/01/14 23:43:04.50 .net
知り合いのMPIのコードは倍精度はコンパイルオプションに任せてたな
143:デフォルトの名無しさん
13/01/15 12:54:37.70 .net
mpi_float を mpi_double に置き換えてくれるのかな?
MPI で単精度か倍精度が気になるのはその点くらいだよね
144:デフォルトの名無しさん
13/02/09 03:59:15.05 .net
emacsのfortranモードについてなのですが、
変数宣言のあとに「::」をつけると、変数名に色がつくのが気に入っています。
ですが、改行すると色わけされません。
解決方法はありますでしょうか?
例、
integer :: i& ←色がつく
,j ←色がつかない
145:デフォルトの名無しさん
13/02/09 04:25:01.37 .net
>>141
継続行を使わずに2行に分けて書くのはダメなの?
integer :: i
integer :: j
146:デフォルトの名無しさん
13/02/09 04:40:54.90 .net
>>142
今はそれで対応しているのですが
なんとなく、同じグループの変数はまとめておきたいなと思いまして・・・
147:デフォルトの名無しさん
13/02/09 08:39:18.75 .net
>>141
emacsの事は良く知らないけれど、f90.el内の
;; Variable declarations (avoid the real function call)
の次の行を編集すれば良いのでは?
あとemacsスレの方がレスが付き易いかも知れないね
148:デフォルトの名無しさん
13/02/15 04:06:55.05 .net
>>144
返信遅くなってすみません。ありがとうございました。
149:デフォルトの名無しさん
13/02/15 11:05:49.33 .net
ずっと、fortran90メインで書いてたけど、Javaを触ってみようと奮闘したら、
訳わからん。書籍も分厚いのに、全部書いてある本ってあるの?少し違う事を
しようとしたら、必ずネットで調べらなあかん。fortranなら簡単に書けるのに。
Javaって新しい言語だから素人にもある程度優しいもんだと思ってたのは間違い
なの?自分がアホなんだろうなあ。プロの人ってすごいなあと、自らのアホさ
加減にへこむ日々。fortranで簡単にGUI使えたらJavaなんて要らないのに。
アホな書き込みすいません。
ああああああああ、だめだw。いらつかない。いらつかない。
150:デフォルトの名無しさん
13/02/15 20:00:07.57 .net
Fortranとかいうアホ言語使ってるからそうなるんだ
C++を使いなさい
C++が使えるようになればJavaなんか簡単
151:デフォルトの名無しさん
13/02/16 12:55:18.74 .net
GUI 書くのはどの言語でも(記述量はともかく仕様の理解に)手間だろ…。
>>147 ベターCじゃなくて真面目にC++ならな
152:デフォルトの名無しさん
13/02/17 23:13:36.88 .net
>>146
なんでやねん
俺にすればJavaの方がFORTRANよりずっと簡単に思えるぞ
C#もだいたい似てる
使うコンピュータがメインフレームならJava、WindowsならC#がGUIが一番楽
というかメインフレームにはMonoすらない事が多いし
C#はDelphiの流れを受け継いでいるのとJavaやC++の良いとこ取りしている
ある意味卑怯な(?)言語なのでGUIはこれが一番早く完成する
153:デフォルトの名無しさん
13/02/21 10:17:06.63 .net
ファイルを読み込んでcharacter型の変数に代入しようとしています。
一行の文字数が不定なときはどうすればいいですか?
あらかじめ要素数をおおきめに用意する以外でおねがいします。
154:150
13/02/21 10:35:58.49 .net
コンパイラーはintelの9.0です
あと、intelの非商用のコンパイラってもう配布されてないんですか?
155:デフォルトの名無しさん
13/02/21 23:40:21.69 .net
>>150
//www.nag-j.co.jp/fortran/FI_18.html#AUTOTOC_18_4
>>151
linux用ならnon-commercial板があると思うが
156:デフォルトの名無しさん
13/02/22 01:40:20.99 .net
1文字づつ読んで改行まで貯めこむしか無いんでないかな。
IVF9.0では無理だと思うがF2003なら、可変長文字列ではなく文字配列ならIVF9でも可かな。
program test
implicit none
character :: ch
character(:), allocatable :: buf
buf = ''
do
read(9, '(a)', end = 999, advance = 'no', eor = 8) ch
buf = buf // ch
cycle
8 print *, buf
buf = ''
end do
999 stop
end program test
157:150
13/02/22 15:25:21.78 .net
>>152
non commerical で検索したら見つかりました
ありがとうございます
>>153
buf=buf//ch
は代入するたびにallocateしなおしてるやつですか
intel の最新版はF2003に対応しているみたいなので
そっちを使ってみます
158:デフォルトの名無しさん
13/02/22 17:32:58.14 .net
>>154
>は代入するたびにallocateしなおしてるやつですか
そう。大量で負荷が重いなら大きなbufferを取るしかない。
IntelFortranの場合F2003文法はデフォではOFFになっているので
standard-semantics をONにする必要があるかも。
配列の場合
buff = [buff, ch]
で配列要素数を拡張していけるが、この場合はオプション必要。
159:デフォルトの名無しさん
13/02/25 11:52:14.65 .net
実行時間を計測することはできると思いますが
使用したメモリの最大値を計測することはできませんか?
コンパイラはintelです
160:デフォルトの名無しさん
13/02/25 15:41:26.94 .net
Linux なら ps をじっと眺めているw
Windows なら task manager のグラフを眺める。
161:デフォルトの名無しさん
13/02/28 02:15:09.70 .net
include文やuse文で読み込むインクルードファイル、モジュールファイルを
別ディレクトリにおいてコンパイルしたいのですが、
インクルードパスの設定方法がわかりません。
コンパイラはifortです。
ifort -I***
***に絶対パスを入れたり、相対パスを入れたりしたのですがダメです。
そもそも、-I/でタブ補完しようとすると
-I/ is not found.と出てきます。
何か別の設定が必要なのでしょうか?
インクルードファイルがあるディレクトリは、カレントディレクトリの中にあります。
162:デフォルトの名無しさん
13/02/28 11:49:02.22 .net
fortranの出力指定子でマニアックなものまで全部のってるサイトを教えてもらえないでしょうか
例えば0.005を↓のように出力する指定子を探しています
5.000000000000000-3
163:デフォルトの名無しさん
13/03/01 01:51:15.14 .net
>>159
EN(工学用)なら3乗おきに出力できたはず
0.005なら単純に科学系のES記述子でもできる
いつから在るか知らないけど、最近の本(自分が買ったのは5年前)には普通に載ってたよ
Webサイトなら"Fortran 編集記述子"で検索すれば色々出てくるけど、
自分の環境で使える記述子を全部知りたいならコンパイラのリファレンスが一番確実
164:デフォルトの名無しさん
13/03/01 17:51:51.58 .net
少しはマニュアル読めよwww
165:デフォルトの名無しさん
13/03/02 17:11:35.24 .net
さっき始めたんですがわからないので教えてください
あるモジュールにサブルーチンが二つある時にこの二つのサブルーチンを違うファイルに記述することは出来ますか?
C++でいう名前空間のように分離できるか?ということです
166:デフォルトの名無しさん
13/03/04 19:17:12.36 .net
名前空間を分けたいなら、まぁmoduleを二個使え。
USEでエイリアスをつけろ。
どうしてもというなら、一個のモジュールを二個のファイルに書くことは、
includeを使えば出来ることはできる。
またFortran2008で導入されるsubmoduleを使う手も考えられる。が、実装している
処理系はまだないと思う。
167:デフォルトの名無しさん
13/03/06 03:56:33.28 .net
Fortranのcharacterって文字コード決まってたりする?環境依存?
168:デフォルトの名無しさん
13/03/06 15:22:28.31 .net
内部コードは環境依存。
というか昔はIBMのEBCDICこそが本物コードでASCIIは安物ミニコンとかのパチモン文字コードだった。
ANSI FORTRAN77の時に内部コードの他にASCIIコードに対応させる関数が導入されてる。
169:デフォルトの名無しさん
13/03/07 16:59:58.06 .net
スレチかもしれないけど
リスト構造を無限ループで回してるところを
openmpで並列化したいんだけどできます?
170:デフォルトの名無しさん
13/03/07 18:31:50.73 .net
リスト構造といっても色々あるから答えようもないぜw
Fortranはデータパラレルには強いがタスク・パラレルは弱いけど、
OpenMPの新しい版ではタスク・パラレルできるから
リスト構造で枝分かれするところでタスク分割すればいいんでね?
順序入れ替えが無い線形リスト構造なら、配列に直せば元々高速になるし、
並列化の余地も大いにあると思う。
171:デフォルトの名無しさん
13/04/03 15:36:38.02 .net
print '(g20.12)', 1.d-100
とすると
0.100000000000E-99
と返してくれるのですが,
print '(g20.12)', 1.d-101
とすると
0.100000000000-100
のようにEが消えてしまいます.
これだとプロットのソフトによっては0.100000000000-100を-99.9と解釈してしまい困ってます.
どうすれば3桁以上の指数部分も正しく書けますか.
コンパイラはifortです.
172:デフォルトの名無しさん
13/04/03 18:33:16.72 .net
>>168
こんなかんじかな。
program p
implicit none
integer :: i1,i2
real(8) :: d1,d2
character(10) :: s1
d1=-1d-105
i1=log10(abs(d1))
d2=d1*10d0**(-i1)
write(*,"(g25.16,f25.15,a)")d1,d2,"E"//i2s(i1)
contains
function i2s(ival)
integer, intent(in) :: ival
character(int(log10(dble(abs(ival))))+2) :: i2s
character(12) :: s1
write(s1,"(i12)")abs(ival)
if(ival.ge.0)then
i2s="+"//s1(12-int(log10(dble(abs(ival)))):12)
else
i2s="-"//s1(12-int(log10(dble(abs(ival)))):12)
end if
end function
end program
173:デフォルトの名無しさん
13/04/03 19:16:56.67 .net
>>168
'(g20.12e3)'で指数部の桁数を指定するとか
174:168
13/04/03 20:10:49.50 .net
>>170
そんな仕様があったのか。知らんかった。
175:169
13/04/03 20:12:16.82 .net
ごめんミス。171は169です。
176:デフォルトの名無しさん
13/04/22 08:17:30.46 .net
知らない仕様っていっぱいありそう
177:デフォルトの名無しさん
13/05/05 23:04:55.44 .net
f90って継続記号は行頭ではなく行末でないといけないんですよね?
例えば、
equation = A&
+ B&
+ C
みたいな式があってCの寄与をみるためにコメントアウトするとき
たまにBの後ろの&をコメントアウトしわすれて面倒だったりしませんか?
絶対文頭につける仕様のほうが便利だと思うんですが・・・。
178:デフォルトの名無しさん
13/05/06 08:39:40.01 .net
セミコロンで文末にできた気がする
equation = A&
+ B&
; ! + C B から継続→文末、C の除外
179:デフォルトの名無しさん
13/05/08 18:56:23.29 .net
10.000
100.00
1000.0
100000
浮動小数点を上記のように書き出したいのですが
どのように書式を指定すればよろしいでしょうか
180:デフォルトの名無しさん
13/05/15 05:10:28.17 .net
>>176
f?.* を使ってください。
?は全体の桁数、*は小数点以下の桁数。
181:デフォルトの名無しさん
13/05/15 05:16:35.51 .net
私も質問です。
サブルーチンの引数に配列を使ったときに、実引数と仮引数でサイズのチェックが行われるような書き方、
あるいはコンパイルオプションはありますでしょうか?
例えば、実引数がa(0:imax)で仮引数がb(1:imax)のとき、エラーが出ずにコンパイルが通ってしまうことがあります。
その場合、実行結果がめちゃくちゃになるのにエラーが出ないのでデバッグに苦労しています。
内部サブルーチンのときはコンパイルエラーが出ますよね?
外部サブルーチン、あるいはモジュールでもエラーが出るようにできますでしょうか?
182:デフォルトの名無しさん
13/05/15 23
183::02:48.29 .net
184:デフォルトの名無しさん
13/05/16 03:39:55.72 .net
>>179
ありがとうございます。具体例をあげます。
module_Aのなかに、サブルーチン1とサブルーチン2がcontainsされています。
module_Bのなかに、サブルーチン3がcontainsされています。
ケース1、
サブルーチン1でuse module_Bとして、サブルーチン3を呼び出します。
実引数はmodule_Aで宣言しており、x(0:imax)です。
仮引数はサブルーチン3で宣言しており、intent(out)属性をつけてx(1:imax)です。
この場合、コンパイルしてもエラーが出ませんでした。
185:デフォルトの名無しさん
13/05/16 03:42:38.83 .net
つづき、
ケース2,
サブルーチン1でサブルーチン2を呼び出します。
実引数はintent(inout) :: y(1:imax)で仮引数はintent(in) :: y(0:imax)です。
この場合もエラーが出ません。
コンパイラはifortです。
できれば、これらのケースでのinterfaceの使い方を教えていただきたいです。
186:デフォルトの名無しさん
13/05/17 10:56:33.57 .net
ftn95 で、以下のエラーメッセージの原因がわかりません。
(メッセージの意味ではありません)
Error 29, Call to missing rotine : _EXSUB at 0x00******.
主プログラム(main.f90)
program main
use interface_mod
implicit none
integer :: a,b
a=3; b=5
call exsub1(a)
call exsub2(b)
end program
外部サブルーチン(exsub.f90)
subroutine exsub1(r)
implicit none
integer, intent(in) :: r
real(8),dimension(r):: w
print *,w
end subroutine
subroutine exsub2(s)
implicit none
integer, intent(in) :: s
real(8),dimension(s):: x
print *,x
end subroutine
187:182
13/05/17 10:57:14.45 .net
(うえのつづきです)
インターフェイスモジュール(ifmod.f90)
module interface_mod
interface
subroutine exsub1(r)
integer,intent(in)::r
end subroutine
subroutine exsub2(s)
integer, intent(in) :: s
end subroutine
end interface
endmodule interface_mod
188:デフォルトの名無しさん
13/05/17 12:40:14.55 .net
質問です。 計算の結果を.datファイルに書き込むプログラムを作成したのですが
datファイルの中身を確認すると文字化けしています。何がいけないのでしょうか?
OSはWindow7 64bit、コンパイラはFortran90です。「あらきけいすけの雑記帳」を参考にしました。
プログラムすべて乗せるとちょっと長いので関係有りそうな部分だけ。
最初はこのように宣言
open(1, file='1.dat', status='replace',access='direct',recl=4)
その後doで回しながら計算結果を書き込む
write(1,rec=(it-1)*39*39+(iz-2)*39+(ix-1)) p2(ix,iz)
189:デフォルトの名無しさん
13/05/17 16:50:59.44 .net
direct access なら内部コードで書かれるんだから当然じゃ
190:デフォルトの名無しさん
13/05/17 18:02:03.27 .net
>>182
そこに張られているものは問題ないと思う。
エラーメッセージはサブルーチンexsubが無いと言っているので、
call しているプログラムが exsub1,exsub2 になっておらずexsub になっていると思われる。
たぶんファイルのセーブ違い、コンパイル違い。
インターフェース+野良サブルーチンにするより、
サブルーチンは module に入れて module を use するのがふつう。
インターフェースは、外部ライブラリとか、関数引数みたいな場合以外は
出番なくてよし。
>>180-181
最新版の intel compiler ならエラーを出す。
ただし宣言元の配列の方が大きくて、サブルーチン側の配列がその中に納まるなら
問題は無いので何も警告しない。
そもそも66時代には、サブルーチン側の配列を10とかに宣言して
サイズの不整合を気にしなかったし、77で整合配列が導入されても
66時代からの習慣などで、整合性は気にしなかった。
配列サイズの整合に姑根性でうるさくされると、昔のプログラムが動かなくなるので
皆困る。おおらかに行こうぜ!
気になるなら、仮引数の終端の方を宣言しなければ、自動でコンパイラ様が
適宜取り計らってくれる。
real, intent(in) :: x(0:) みたいな。
>>184
書いたファイルの中身が見たければアクセスとか指定せずデフォでいけ。
(シーケンシャルアクセス)
write文は自由フォーマットwrite(1,*)で。
191:デフォルトの名無しさん
13/05/17 18:14:46.78 .net
>>185,>>186
ご指導ありがとうございます。
fortranは初めて触った言語で、これで正しいのか不安だったので助かりました。
192:デフォルトの名無しさん
13/05/17 18:29:07.70 .net
direct access は、大量のレコード長(データの長さ)が等しいデータを
書き出しておいて、読み出し/書き換え時に、ランダム位置に直接そのデータを
読みに行くときに使うもの。
普通に不定長のデータをファイルにだらだら書き出して、読み出す時も前から順番に
たらたら読み飛ばしつつ、欲しいデータを探して行くときは、
デフォルトのシーケンシャル・アクセスファイルでいい。
また、人間がファイルを覗いたりするなら、フォーマットを指定して/自由形式にして
読み書きすればいい。
write(1, '(2f15.7)') x,y
write(1, *) x,y
ファイルサイズを小さくかつ高速にアクセスしたいときは、
write文でフォーマットを指定せず、内部表現で読み書きするが、
write(1) x,y
193:182
13/05/17 18:52:41.78 .net
>>186
ご指摘ありがとうございます。U島氏の本にて学習中の身です。
ソースを見直し改めてコンパイル、ビルドしましたが、
外部サブルーチンが読めないと警告してきます(もちろん実行はエラー)。
gfortranですと何の問題もないのですが・・・
上に貼ったものは、gfortranで通ったものを試したもので、
実は、ftn95環境下では、real(8)は、real(kind(1d0))へと正されました。
ひょっとするとまだ、当方が何か見落としているのでしょうか??
194:デフォルトの名無しさん
13/05/17 19:57:06.24 .net
>>189
手元にFTN95の環境が無いので何とも言えないが、
gfortranで行くならftn95の問題かもしれない。
1個のファイルにまとめてみたらどうかな?
ただし、順番に依存するので、メインルーチンは最後に置かないと駄目だと思うが。
まぁサブルーチンをmoduleに入れた方がinterfaceも要らないし楽だと思うが。
195:HIROSHI
13/05/19 23:30:26.19 .net
COMPAQ VISUAL FORTRAN6.6が WIN7 32 HOMEで起動しなくなりました。WIN32 PROでも起動しないことが他にあるのですが、しつこく起動することで使える状態です。
そこであきらめてDOSプロンプトでコンパイル しようと考えています。MAIN.F SUB1.F SUB2.Fのテキスト文がある場合のリンクの方法をお教えください。コピペでまとめてやればいいのですが
細かく ライブラリ化(というのですか) していきたいもので よろしくお願いします。
具体的に 例文で書いてもらったら助かります。
196:デフォルトの名無しさん
13/05/20 16:32:18.84 .net
CVFは先祖がDEC Visual Fortran (DVF)なので、
dfでコンパイラドライバが起動する。
df sub1.f sub2.f main.f
で sub1.exe が出来上がると思う。
デフォでは実行ファイルの名前は先頭のファイル名になる。
moduleなどは先にコンパイルされている必要があるので、main program は
最後に来ることになる。
df /help もしくは-help でヘルプが出るだろう。
CVFは10年以上前のコンパイラなので、目的にもよるが
無理して使うよりは新しいのを手に入れた方がよいかもしれない。
同じプログラムでも、最近のコンパイラではめちゃくちゃ速く実行することが多い。
197:デフォルトの名無しさん
13/05/21 05:28:14.57 .net
>>186
180です。結局、人間がチェックしないとダメみたいですね。
ありがとうございました。
198:デフォルトの名無しさん
13/05/21 15:15:10.76 .net
>>193
正直Fortranではああいう書き方はあまりしないので、チェックにかからない。
66ならサイズは気にしないで、sub(x); x(10)
77なら整合配列で、sub(n, x); real x(n)
90なら形状引継ぎ配列で、sub(x); real, intent(in out) :: x(:)
配列を0から始めると苦難の道が待っているので、数学的要請でない限り
避けるのが吉。
199:デフォルトの名無しさん
13/05/22 22:19:07.20 .net
4バイト整数の変数が,4バイトを超えたときエラーにならず変な値(マイナスになるはずのない値がマイナス)でそのまま計算が進んでしまいます。
プログラムのどのあたりで超えるか知りたいので,エラーで終了するようにするオプション又はデバッグオプションなどありませんか?
コンパイラ : intel fortran version 12 (CentOS 5)
200:デフォルトの名無しさん
13/05/23 01:46:16.08 .net
>>195
昔のDEC Fortranにはinteger overflowの実行時チェックオプションがあったが、intel fortran になってから
そのオプションは無くなった。今もないんじゃないかと思う。
最近配列サイズが4byte整数を超えることが多くなってきたので、このチェックのあるコンパイラがあってもおかしくない気はする。
gfortranとかfreeのfortranも含めて
コンパイラオプションの説明を、便器を舐めるように注意深く読んで見るといいのではないか。
201:デフォルトの名無しさん
13/05/23 17:36:14.83 .net
>>196
一応ifortのhelpでは,"整数"で検索かけてみたんですが,使える物はとくにありませんでした.
目視で全文確認してみます.
ありがとうございました.
202:デフォルトの名無しさん
13/05/24 03:07:21.20 .net
貰い物の古いコードが、グローバル変数をCOMMON文でインクルードしている形式なのですが、
そこのCOMMON文に新しく変数を付け足したところ、
>COMMON のために、オブジェクトのアライメントが型と一致していません
>パフォーマンスに影響を与える可能性があります。
という警告が出ました。
変数の付け足す位置を変えたら出なくなったのですが、どういう意味かわかる方いらっしゃいますか?
203:デフォルトの名無しさん
13/05/24 16:05:35.20 .net
>>198
32bitコンピュータとか64bitコンピュータと呼ばれるように、コンピュータは
ビットの塊を一括して処理する。メモリーアクセスは、0番地から32や64bit
の区切りで一括でなされる。この境界をまたぐと、本来1回で読み書き
できるデータに2回読み書きにいかなければならない。
そういうわけで、最近のFortranコンパイラは、自動的に境界合せをするようになっている。
ところがCOMMON文は、同じメモリー領域の割り付けだから、
コンパイラが変数の位置を勝手にずらすと、対応がずれてしまう可能性が出る。
それでアクセスが遅くなるよと警告している。
COMMON文はグローバル変数というよりも、メモリー割り付けの手動制御と
理解した方が良い。COMMONにあるのがREALとINTEGERだけの場合は、
ズレが起きることは(例外的な場合以外)ないが、文字列などがあると
すぐずれて色々警告される。文字変数は後ろの方に置くのが吉。
FORTRANコンパイラではREALとINTEGERのデフォサイズが共通であるという
(暗黙の?)約束がある。COMMON文での共有があるためだと思うが。
AUTODBLEをつかったりするとずれる可能性が出る。
以前GFORTRANだったかg95だったかが、この約束を破ってド顰蹙を買っていた。
204:デフォルトの名無しさん
13/05/28 02:56:21.83 .net
はじめまして、こんにちは
現在、フォートランで数値計算をするプログラムを作っています。
今日、プログラム内で使っている配列のサイズを極端に大きくしたところ、スタックオーバーフローというエラーになりました。
解決策としては、コンパイルオプションでスタックを初めから大きくするというものがあるそうなのですが、この方法にデメリットはないのでしょうか?
また、これ以外の方法で、皆さんならどのようにオーバーフローを回避しますか?
205:デフォルトの名無しさん
13/05/28 14:05:42.30 .net
>>200
サブルーチンとか関数で大きく確保しようとしたんだろ?
allocatableで確保すれば、ヒープ領域に取られるのでだいじょぶ。
206:デフォルトの名無しさん
13/05/30 12:08:48.19 .net
次のようなデータをファイルから読み込みたいのですが,read文と書式をどう書けばよいか教えてください.
データの並びは
(親核種)(娘核種)(娘核種の比率)(孫核種)(孫核種の比率)(ひ孫核種)(ひ孫核種の比率)…
となっており,何世代まで子孫の核種があるかはファイルを読むまで分からないとします.
207:202
13/05/30 12:11:04.67 .net
---------データの例(はじまり)-------------
Pb-202 Tl-202 1
Pb-210 Bi-210 1 Po-210 1
Pb-212 Bi-212 1 Tl-208 0.40 Po-212 0.71
Bi-210m Ti-206 1
Bi-212 Tl-208 0.36 Po-212 0.65
At-211 Po-211 0.58
Rn-222 Po-218 1 Pb-214 1 Bi-214 1 Po-214 1
---------データの例(おわり)-------------
208:202
13/05/30 12:13:11.61 .net
read(unit=10,fmt='(A,100(:,A,E))') parent, ( progeny(i), progeny_ratio(i), i = 1, 100 )
このように書きましたが,Eに長さの指定がない,とエラーが出ます.
自分が分からない点は以下の二つだと思っています.
1. 任意の桁数の小数を読み込む方法がわからない
2. 一行に任意の個数だけデータが並ぶ場合のreadの仕方がわからない
コンパイラはgfortranを使っています.
209:デフォルトの名無しさん
13/05/30 19:01:21.13 .net
>>204
結構めんどい。
1.任意の桁数の小数を読む最も楽な方法は、自由形式を使うことで、
空白とかコンマが区切りに入っていれば自動で切り分けてくれる。
自由形式を使わない場合は、動的にFORMAT生成する方法がある。
2.任意個のデータを読むのは、エラー上等で読み込んで、iostatで
エラーコードを調べて、END OF RECORD ならおkとか。
しかし、今の場合文字列処理の方が問題。固定長ならまだやりようがあるが、
Bi-210m みたいに長さの違うのが混じると苦しい。
結局、1行ごと文字列として読み込んで、空白をトークンとして自分でパース
していくのが素朴。
Fortran2003/08なら、もう少し柔軟なIOできるかもしれない。
210:デフォルトの名無しさん
13/05/30 19:03:15.49 .net
program twochan
implicit none
integer, parameter :: nmax = 100
character (len = 136) :: buff
character (len = 10) :: parent, progeny(nmax)
real :: progeny_ratio(nmax)
integer :: i, k
do
read(10, '(a)', end = 999) buff
buff = adjustl(buff)
k = index(buff, ' ')
parent = buff(1:k - 1)
buff = adjustl(buff(k:))
i = 0
do while(trim(buff) /= '')
i = i + 1
k = index(buff, ' ')
progeny(i) = adjustl(buff(1: k - 1))
buff = adjustl(buff(k:))
k = index(buff, ' ')
read(buff(:k - 1), *) progeny_ratio(i)
buff = adjustl(buff(k:))
end do
print *, parent, (progeny(k), progeny_ratio(k), k = 1, i)
end do
999 stop
end program twochan
>>206 専ブラインデント用引用符
211:デフォルトの名無しさん
13/05/30 19:04:54.82 .net
実行結果
Pb-202 Tl-202 1.000000
Pb-210 Bi-210 1.000000 Po-210 1.000000
Pb-212 Bi-212 1.000000 Tl-208 0.4000000 Po-212
0.7100000
Bi-210m Ti-206 1.000000
Bi-212 Tl-208 0.3600000 Po-212 0.6500000
At-211 Po-211 0.5800000
Rn-222 Po-218 1.000000 Pb-214 1.000000 Bi-214
1.000000 Po-214 1.000000
212:202
13/05/31 21:54:18.32 .net
すばらしいです!ありがとうございました.
実は,自分もほぼ丸一日試行錯誤した末にできたのですが,
なぜ自分のプログラムがうまく動くのか説明できません.
教えてもらった方法をこれから読んで勉強しようと思います.
213:デフォルトの名無しさん
13/06/11 09:28:34.46 .net
gfortranで通常の宣言型を超えて桁数の上限なしの計算をしたいのですが、
質問1)GMPというのを使えば良いのですか?
(既にPCに入っているとしたら、Ubuntuの場合は、どこのなんてファイル群?)
質問2)GMPを使うとして、どのようにソースを書けば良いですか?
(FMLIBの場合は、最初にuse FMZMとして、型宣言の時にtype(IM)とか)
質問2)他にもっと多倍数演算に向いたツールはありますか?
214:デフォルトの名無しさん
13/06/11 19:54:51.69 .net
質問です学校で COMMAND入力に「XX<YY.dat」という操作をしたのですがどういう意味でしょうか?
215:デフォルトの名無しさん
13/06/11 20:48:28.96 .net
>210
XXというプログラムにYY.datというデータを入力したと
いうことです。
XX>YY.datとすると、XXというプログラムの出力を
YY.datというファイルに出力することを意味します。
216:デフォルトの名無しさん
13/06/12 15:25:51.17 .net
>>209
FMLIBかMPFUNでいいんでね?
Fortranで書かれてるし。
217:デフォルトの名無しさん
13/06/15 12:45:05.08 .net
>>212
FMLIBにて成功しました。ありがとう。
今までintegerしか多倍数演算できなかったんだけど、FMLIBのほうがいい。
218:デフォルトの名無しさん
13/06/17 11:48:46.18 .net
C program main
implicit real*8 (a-h, o-z)
real*8 aa
parameter (c=1.0D0, aa=1.0D0, nmax=200, dx=aa/nmax)
integer n
real*8 x(0:1000)
real*8 y(0:1000)
real*8 k1,k2,k3,k4
open(11, file='0606-1.4data', status='unknown')
C * initial value of y
y(0)=1.0D0
x(0)=0.0D0
n=0
C * solution at x(n)=(n+1)*dx
1 q=1.0d0
p=1.0d0-q
a=q*0.50d0
b=q*0.50d0
219:デフォルトの名無しさん
13/06/17 11:56:31.99 .net
k1 = func(x(n),y(n))
k2 = func(x(n)+b*dx,y(n)+a*k1*dx)
g = p*k1 + q*k2
y(n+1) = y(n) + g*dx
x(n)=(n+1)*dx
ERR=abs(exp(x(n))-y(n+1))
if (mod(n+1,10).eq.0) then
write(6,200) x(n+1), y(n+1), ERR
write(11,200) x(n+1), y(n+1), ERR
end if
if(n==nmax) then
stop 'ended'
end if
n=n+1
go to 1
close(11)
200 format('x=', E13.6, ' result y=', E13.6, ' error ERR=', E13.6)
stop
end
220:デフォルトの名無しさん
13/06/17 11:59:42.72 .net
real*8 function func(x(n),y(n))
implicit real*8 x,y
integer n
real*8 x(0:1000)
real*8 y(0:1000)
func = y(n)
return
end function func
214-216はつながっています。
関数の副プログラムを利用したいのですが、認識してくれません。
どうすればよいでしょうか?
エラー箇所は、Two Main Programsというやつのみでした。
221:デフォルトの名無しさん
13/06/18 14:40:19.36 .net
>>216
関数の定義の所がおかしい。x(n),y(n)→x,y
IMPLICIT文の文法がおかしい。括弧で変数をくくる必要あり。
real*8 function func(x,y)
implicit real*8 (x,y)
今のコンパイラは多少のエラーがあっても、適宜仮定してコンパイルを
続行するが、いまfunction定義の頭部が無視されてコンパイル続行されたため
end文が2回出てきて二個メインプログラムがあるように解釈されたと思われ。
F77的な古典的な書き方をしていて、77本を真面目に勉強しているのだと思うが、
(それはそれで大変結構だが)
副プログラムをMODULEに入れるとかF90以降の現代風にすると、
もっとエラーが容易に見つかる確率が上がると思う。
222:デフォルトの名無しさん
13/07/01 NY:AN:NY.AN .net
最近の大学では数値計算+Fortranの教科書は何を使ってるんだい?
コンピュータの数値計算一切やらないまま入ってくる学生がいて自習してほしいんだが
ヤングに嫌がられないお勧めあるかね?
223:デフォルトの名無しさん
13/07/05 NY:AN:NY.AN .net
ナウいヤング向けの言語はJavaとかか
224:デフォルトの名無しさん
13/07/11 NY:AN:NY.AN .net
自由端反射のプログラムで質問です。
program wave
implicit none
real,dimension(5,0:30)::f
integer::i,n,p,q,r,s,t,u,k
do s=0,30
do q=1,5
f(q,s)=0
end do
end do
do n=1,300
f(3,30)=0
f(3,0)=exp(-((n-30.)/10.)**2)
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do
225:デフォルトの名無しさん
13/07/11 NY:AN:NY.AN .net
do p=0,30
f(1,p)=n
f(2,p)=p
write(*,*)f(1,p),f(2,p),f(3,p)
end do
write(*,*)
do t=0,30
f(5,t)=f(4,t)
f(4,t)=f(3,t)
end do
end do
end program wave
226:デフォルトの名無しさん
13/07/11 NY:AN:NY.AN .net
というプログラムを出力した結果たしか
1. 0. 0.00223
1. 1. 1.4848
ってなって最初fを全部0にしたのにf(3.2)が1.4848となります、何が悪いでしょうか?
227:デフォルトの名無しさん
13/07/12 NY:AN:NY.AN .net
>>222
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do
これでk=0の時、f(4,k-1)→f(4,-1)で配列はみだしだからじゃないか?
まずdebug mode サブスクリプト・チェックをかけて実行しろ!
228:デフォルトの名無しさん
13/08/02 NY:AN:NY.AN Kz7Qk8/h!.net
openmp を使って並列化しようと思ってるんですが、スレッドセーフな副プログラムを作るのに気をつけるのってどういう点ですか?
save と common を使わなければいいだけでしょうか。
save を避けなければならないばあい、擬似乱数のように前の状態を保存しておかなければならないような副プログラムはどうやって作ったらいいでしょうか。
229:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN .net
引数で前の状態を渡し、引数に次の状態を戻す
呼び出し元スレッドと内容を共有するので、実引数は
private なのか share なのか明らかにすること
230:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN zEmYUazP!.net
なるほど。ありがとうございます。
231:デフォルトの名無しさん
13/08/05 NY:AN:NY.AN .net
OpenMPとの整合はよく分からんが、F95以降では
pure接頭子で依存性の無さを保証できる。
というかコンパイラがチェックしてくれる。
232:デフォルトの名無しさん
13/08/06 NY:AN:NY.AN .net
Visual Basicで下記のバイナリ出力したグリッドをfortranで読み込ませようとしてますが,
できません.input statement requires too much data, unit 10
とでます.
233:デフォルトの名無しさん
13/08/06 NY:AN:NY.AN .net
Dim doutpgrid As New System.IO.BinaryWriter(New System.IO.FileStream(Outputfile, IO.FileMode.Create, IO.FileAccess.Write))
For i = 1 To nz
For k = 1 To ny
For j = 1 To nx
doutpgrid.Write(nheader)
doutpgrid.Write(dblX(j, k, i)) : doutpgrid.Write(dbly(j, k, i)) : doutpgrid.Write(dblz(j, k, i))
doutpgrid.Write(nfooter)
Next j
Next k
Next l