🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1058閲覧

fortran 別々のはずの3次元配列と2次元配列の値がなぜかリンクしてしまっているのを独立な配列にしたい

Hart

総合スコア6

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/12/09 14:08

前提・実現したいこと

fortranにおいて、別々に配列しているはずの二次元配列と三次元配列の数値がリンクしてしまいます。fortranには不慣れなため、なぜこうなってしまうのかわかりません。誰か教えてくださると幸いです。

発生している問題

subroutine gs_matにおいて、別々に配列しているはずの二次元配列'c'と三次元配列'a'の数値がなぜかリンクにしており、'c'の値のみ変更したくても'a'の値も変わってしまう

該当のソースコード

fortran

1module linertruss 2 implicit none 3contains 4 5 subroutine es_mat(n,a,S,E,length) 6 integer, intent(in) :: n 7 integer i,j,l 8 real(8), intent(in) :: S,E,length(n) 9 real(8), intent(out) :: a(2,2,n) 10 real(8) k 11 write(*,*) S,E 12 do l=1,n 13 write(*,*) S,E,length(l) 14 k=0.0d0 15 k=S*E/length(l)*10**3 16 write(*,*) k 17 do j=1,2 18 do i=1,2 19 if(i==j)then 20 a(i,j,l)=k 21 else 22 a(i,j,l)=-k 23 endif 24 enddo 25 enddo 26 enddo 27 endsubroutine es_mat 28 29 30 subroutine print_mat(a,n) 31 integer, intent(in) :: n 32 integer i,j,k 33 real(8), intent(in) :: a(2,2,n) 34 do k=1,n 35 do i=1,2 36 write(*,*) (a(i,j,k), j=1,2) 37 end do 38 end do 39 end subroutine print_mat 40 41 subroutine setvalue(n,S,E,length,el) 42 integer :: n,el(n+1),i 43 real(8) :: S,E,length(n) 44 n=2 45 do i=1,n+1 46 el(i)=0 47 enddo 48 el(1)=1 49 S=1.0d0 50 E=210.0d0 51 length(1)=210.0d0 52 length(2)=420.0d0 53 end subroutine setvalue 54 55 subroutine gs_mat(n,a,c,el) !このsubroutineで問題が起きています 56 integer n, el(n+1) 57 integer i,j 58 real(8),intent(in) :: a(2,2,n) 59 real(8),intent(out) :: c(n+1,n+1) 60 write(*,*) a(1,1,2) 61 c=0 62 write(*,*) a(1,1,2) 63 do i=1,n+1 64 write(*,*) (c(i,j), j=1,n+1) 65 enddo 66 write(*,*) n 67 ! do i=1,n+1 68 ! do j=1,n+1 69 ! c(i,j)=0.0d0 70 ! enddo 71 ! enddo 72 do i=1,n+1 73 write(*,*) (c(i,j), j=1,n+1) 74 enddo 75 write(*,*) a(1,1,2) 76 do i=1,n 77 c(i,i)=c(i,i)+a(1,1,i) 78 ! c(i,i+1)=c(i,i+1)+a(1,2,i) 79 ! c(i+1,i)=c(i+1,i)+a(2,1,i) 80 ! c(i+1,i+1)=c(i+1,i+1)+a(2,2,i) 81 enddo 82 do i=1,n+1 83 write(*,*) (c(i,j), j=1,n+1) 84 end do 85 do i=1,n+1 86 if(el(i)==1) c(i,i)=10000000.0d0 87 enddo 88 do i=1,n+1 89 write(*,*) (c(i,j), j=1,n+1) 90 end do 91 endsubroutine gs_mat 92 93end module linertruss 94 95program kadai1 96 use linertruss 97 implicit none 98 integer n,i,j 99 integer,allocatable :: el(:) 100 real(8) S, E 101 real(8), allocatable :: a(:,:,:), u(:), f(:), length(:) 102 real(8), allocatable :: c(:,:) 103 allocate (length(n)) 104 allocate (el(n+1)) 105 allocate (a(2,2,n)) 106 allocate (c(n+1,n+1)) 107 allocate (u(n+1)) 108 allocate (f(n+1)) 109 call setvalue(n,S,E,length,el) 110 write(*,*) el(1:n+1) 111 call es_mat(n,a,S,E,length) 112 call print_mat(a,n) 113 write(*,*) n,a(1,1,2) 114 call gs_mat(n,a,c,el) !このsubroutineにおいて、aの配列の値は変えず、cの配列の値のみ変えたいのにaの値も変わってしまいます 115end program kadai1 116

試したこと

初めての事例なため、何を試せばいいのかわかりません

補足情報

macos,Mojave10.14.6
MacbookAir Early2015において起きています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

メインプログラムで、nが定義されないまま使われて配列が確保されています。
この辺に問題があるのではないでしょうか?

投稿2019/12/09 16:00

curehoney

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hart

2019/12/10 11:49

その通りでした、回答してくださりありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問