Kesalahan: Koma diperlukan setelah deskriptor P dalam format string

Ketika saya mencoba mengkompilasi calrank.for (CALRANK_v7.0.0_L140912.zip) dengan gfortran saya mendapatkan kesalahan ini:

> gfortran  -m64 -c -o calrank.o calrank.for
calrank.for:1922:32:
         write(io,'(2f10.3,1p1000(2x,e16.7,1x,2a10,1x))')
                                1
Error: Comma required after P descriptor in format string at (1)

Ketika saya membuat koma saya mendapatkan kesalahan yang sama.
Saya hanya mencatat bahwa kode tersebut telah dikompilasi sebelumnya dengan LF95.

   subroutine xycout(io,nrank,nsp)
      use userinf
      use header
      use rankdata

      implicit none

    integer :: io,nrank,nsp
      integer :: k,ir,is,i
      character(len=20)   :: head1,head2,head3
      character(len=40)   :: add1x,add2x,add3x
      character(len=40)   :: add1(nsp),add2(nsp)
      character(len=40)   :: add3(nsp)
 ......
 c --- Loop over receptors to write data records
      do ir=1,ntotrec(k)
         write(io,'(2f10.3,1p1000(2x,e16.7,1x,2a10,1x))')
     &                   xreckm(ir,k),yreckm(ir,k),
     &                  (xounit(is,k)*rankvalue(ir,is,nrank),
     &                   arankdate(ir,is,nrank),
     &                   aranktime(ir,is,nrank),is=1,nspout(k))
      enddo

      return
      end

Beberapa variabel didefinisikan di tempat lain dalam kode sebagai:

c --- Real arrays for header (derived)
      allocate (xreckm(mxrec,k),yreckm(mxrec,k))
c --- Modified units multiplier
      allocate (xounit(mxspout,k))
      c --- Array of values (all species, receptors) for requested ranks
      allocate (rankvalue(ntotrec(k),nspout(k),n_ranks))
      allocate (arankdate(ntotrec(k),nspout(k),n_ranks))
      allocate (aranktime(ntotrec(k),nspout(k),n_ranks))
c --- Integer arrays for header
      deallocate (ndrec,nctrec,nspout,i2dmet,iutmzn)

person Moustabchir Rachid    schedule 01.03.2019    source sumber
comment
Selamat datang, silakan ikuti tur. Selalu gunakan fortran untuk semua pertanyaan Fortran. Biasanya kita memerlukan lebih banyak kode daripada yang ditampilkan pesan kesalahan. Setidaknya semua variabel dalam sampel Anda harus dideklarasikan.   -  person Vladimir F    schedule 01.03.2019
comment
maaf tentang itu. Saya tidak dapat menemukan cara mengunggah kode. Saya membagikannya di drive.google.com/file/d/1viIilSckdGUgoZ9r2SSPbgOXKqK1Blsu/. Terima kasih. Kode berasal dari src.com/calpuff/download/mod7_codes.htm CALRANK Versi 7.0.0 (140912).   -  person Moustabchir Rachid    schedule 01.03.2019
comment
Anda tidak seharusnya mengunggah kode Anda di mana pun. Anda harus menyalin dan menempelkan contoh minimal yang dapat direproduksi yang relevan (perhatikan lagi kata minimal) ke dalam pertanyaan Anda sebagai teks. edit pertanyaan untuk memuat bagian penting kode.   -  person Vladimir F    schedule 01.03.2019
comment
Oke terima kasih banyak Vladimir.   -  person Moustabchir Rachid    schedule 01.03.2019
comment
Jangan khawatir sekarang, lihat jawabannya.   -  person Vladimir F    schedule 01.03.2019


Jawaban (2)


Anda harus melakukan persis seperti yang tertulis dalam pesan kesalahan, beri tanda koma setelah deskriptor p:

write(io,'(2f10.3,1p,1000(2x,e16.7,1x,2a10,1x))')

Jika Anda tidak tahu apa itu deskriptor p, lihat, misalnya, https://docs.Oracle.com/cd/E19957-01/805-4939/z4000743a6e2/index.html atau tutorial apa pun tentang deskriptor edit Fortran. Seperti komentar Steven Lionel di bawah, Anda dapat menggunakan deskriptor p tanpa koma di depan deskriptor edit data normal.

