2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

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

1 :デフォルトの名無しさん:2012/08/16(木) 20:58:00.31 .net
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

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

●前スレ
くだすれFORTRAN(超初心者用)その5
http://toro.2ch.net/test/read.cgi/tech/1269704830/

●過去スレ
くだすれFORTRAN(超初心者用)その4
http://pc12.2ch.net/test/read.cgi/tech/1232789521/
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/

2 :デフォルトの名無しさん:2012/08/16(木) 21:32:02.53 .net
           , r‐‐ 、_
        ,  ´ ̄  ´ ̄    ̄ミ 、   ____/: : : : ヽ、
    __./         `¨       \/: : : : : : : : :: : :  : : : : : : : : }
     / /// // /  ,.、  /     /  : : : : : : : : :   : : : : : : /
    _,ァ≫イ/ / / /  <、\>′   ヽ{  : :\      フ: : : : :/
      イ/| //ー-、   />/`Y    ∧\.:: : : :ヽ   /: : : :/   ) (
     彡' ノ,イ{/{__///「/¨ヽ.! ! | .}}  /: : :.i  /: : : : :/   (   )
       彡' ノ }イ:::} ´´ r=ミ、 }ノ 1 小      /: : : : :/  (   ノ            こ、これは>>1乙じゃなくて
            片ソ   /:::しヘ从 j/从.ゝ 彡/: : : : :/            |\        レンコンしそ餃子の湯気なんだからね
        {:::::、   廴::/}{/ ,'{/  /  ,': : : : /      (     (. |: : \       今後は、気をつけなさい!!
           ヽ ー  :::::    ∨{彡'.:.:.:.:. :/i: : : : :{     (  )   |: : : :.ヽ      
             \__  イ≦_¨\ \_ {: : : : :丶_______.ノ: : : : : }
        、____xー|.   |, -、`   ヽ _.: '.: : : : : : : : : : : : : : : : : : : : : : /_
        / // / ー / /》ー--、  l-‐ \: : : : : : : : : : : : : : : : : : イ   ゙ ヽ
        ノ // /ヘ/  ///     \ /   /,,r"i/ ,r"i/,,r"i/,,r"i  、 ヽ
     /   // ,'⌒/.   ///      }/ ./  /#; / /#.; / //#; / ,/#; / .," i  |
     V //  i /   ///       `ヽi. /#; / ,/#; ./ /#;; / ,/#; / .,'   / /
       片厶≦j/ヘ  //〈        /.  |〃/ ,|〃/ ,|〃/ , |〃/ .,"..;;/ /
      `ー'⌒Y⌒ヽ //  ヽ-====<  ヽ   ヽゝ' `ヽゝ~ ヽゝ ~ヽゝ'  " /
                           ゙ ー-- 、、... _ __,,,,, .... --―"




3 :デフォルトの名無しさん:2012/08/17(金) 02:14:17.73 .net
> 初心者に適切な指導もなくプログラム書かせているのはアカハラの域に達してるな。

これって割と多いような気がするな。
まあ分野によっちゃいずれ必要になることが前前から分かっていそうな気もするのだが
それも指導のうちと言えばそうだ

4 :デフォルトの名無しさん:2012/08/17(金) 04:02:00.57 .net
do i=2,1000
write(*,*) '1otsu'
enddo

5 :デフォルトの名無しさん:2012/08/17(金) 19:12:19.36 .net
>>3
昔は先輩が教えることが前提となっていたから成立したが、
最近、先輩がいなかったり、知らなかったりで、伝承が途切れている。
時代の変化に、サヨクかぶれの爺さんたちの現状認識が追いついていない。
連中は鳩山みたいに夢を見て、管みたいに怒鳴り散らしてるからw

6 :デフォルトの名無しさん:2012/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)

という修正をくわえればよろしいでしょうか?




7 :デフォルトの名無しさん:2012/08/17(金) 20:51:34.50 .net
>>6
それだと出力してない。
OPEN と CLOSE の間で出力する。

ただ一度に欲張らず、まず固定された入力ファイルと出力ファイルで
ちゃんと計算できるプログラムをつくって確認しておくべき。

その後、色々ループさせたり、ファイル名を変えたり出来るようにすべき。
ものには順番があり、近くから遠くへ及ぼすべしとは、四書のはじめ大学にも書いてあるw

8 :デフォルトの名無しさん:2012/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

9 :デフォルトの名無しさん:2012/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


10 :デフォルトの名無しさん:2012/08/17(金) 21:38:35.93 .net
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)

write(*,*) 'result=', s ! <--だから結果を書きだせってw

close(14)

11 :デフォルトの名無しさん:2012/08/17(金) 21:39:27.86 .net
write(14,*) 'result=', s ! <--だから結果を書きだせってw

思わず間違えたwwww

12 :デフォルトの名無しさん:2012/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)

こういうことでしょうか?


13 :デフォルトの名無しさん:2012/08/17(金) 22:03:15.16 .net
そうそう。欲しい結果を書きだす。
本来は、入力ファイル名や計算したカラム(列)番号のような
付加的な情報も書いておくべきだろうが・・・

open(14,file = trim(filenm) ) ! <- こっちもTRIMで尻の空白を削っておくべし。


14 :12:2012/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

こちらの掲示板に来て良かったです。
色々こんなデキの悪い自分に付き合ってくださってありがとうございました。



15 :デフォルトの名無しさん:2012/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


16 :12:2012/08/17(金) 23:31:33.54 .net
>>15
度々すみません。親切にありがとうございます。
プログラムに組み込ませていただきます!

今日もかれこれ5時間くらいネカフェにいますが、
そろそろおいとまします。自転車こいで橋を越えた甲斐がありました。
また色々教えてください。

17 :12:2012/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

18 :12:2012/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



19 :12:2012/08/17(金) 23:48:58.52 .net
本日もどうもありがとうございました。
お先に失礼します。

20 :sage:2012/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行の値を使うということです。

上手く説明できませんがお願いします。

21 :デフォルトの名無しさん:2012/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

22 :12:2012/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')


23 :12:2012/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


24 :12:2012/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のみ読み込んで
計算過程に組み込ませたいです。


25 :12:2012/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列をそれぞれの計算結果を一度に同じメモ帳の中で算出結果を
表示させたいと考えています。
稚拙な文章で申し訳ありませんが、よろしくお願いします。

26 :デフォルトの名無しさん:2012/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

27 :デフォルトの名無しさん:2012/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

28 :デフォルトの名無しさん:2012/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 の誤記?それとも別の変数?

29 :デフォルトの名無しさん:2012/08/28(火) 04:12:53.24 .net
>>27>>28
返信遅くなってすみません。家の方で一週間以上経っても書き込み規制が解除されないみたいで、
またネカフェからです。月曜日に現状の報告会があったので、準備やらなんやらで閲覧が
遅れてしまい、申し訳ありません。
毎回教えていただきありがとうございます。

>この s って sx か sy の誤記?それとも別の変数?
この質問なんですが、私の持っているfortranの本にシグマ(Σ)を使った合計値の算出のプログラム例に記されていたので
そのまま作ったものです。ですので、この形で載っていただけので、そのまま使っています。sは一応s=s+1みたいな感じで
s=1とすると右辺に数値が代入され、左辺にs=2と計算させるような感じで入力した値を表現したつもりです。


30 :12:2012/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)

31 :12:2012/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しないと
前のデータが残ってしまい、正しい計算ができない原因と考えられますか?
すみません、どんなことでも結構なので教えていただけると幸いです。よろしくお願いします。


32 :12:2012/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


33 :12:2012/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




34 :12:2012/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)

