• 締切済み

FORTRAN77で・・・

IMPLICIT NONE REAL A(50,50),B(50),X(50),EPS/1E-6/ INTEGER I,KP,N/4/,KPP/50/ DATA (A(1,I),I=1,4)/7.0,2.0,-1.0,1.0/ DATA (A(2,I),I=1,4)/1.0,5.0,1.0,-2.0/ DATA (A(3,I),I=1,4)/2.0,3.0,8.0,1.0/ DATA (A(4,I),I=1,4)/2.0,-2.0,-1.0,10.0/ DATA (B(I),I=1,4)/12.0,6.0,36.0,35.0/ ・・・・ という感じのリストでコンパイルするとREALとINTEGERの行で attempt to give DATAb in type-declaration というエラーが出るのですが、どう対処したらいいのかわかりません。 教えてください。

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

エラーですか?警告でなく? お使いのコンパイラでは型宣言文での初期値設定ができないということでしょうから、DATA文による設定にすればいいだけだと思いますが、何がどうわからないのでしょうか?

関連するQ&A

  • fortran エラーについて

    fortranで、副プログラムを使ってデータを昇順または降順に並べ替えるプログラムを入力して実行しようとしたところ、 ・Unexpected junk in formal argument list at (1) ・Two main PROGRAMs at (1) and (2) という2つのエラーが出ました。 これらの改善方法を教えて頂きたいです。 初心者ですので簡単なところで間違えている可能性もありますが、ご指摘いただければ幸いです。 以下、実際に入力したプログラムです。 ------------------------------ implicit none integer::i,n real::x(1000),a(1000),b(1000) n=1000 open(10,file='input-data-1.txt') do i=1,n read(10,*) x(i) end do close(10) open(10,file='output-data-1.txt') do i=1,n call koukan(i,x(i),a(i),b(i)) write(10,'(i4,2f10.3)') i,a(i),b(i) end do close(10) stop end subroutine koukan(i,x(i),shoujun,koujun) implicit none integer::i,n,made real::x(1000),w,shoujun,koujun do made=n-1,1,-1 do i=1,made if(x(i)>x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do shoujun=x(i) do made=n-1,1,-1 do i=1,made if(x(i)<x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do koujun=x(i) return end ------------------------------

  • fortran 実行結果がうまく表示されない

    グローバルモジュールを用いてプログラムを書いたのですが実行結果が表示されません、プログラム中に問題があるのでしょうか?教えて下さい。 module params implicit none integer :: n = 2 end module params module sample implicit none contains subroutine swapvec3(x,y) use params real(8), intent(inout) :: x(n), y(n) real(8) tmp(n) tmp(1:n) = x(1:n) x(1:n) = y(1:n) y(1:n) = tmp(1:n) end subroutine swapvec3 end module sample program main use sample implicit none real(8), allocatable :: a(:), b(:), tmp(:) integer n allocate(a(n),b(n),tmp(n)) call swapvec3(a,b) call random_seed call random_number(a) call random_number(b) call random_number(tmp) write(*,*) ' a = ', a(1:n) write(*,*) ' b = ', b(1:n) write(*,*) ' tmp = ', tmp(1:n) end program main 実行結果  a = b = tmp =

  • fortranのコメントについて

    昨日からfortranを始めた者です。 調べてみると、コメントアウトするには 先頭を"C"または"*"で始めればいい と書いてあるのですが 以下のように実際にやってみると Unclassifiable statement at (1) とエラーが出てしまいます。 (文の先頭に半角6文字のスペースを入れてあります。 コメント行は"c"と"test"の間に5つスペースが入れてあります。) コンパイル文: g95 read.f90 ソース: ______program read ______implicit none ______integer i ______real r ______character(len=4) c c_____test ______print *,"Please input number" ______read *,i,r,c ______print *,i,r,c ______stop ______end もうひとつ、 上のソースをコメント行なしでコンパイルすると通るのですが 全ての実行ファイルがa.exeとして保存されるので 毎回exeファイルが上書きされる形になってしまいます。 この2点の解決方法ご存知の方いらっしゃいましたら 教えてください。お願いします。

  • fortran 配列受け渡し時の次元の一致

    fortran90、コンパイラはifortです。 普通メインプログラムとサブルーチン間での配列の受け渡しは、次元を揃えて渡すと思います。 とあるコード(以後コードA)を読んでいると、2次元配列を渡し、1次元配列で受け取っていました。 例 program test1 integer :: a(3,3) call testsub(a) end program subroutine testsub(b) integer :: b(9) end subroutine これが受け取り側でどう処理されているのかわからず、調べるために適当なテストコードを書きました。 a 123 456 789 ↓ b 123456789 になるとか 結果、コンパイルは通ったのですがサブルーチン側では全て0で置き換えられてしまいました。 コードAはpgiかなんかでコンパイルしていたようなのでコンパイラの違いでしょうか? よくわらなかったので質問させて頂きました。 質問をまとめますと、 (1)次元の異なる配列の受け渡しができるかどうか (2)その場合中身はどうなるか よろしくお願いします。 ---以下テストコード--- program testa implicit none integer :: a(3,3),i,j do i=1,3 do j=1,3 a(i,j)=j+(i-1)*3 enddo enddo do i=1,3 do j=1,3 write(6,*) a(i,j) enddo enddo call sub1(a) end program subroutine sub1(b) integer :: b(9),i do j=1,9 write(6,*) b(i),'sub' enddo end subroutine

  • fortran 乱数を用いてcosθをベクトリから求めるプログラム

    乱数を配列に格納してcosθをベクトルから求めるプログラムを書いてみたのですが、コンパイルしてみるとrandom_numberのところの設定がおかしいみたいでうまくコンパイルできません。どこに問題があるのかわからないので困っています。教えて下さい。よろしくお願いします。 module subprogs implicit none contains function vec_cos(a,b) result(vcos) real(8), intent(in) :: a(:), b(:) real(8) ab, vcos if (size(a) /= size(b)) stop ' sr : size(a) /= size(b) ' ab = dot_product(a,a) * dot_product(b,b) if (ab == 0.0d0) then vcos = 0.0d0 else vcos = dot_product(a,b)/sqrt(ab) endif end function vec_cos end module subprogs program main use subprogs implicit none real(8), allocatable :: x(:), y(:) integer n write(*,'(a)', advance = 'no') ' input n : ' read(*,*) n if ( n < 1 .or. n > 100 )stop ' n must be 0 < n < 101 ' allocate(x(n),y(n)) call random_seed call random_number(x,y) write(*,*) 'cos = ', vec_cos(x,y) end program main コンパイル結果 Undefined symbols: "_random_number__", referenced from: _MAIN_ in ccxYbc0C.o ld: symbol(s) not found

  • Fortran:列数の分からないデータの読み込み

    列数の分からないcsvファイルを想定して、配列を用いて読み込むプログラムを作成しようと考えています。 試しに十分に大きい1次元配列を用いてデータを読みこむプログラムを作成したところ 1行目読み込み時に行をまたいでデータを読み込んでしまいました。 なんとか、各行のデータだけを読み取る方法はないでしょうか? よろしくお願いします。 ちなみにプログラムの内容、入力データ、出力結果は次の通りです。 ・プログラム implicit none integer a(5),i open(10,file='a.csv',status='old') read(10,*)(a(i),i=1,5) write(*,*)(a(i),i=1,5) close(10) ・入力データ     1,2,3,4     5,6,7,8     9,1,2,3 ・出力結果     1 2 3 4 5

  • FORTRAN77(g77)で(D)CBRTがエラーになってしまいます

    FORTRAN77(g77)をVine Linux 4.2で使用しています。 立方根の計算をしたいのですが、コンパイル時に"(D)CBRT"がエラーになってしまいます。 原因・代替策など御助言いただければ幸いです。 なお、(D)SQRTは問題なくコンパイル・実行できました。 以下、テスト用ソースとそのコンパイル時のエラーメッセージです。 [ソース] program a implicit none real*8 n write(*,*)"n= ?" read(*,*)n write(*,*)DCBRT(n) stop end [エラーメッセージ] a.f: In program `a': a.f:6: write(*,*)DCBRT(n) ^ Invalid declaration of or reference to symbol `dcbrt' at (^) [initially seen at (^)] ※こちらの画面ではスペースがうまく入りませんので悪しからず。

  • fortran 配列

    はじめまして。fortranを勉強しているのですが割付け配列がよく理解できないので教えていただきたいのですが。以下に自分で作った簡単なプログラムを実行していたのですが正しい値になりません。どこが間違っているのでしょうか?教えて下さい。よろしくお願いします。 program list2_3 implicit none real(8), allocatable :: u(:), v(:) integer :: i, n = 2 real(8) dotp allocate (u(n), v(n)) u(1:2) = (/1.2d0,3.4d0/) v(1:2) = (/4.1d0,2.6d0/) dotp = 0.0d0 do i = 1, n dotp = dotp + u(n) * v(n) enddo deallocate (u, v) write(*,*) ' dot product =' , dotp end program list2_3

  • fortran90 の簡単なコード

    初めて質問させていただきます。 fortran を使い15を任意の数で割るプログラムを作成しようとしているのですが 実行時に n を read し結果を書き出すとn+1個の数値が書き出されてしまいます。かつ、n+1個目の数が全く予想しない数値になってしまいます… コンパイルエラーは発生しません。 初心者なりにひとつひとつ精査したのですが原因がわかりません。 お助けください、よろしくお願いいたします。 画像:実行時n=10としたときの例 PROGRAM work6 IMPLICIT NONE REAL , ALLOCATABLE :: x(:) REAL :: dx INTEGER :: n PRINT *,' How many numbers do you separate it? ' READ(*,*) n ALLOCATE (x(n)) dx=15.0/REAL(n) do n=1,n x(n)=dx*REAL(n) enddo  PRINT *,x(1:n)  READ (*,*) ENDPROGRAM work6

  • fortran 固有値を求めるプログラム

    2x2の実行列の固有値を求めるモジュール関数の中で、d > 0 のときに出てくる sign(squt(d), -b)の値が示す意味と eval(2) = cmplx(c/e,0.0d0) でなぜ c/eの値が入るのかがわかりません。教えて下さい。よろしくお願いします。 プログラム module subprogs implicit none contains function eval2x2mat(a) result(eval) real(8), intent(in) :: a(:,:) complex(8) eval(2) real(8) b, c, d, e if (size(a,1) /= size(a,2)) stop ' not square ' if (size(a,1) /= 2) stop ' not 2x2 matrix ' b = -0.5d0*(a(1,1)+a(2,2)) c = a(1,1)*a(2,2)-a(1,2)*a(2,1) d = b**2-c if ( d < 0.0d0 ) then eval(1) = cmplx(-b,sqrt(-d)) eval(2) = conjg(eval(1)) else if ( d > 0.0d0 ) then e = -b+sign(sqrt(d),-b) ←ここの部分 eval(1) = cmplx(e,0.0d0) eval(2) = cmplx(c/e,0.0d0) else          ↑ここの部分 eval(1) = cmplx(-b,0.0d0) eval(2) = eval(1) endif end function eval2x2mat end module subprogs program main use subprogs implicit none real(8), allocatable :: a(:,:) integer :: n = 2 allocate(a(n,n)) a(1,1:2) = (/-1,1/) a(2,1:2) = (/-1,-1/) write(*,*) a(:,:), eval2x2mat(a) end program main

専門家に質問してみよう