Bagaimana cara mengatasi Kesalahan Sintaks dalam Pernyataan Data?

Hai, saya baru di sini dan ingin menyelesaikan masalah ini:

do k=1,31
    Data H(1,k)/0/
End do

do l=1,21
   Data H(l,1)/0.5*(l-1)/
End do

do m=31,41
   Data H(17,m)/0/
End do

do n=17,21
   Data H(n,41)/0.5*(n-17)/
End do

Saya mendapatkan kesalahan untuk l dan n yang mengatakan bahwa ini adalah kesalahan sintaksis dalam pernyataan DATA. Adakah yang tahu cara mengatasi masalah ini?


person Jason    schedule 14.12.2015    source sumber
comment
Apa pesan kesalahan yang Anda dapatkan? Dan apa yang sedang Anda coba lakukan? Artinya, mengapa Anda ingin menggunakan pernyataan data di sini daripada penugasan?   -  person francescalus    schedule 14.12.2015
comment
pernyataan data harus muncul sebelum kode yang dapat dieksekusi, jadi tidak boleh dalam satu lingkaran   -  person agentp    schedule 14.12.2015
comment
@agentp Itu tidak benar, bahkan di Fortran 2008/2015.   -  person francescalus    schedule 14.12.2015
comment
Jason, kompiler apa?   -  person agentp    schedule 14.12.2015


Jawaban (1)


Anda memiliki tiga masalah di sini, dan bukan hanya dengan loop "l" dan "n".

Masalah pertama adalah nilai dalam pernyataan data tidak boleh berupa ekspresi sembarang. Secara khusus, keduanya harus berupa konstanta; 0.5*(l-1) bukan sebuah konstanta.

Masalah kedua adalah batas-batas dalam daftar objek juga harus konstan (ekspresi); l bukan ekspresi konstan.

Untuk yang pertama, perlu diperhatikan juga bahwa * dalam daftar nilai data memiliki arti khusus, dan ini bukan operator perkalian. * memberikan penghitungan ulang, dan penghitungan ulang 0.5 tidak valid.

Anda dapat memperbaiki poin kedua dengan cukup sederhana, dengan menggunakan konstruksi seperti

data H(1,1:31) /31*0./  ! Note the repeat count specifier

di luar loop, atau menggunakan loop tersirat

data (H(1,k),k=1,31) /31*0./

Melakukan sesuatu untuk loop "l" lebih membosankan

data H(1:21,1) /0., 0.5, 1., 1.5, ... /

dan kita harus sangat berhati-hati dengan jumlah nilai yang ditentukan. Hal ini tidak bisa bersifat dinamis.

Masalah ketiga adalah Anda tidak dapat menentukan inisialisasi eksplisit untuk suatu elemen lebih dari satu kali. Lihatlah dua loop pertama Anda: jika ini berhasil, Anda akan menginisialisasi H(1,1) dua kali. Meskipun diberikan nilai yang sama, namun tetap saja tidak valid.

Sebenarnya Anda punya empat masalah. Yang keempat terkait dengan poin tentang bilangan dinamis nilai. Anda mungkin tidak ingin melakukan inisialisasi eksplisit. Meskipun Anda dapat melakukan apa yang ingin Anda lakukan, cukup gunakan tugas yang tidak menerapkan batasan ini.

do l=1,21
   H(l,1) = 0.5*(l-1)
End do

Ya, ada kalanya inisialisasi eksplisit yang rumit adalah hal yang diinginkan, tetapi dalam kasus ini, yang saya anggap sebagai kode baru, menjaga semuanya tetap sederhana adalah hal yang baik. Bagian "inisialisasi" dari kode Anda yang melakukan tugasnya jauh lebih "modern".

person francescalus    schedule 14.12.2015