35 :デフォルトの名無しさん:2012/08/29(水) 17:11:03.66 .net
>>34
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do    !
    ↑
ここに全角文字の空白が入っている。それでエラーが出ている。
削れ。
残りのエラーは、それを直せば消える。

あんま全角文字は使わない方がいい。

36 :デフォルトの名無しさん:2012/08/29(水) 17:48:31.37 .net
lexical error: Invalid character

エラーメッセージの意味を調べておくといいよ

37 :12:2012/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


38 :12:2012/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

39 :12:2012/08/29(水) 19:32:33.20 .net
>>35
上記でコンパイルすることができ、ご指摘本当にありがとうございました。
「icol」なんですが、warningがでてしまって、式に直接関係しない変数なので
消してみたら消えました。たぶん、自分の使っているバージョンが古いため
警告がでちゃったと思います。

(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
師からわかっている値なのでこっちにした方がよいと言われました。

あと、本日コンパイルまで無事こぎつけることができたのですが、どうも計算結果がおかしい
ということだったので、師が今日初めて細かくプログラム内容を見てくれたのですが、
私の説明不足ですみません。以下にメモ帳のデータのところで追記させてください。

>>36
そうしてみます。

40 :12:2012/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

41 :12:2012/08/29(水) 20:19:49.56 .net
>>36

返信おくれてすみません。
lexical error :invalid character
語彙の 間違い:不正文字


オペレーターの入力ミスということでしょうか?

42 :デフォルトの名無しさん:2012/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)


