Apa gaya yang bagus untuk deklarasi variabel di fortran?

Jadi saya punya banyak variabel yang perlu saya deklarasikan, dan kode aslinya terlihat seperti ini:

    DIMENSION energy_t(20000),nrt(20000),npsh(1000),xx(1000),yy(1000),
    :step(1000),stepz(1000),r1(1000),rr(1000),ic(1000),diffrr(1000)

Dan saya menulis ulang seperti ini:

    DIMENSION
    :energy_t(20000),
    :nrt(20000),
    :npsh(1000),
    :step(1000),
    :r1(1000),
    :rr(1000),
    :ic(1000),
    :diffrr(1000)

Apakah ini dianggap gaya yang baik, atau adakah cara yang lebih baik? Perhatikan bahwa cara kedua memungkinkan komentar dengan setiap variabel, dan saya tidak perlu menggunakan kelanjutan baris jika saya ingin menambahkan variabel lain.

P.S.: apakah ada konsensus/kitab gaya/sumber yang diakui secara luas tentang gaya & praktik baik pemrograman Fortran?


person Jan M.    schedule 11.03.2014    source sumber


Jawaban (2)


Gaya yang baik adalah tidak menggunakan pernyataan dimensi sejak awal. Apalagi jika Anda menggunakan pengetikan implisit. Setiap variabel harus memiliki tipe yang dideklarasikan dan lebih baik meletakkan dimensi array di sana. Gunakan atribut dengan deklarasi tipe (Fortran 90+).

real :: energy_t(20000), nrt(20000)
real, dimension(1000) :: npsh, xx, yy, step, stepz, r1, rr, ic, diffrr

Usahakan antrean tidak terlalu panjang. Kedua cara menyatakan ukuran (bentuk) dimungkinkan.

Jika Anda membutuhkan Fortran 77, Anda lebih terbatas, tapi tetap saja

real energy_t(20000), nrt(20000)
real npsh(1000), xx(1000), yy(1000), step(1000), stepz(1000)
real r1(1000), rr(1000), ic(1000), diffrr(1000)

mungkin lebih baik.

Cobalah untuk mengelompokkan variabel-variabel yang berkaitan pada satu baris dan variabel lainnya pada baris yang berbeda.

Saya juga menyarankan untuk mendeklarasikan konstanta parameter untuk ukuran 1000 dan 20000.

person Vladimir F    schedule 11.03.2014
comment
Poin (mungkin sangat kecil): waspadalah terhadap pengetikan implisit yang mengubah pernyataan DIMENSION menjadi atribut DIMENSION. - person francescalus; 11.03.2014
comment
Apa yang salah dengan dimensi? Saya harus mengatakan bahwa program ini menggunakan IMPLICIT REAL*8 (a-h,o-z), jika itu ada relevansinya. - person Jan M.; 11.03.2014
comment
Tidak ada yang salah dengan pernyataan dimensi, tetapi pernyataan ini cenderung digabungkan dengan pengetikan implisit (yang tidak disukai). Lebih lanjut, menyatukan tipe dan atribut dalam deklarasi jauh lebih baik daripada harus mencari-cari kode untuk mendapatkan gambaran lengkap tentang arti suatu variabel. [Memang benar, di F77 atributnya jauh lebih sedikit, tapi tetap saja...] - person francescalus; 11.03.2014
comment
@PatronBernard Saya sarankan untuk tidak mengetik secara implisit. - person Kyle Kanos; 11.03.2014
comment
Ya, saya menduga kode ini ditulis sepuluh tahun yang lalu oleh seorang profesor fisika keras kepala yang mempelajari F77 tiga puluh tahun yang lalu. Mengapa antreannya harus cukup panjang? Apa motivasi di balik itu? - person Jan M.; 11.03.2014
comment
Mengapa antrean cukup panjang? Agar mudah dibaca. Meskipun standar Fortran ›= 90 mengizinkan 132 karakter, tergantung pada terminal, editor, font, dll., panjang tersebut mungkin sulit dibaca. - person M. S. B.; 11.03.2014
comment
Tapi itu cukup subyektif, bukan? Saya merasa bahwa mendeklarasikan variabel-variabel ini dalam kolom dengan kelanjutan garis memberikan gambaran yang lebih baik, memungkinkan komentar dengan setiap variabel (seperti dalam kasus ini, kode ini tidak memiliki komentar dengan variabel dan saya masih tidak tahu apa yang dilakukan beberapa variabel tersebut). Selain itu, nama variabel juga harus dipilih dengan hati-hati, yang menurut saya tidak demikian halnya dengan kode ini. Ini jelas dikodekan oleh seseorang yang benar-benar menyukai apa yang dia lakukan pada saat itu, tanpa menghiraukan penggunaan apa pun di masa depan. - person Jan M.; 11.03.2014
comment
Ya, jika variabelnya benar-benar berbeda, dan satu komentar saja tidak cukup, mengapa tidak satu baris saja? Saya kira itu akan menjadi garis yang agak pendek. - person Vladimir F; 11.03.2014
comment
Tapi garis pendek tidak menjadi masalah jika meningkatkan keterbacaan, IMHO. Saya minta maaf jika ini adalah argumen yang tidak ada gunanya tentang masalah yang sangat subyektif. - person Jan M.; 11.03.2014
comment
Tidak, tentu saja tidak. Yang saya maksud dengan cukup lama tentu saja tidak terlalu lama. - person Vladimir F; 11.03.2014

Gaya yang baik adalah dengan membuat parameter dimensi

integer, parameter:: NODES_MAX = 1000, TIMES_MAX = 2000, COORD_MAX = 1000
real energy_t(TIMES_MAX), ..
real npsh(NODES_MAX), xx(COORD_MAX) ...

sehingga loop dapat diparameterisasi.

do ii = 1, COORD_MAX
    xx(ii) = ...
    yy(ii) = ..
end do

dan pemeriksaan kesalahan dapat dilakukan

if (ii .gt. NODES_MAX) then
    print *, 'Please increase NODES_MAX oldvalue=', NODES_MAX, ' required=', ii
    pause
end if

Hal ini juga akan meminimalkan jumlah perubahan yang diperlukan ketika dimensi ditingkatkan/dikurangi. Gaya ini juga bisa diterapkan 30+ tahun yang lalu ketika F77 keluar.

person cup    schedule 24.03.2014