person Vladimir F    schedule 01.03.2019
comment
Terima kasih banyak Vladimir. ini bekerja. Ya, saya tidak pernah menggunakan deskriptor p, ini pertama kalinya saya melihatnya. - person Moustabchir Rachid; 01.03.2019
comment
Ini tidak terlalu berguna. Saya tidak pernah menggunakannya. Makanya saya tidak menjawab sebelumnya, saya harus cek sendiri detailnya. - person Vladimir F; 01.03.2019
comment
Format P berguna, tetapi tidak dipahami dengan baik. Aturan menghilangkan koma bahkan kurang dipahami. Koma dapat dihilangkan antara deskriptor edit P dan deskriptor edit F, E, EN, ES, EX, D, atau G setelahnya, mungkin didahului dengan spesifikasi berulang. Namun dalam kasus ini, yang berikut ini adalah grup yang diberi tanda kurung dan tidak memenuhi syarat. - person Steve Lionel; 01.03.2019
comment
Terima kasih banyak Vladimir F, Steve Lionel dan francescalus atas klarifikasi ini. Saya bertanya-tanya, apa arti angka 1000 yang muncul setelah 1p? apakah itu pengulangan 1000 kali?!!! - person Moustabchir Rachid; 01.03.2019
comment
Oke, mungkin saya seharusnya mengatakan bahwa menurut saya deskriptor P rumit untuk digunakan dan berbahaya. Terutama pada masukan. @MoustabchirRachid ya, 1000 adalah pengulangan grup di dalam tanda kurung. Seseorang dapat dengan aman meletakkan angka yang sangat besar di sana, atau bahkan pengulangan tak terbatas *, jika grup yang diulang berada di akhir string format dan seseorang tidak ingin terjadi pembalikan format. - person Vladimir F; 01.03.2019

@francescalus menyarankan agar saya memperluas komentar saya.

Pertama, Fortran umumnya memerlukan koma antara dua "item format". Item format adalah deskriptor edit (F, E, dll.) dengan atau tanpa jumlah pengulangan sebelumnya, atau grup item format yang diberi tanda kurung (yang mungkin memiliki jumlah pengulangannya sendiri; @Vladimir F menyebutkan * - ini adalah " jumlah pengulangan yang tidak terbatas" dan hanya dapat digunakan dengan grup yang diberi tanda kurung.

Koma dapat dihilangkan:

  • antara deskriptor edit P dan deskriptor edit F, E, EN, ES, EX, D, atau G setelahnya, mungkin didahului dengan spesifikasi berulang,
  • sebelum deskriptor edit garis miring ketika spesifikasi pengulangan opsional tidak muncul,
  • setelah deskriptor edit garis miring, atau
  • sebelum atau sesudah deskriptor edit titik dua

Adapun deskriptor edit P, ini menetapkan faktor skala dan memang aneh serta memiliki efek yang sangat berbeda tergantung pada jenis pengeditan yang Anda lakukan. Ini juga "melekat" dan berlaku untuk semua pengeditan selanjutnya dalam format tersebut.

Pada input, hal ini menyebabkan nilai baca dibagi 10**k, dengan k adalah faktor skala (2P berarti k=2, dst.). Jadi jika karakter yang dimasukkan adalah 123 dan 2P berlaku, maka nilainya akan terbaca 1,23. Demikian pula jika -2P berlaku, 123 akan terbaca sebagai 12300. Titik desimal pada masukan tidak mengubah hal ini, namun eksponen menghilangkan penskalaan. Jadi 1,23 dibaca dengan 2P adalah 0,0123 tetapi 1,23E0 adalah 1,23.

Pada keluaran dengan pengeditan F, nilai keluaran dikalikan dengan 10**k, membalikkan skema masukan.

Anda mungkin bertanya MENGAPA??? Jawabannya terletak pada punch card, sebuah bentuk masukan (dan terkadang keluaran) yang digunakan pada tahun 1950an hingga tahun 70an. Ini memiliki 80 kolom dan membuang satu kolom pada koma desimal bisa menjadi masalah. Jadi faktor skala memungkinkan seseorang menghilangkan koma desimal tetapi tetap mendapatkan pecahan.

Tapi tunggu, ini jadi lebih aneh! Pada keluaran dengan pengeditan E dan D, faktor skala hanya menentukan jumlah digit terdepan di sebelah kiri koma desimal (dan selanjutnya pengurangan eksponen. Jadi untuk nilai 1,23 dan format 2P,E11.3, Anda akan mendapatkan b12.300E-01 (b=kosong kecuali SP berlaku, yang merupakan balasan untuk hari lain.)

Dan untuk output dengan format G? Lebih aneh lagi. Jika nilainya berada dalam kisaran di mana Anda mendapatkan format F yang setara, faktor skala tidak berpengaruh, jika tidak maka akan berperilaku seperti E.

Terakhir, faktor skala tidak berpengaruh pada pengeditan EN, ES atau EX. (EX? Itu adalah fitur F2018 untuk keluaran floating point heksadesimal.)

Salah satu penggunaan format P yang baik adalah ketika melakukan perhitungan mata uang dengan bilangan bulat dan bukan real, karena real dapat kehilangan presisi (0,01, misalnya, tidak memiliki representasi float biner yang tepat.) Dengan asumsi nilai yang Anda hadapi tidak terlalu akurat. besar, Anda dapat membaca dolar dan sen menjadi bilangan bulat dengan format -2P dan tidak kehilangan uang sepeser pun saat melakukan penjumlahan, pengurangan, dan perkalian. Saya pernah menulis kalkulator hipotek dengan cara yang tepat.

person Steve Lionel    schedule 02.03.2019