43 :デフォルトの名無しさん:2012/08/29(水) 20:46:18.21 .net
>(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
>師からわかっている値なのでこっちにした方がよいと言われました。

今時の常識では、数値述べたうちは避けて、常数にする。
Fortranの場合はparameterにするのがふつう。


44 :デフォルトの名無しさん:2012/08/29(水) 21:38:00.28 .net
>>43
ありがとうございます。
parameterというのはC言語でいうconstのような、
変数として宣言はするが変更はできないものと捉えて問題ないでしょうか?
となりますと「不要な6行」もそれに倣って

integer, parameter :: ncolumn = 18, ndata = 400, gomi = 6
                             ^^^^^^^^^
などとしておくべきでしょうか?

>>36
エラーの意味がやっと分かりました。
関数や変数に使えない文字を、クォートの外に書いてしまうと発生するエラーなんですね。
シンタックスエラーと似ていると思いました。
特に全角空白は識別しづらいので気を付けるよう留意します。

>>42
なるほど、ダミーを用意するのですか。こういう発想は素晴らしいと思います。
読み捨てるだけのために宣言される変数・・・儚いですね。


プログラミング自体が初めてなので右も左もわからない状態だったのですが、
みなさんのおかげで金輪際ここに来ることはないと思います。
長々とお付き合いいただきありがとうございました。

45 :デフォルトの名無しさん:2012/08/29(水) 21:48:48.84 .net
> FOR4265: symbol ICOL referenced but not set
参照しているけど値が入ってない、だとさ。

> 全角空白
IME から空白文字の入力を常に半角にすると良いぞ。

> 常数
定数じゃないのと思ったがどっちでもいいのか
函数と関数のような。

この 400 とか 18 とか何の数だったっけ?
とならんように意味のある変数(名前)で置く。
18 列じゃなくて 19 列だったときも ndata の値を変えるだけだ。

46 :12:2012/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時以降になります。

47 :12:2012/08/29(水) 23:53:21.35 .net
>>42
今後ともよろしくお願いします。
自分は無礼な発言やおかしいことは言いませんので、
その44の人は別人だし無視してください。


48 :デフォルトの名無しさん:2012/08/30(木) 01:04:47.20 .net
我々がこの「師」とやらと話し合った方が早いな

49 :デフォルトの名無しさん:2012/08/30(木) 01:26:24.03 .net
> よそのvisual basicの方にでもいってやってきてください。

失礼しちゃうわw

50 :デフォルトの名無しさん:2012/08/30(木) 01:30:42.54 .net
>>41 手元にマニュアルもないの? というか目を通してる?

どうやら荒らしらしい>>44にも有益な情報は含まれてるんだよな。
頭に血が昇ってるようだけど、もう少し言われたことについて自分で考えた方がいいぞ。
前スレから。

51 :デフォルトの名無しさん:2012/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規格で
許されない文字に対応してしまうことがある。
またクォート以外にもコメントでは許されている。



52 :12:2012/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列読み込んで、対応した値同士で計算させた方が良いというアドバイスを受けました。
下記にエクセルデータの全体像を記載します。

53 :12:2012/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)

54 :デフォルトの名無しさん:2012/08/30(木) 20:25:51.02 .net
修正すれば良いでしょうかじゃなくてまずはやってみろよ
前向きな姿勢は結構だけど結局は質問するばかり、
理解する力が著しく欠如しているのではないか

55 :12:2012/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


56 :デフォルトの名無しさん:2012/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



57 :12:2012/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ほど残っているので、頑張ってタイピングしようと
思います。またやっていて困った時は相談にのってやってください。
ありがとうございました。



58 :デフォルトの名無しさん:2012/09/05(水) 15:32:34.90 .net
コンパイラを Intel visual fortran から PGI visual fortran に変更したところ、
ビルド時に
Unable to open MODULE file ifport.mod
でエラーになります。

ifport では access と DELFILESQQ を使用しているのですが、
PGIのコンパイラで使用できる同種のライブラリはありますでしょうか。

59 :デフォルトの名無しさん:2012/09/05(水) 22:38:16.39 .net
>>58
少しはマニュアルくらい読めよw
DEC時代の名前で存在している。ifortでなくてdfortとかiをdに変えればおk。

60 :デフォルトの名無しさん:2012/09/07(金) 20:00:53.25 .net
それで>>58は解決したのかよ。
PGIのCUDA対応に興味あるから、色々反応するの待ってんだけど。

61 :58:2012/09/10(月) 16:56:11.03 .net
>>60
解決しました。ありがとうございます!

62 :デフォルトの名無しさん:2012/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文のフォーマットの記述がおかしいと思うのですが
どこがおかしいのか分からず質問させていただきました。
おかしな点を指摘していただけると幸いです。

63 :デフォルトの名無しさん:2012/09/15(土) 19:24:02.52 .net
たぶんおかしくない。それより WRITE(6,60) でソースコードを検索してみるべき。

64 :デフォルトの名無しさん:2012/09/15(土) 19:31:56.26 .net
↑すまん適当言った。C と D は複素数か配列じゃないだろうか。

65 :62:2012/09/16(日) 17:07:32.38 .net
>>64
ありがとうございます!無事解が一つのみ表示されました。
ご指摘の通りCとDが複素数で宣言されていました・・・・
それにすら気づかず、write文のせいにしていたのが恥ずかしいです。
大変助かりました!

66 :デフォルトの名無しさん:2012/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

ここから何行目の何列目を指定して一つの数値を計算式に代入して「求めたい値」を算出したいのですが
可能でしょうか?

67 :66:2012/09/18(火) 19:44:05.52 .net
すみません、追記です。

メモ帳データの数値はすべて使用して計算結果として算出したいので、
一枚のメモ帳に結果がすべて表示できる方法があったらお願いします。

68 :デフォルトの名無しさん:2012/09/18(火) 19:50:35.33 .net
この辺を見ておくといいよ
http://www.nag-j.co.jp/fortran/index.html

69 :デフォルトの名無しさん:2012/09/19(水) 03:23:00.74 .net
とりあえずファイルのデータを全部2次元配列に放り込んで
結果も2次元配列の内容を全部吐き出す感じでいいだろ。
x, y に任意の組み合わせを取るなら単純じゃなくなるが。

70 :デフォルトの名無しさん:2012/09/21(金) 20:29:19.20 .net
プログラムの歴史を学ぼうと思って、FORTRANからやってみようと思いました。

FOTRANのバージョンとか歴史はある程度理解したんですが、
WikipediaのFORTRANの歴史に載っています所謂IBM 704用のFORTRANの最初期の形なんてのは今のPCじゃ動かないんでしょうか?
標準入出力の関係もまだなかったみたいですし、多分そもそも現代のコンピュータ上では実装できないんでしょうけど。

FORTRANの歴史
http://ja.wikipedia.org/wiki/FORTRAN#FORTRAN.E3.81.AE.E6.AD.B4.E5.8F.B2

まぁ、今は諦めまして、Linuxにgfortranを入れたとこです。


Wikipediaの項目を見てたら下記リンクにあるのが昔の正規のドキュメントかなと思っているのですが、
さすがにコンパイラはIBMのものでしょうし、見ることができないですよね。出来たら初期の高級言語のコンパイラのソースも見てみたいんですけど。まぁ、見たってきっとわかりませんがね。アセンブラなんでしょうか?機械語?

Index of /pdf/ibm/704
http://www.bitsavers.org/pdf/ibm/704/

それで、これが一番最初のFORTRANの正式なドキュメントかな?と思っているのですが、当たりですかね?
http://www.bitsavers.org/pdf/ibm/704/FORTRAN_paper_1957.pdf


71 :デフォルトの名無しさん:2012/09/22(土) 12:09:47.77 .net
もともとが業務用だからね。

72 :66:2012/09/24(月) 16:11:25.31 .net
>>68>>69
ありがとうございます。

73 :デフォルトの名無しさん:2012/09/24(月) 18:53:46.75 .net
>>70
FORTRANの歴史を知りたいなら、Comuter History Museumをチェックしなければ
いかんがねー。
http://www.computerhistory.org/collections/fortranarchive/

たしか、バッカスのFORTRANコンパイラを作りたいと上申書みたいなメモから
あった気がする。マニュアルの類も文法書の他運用書などたくさんある。

704のエミュはなかったが、後のIBM360やIBM1130のエミュは存在している。
その上でFORTRANIVは動いている。FORTRANIIも動いていたかもしれない。
この時代のソフトウェアは著作権の概念がなかったのかパブリックドメインに
なっているよう。時代の進んだIBM370とかFORTRAN77のFORT VSとかのエミュはない。

昔のFORTRANのマシンコードなんかはパンチカードだか、ダンプリストだかが
うpされていた気がするので機械語レベルでは転がってる気がした。

74 :デフォルトの名無しさん:2012/09/24(月) 18:57:59.58 .net
エミュとかはComputerHistoryMuseumではなく、民間のおっさん達がやってる。
ググれば出てくる。


75 :デフォルトの名無しさん:2012/09/24(月) 19:22:07.62 .net
>もともとが業務用だからね。

もしかして“適用業務”のことかw

76 :66:2012/09/26(水) 19:24:13.20 .net
結局、自分でプログラム組めるほど頭良くないので電卓で手打ち
でやってたんですが、エクセルでやることにしました。
フォートランは、エクセルと比べどういう計算処理をする場合に
特化しているんでしょうか?計算するんだったらfortranが一番
おすすめだそうなのでやってみたんですがチンプンカンプンです。
(>_<)

77 :デフォルトの名無しさん:2012/09/26(水) 21:49:19.25 .net
Excel でできる程度の計算なら Excel でやれば良し。
Excel とか無い時代の産物なので、伝統か信仰によって勧められる事が多い。

78 :デフォルトの名無しさん:2012/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で文字を出力するために使う”と、出力する文字の一つとして扱いたい”が干渉してしまうんです。


”を文字として出力するためにはどうしたらよいでしょうか?
どなたかわかる方がいたら教えていただけませんか?

79 :デフォルトの名無しさん:2012/10/16(火) 21:27:08.31 .net
>>78
確かにそういときどうすんだろ
考えたこともなかったわ

80 :デフォルトの名無しさん:2012/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 となるが。


81 :デフォルトの名無しさん:2012/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


82 :デフォルトの名無しさん:2012/10/16(火) 23:03:43.98 .net
'(a, i0, a)'
でいいんじゃないの?

83 :デフォルトの名無しさん:2012/10/16(火) 23:35:22.01 .net
>>82
うむ。
i0ってF2003からの機能だと思っていたが、F95から入ってたんだな。
勘違いしてたわ。
一応F95標準縛りをかけていたつもりだったので避けたが、i0 で楽勝だな。


84 :デフォルトの名無しさん:2012/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


85 :デフォルトの名無しさん:2012/11/18(日) 12:45:02.25 .net
バッチファイルをそのまま生成させるって頭いいな

86 :デフォルトの名無しさん:2012/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
みたいに配列を明示しようとすると
配列の形状が準拠していません。
とエラーが出ます。

()を省略しないで書く方法はないですか?

87 :デフォルトの名無しさん:2012/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(:))
にすれば()付きの書き方にはなります。

88 :デフォルトの名無しさん:2012/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

のようなことは関数の場合、出来ないのですか?
(:)だと出来ることが制限されてしまうような気がするんです。

89 :デフォルトの名無しさん:2012/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))

となるかな

90 :デフォルトの名無しさん:2012/11/24(土) 14:54:58.79 .net
それか関数の方を 配列じゃなくて 数値を引数とするように変更するかだな

91 :デフォルトの名無しさん:2012/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でもいい。

92 :デフォルトの名無しさん:2012/12/01(土) 20:48:26.42 .net
ELEMENTAL属性ってのは初めて聞いた 勉強になります
兄ぃありがとう

93 :デフォルトの名無しさん:2012/12/02(日) 15:08:21.56 .net
(ELEMENTALはPUREでもあるから強調しなくてもいいんだけどな…

94 :デフォルトの名無しさん:2012/12/02(日) 16:57:51.30 .net
x(:)=fd(w(:))
x=fd(w)

って同じ?
: つけとかないと配列であることを
忘れちゃうので
つける習慣にしているけど。

95 :デフォルトの名無しさん:2012/12/02(日) 17:13:25.97 .net
同じだけど、括弧をつけて配列であることを明示したほうがいいね

96 :デフォルトの名無しさん:2012/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

97 :デフォルトの名無しさん:2012/12/03(月) 23:06:44.99 .net
(キリッ

98 :デフォルトの名無しさん:2012/12/04(火) 13:45:46.84 .net
>>96
2003使ったことないけど、うーんと、
要は allocatable な変数は
allocate() 使わなくても、
: 無しで左辺において、
固定サイズ(か既に大きさの確定した配列)が右辺に来る代入式で
随時 deallocate して再び allocate した事にする、
ということなのかな?

・・・・すくなくともワシには危険な香りがするw

99 :デフォルトの名無しさん:2012/12/04(火) 13:48:18.15 .net
ふとおもったけど、文字列で
mojiretsu='abcdefg'
write(*,*) mojiretu(2:4)
で bcd が表示できる例のように
文字列の番地管理の表記法って77からある(とおもうw)けど
これってかなり時代先取りだよね。偶然なのか
規格策定の時にすでにベクトル表現の思考が始まっていたのか
しらないけど。

100 :デフォルトの名無しさん:2012/12/04(火) 17:50:34.81 .net
>>98
2003ではおっしゃる通り、サイズの違う配列が右辺に来ると、勝手にDEALLOCTAEして
右辺のサイズにALLOCATEし直して代入する。
Intel Fortranではデフォルトのオプションでこの機能が切られている。

最近の言語は動的なんちゃらで、みんなそんな感じだから流行り?
危ないけど便利。

>>99
90からはwrite(*,*) 'abcdefg'(2:4)と定文字列?でもできるぞ。

356 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★