จะแก้ไขข้อผิดพลาดทางไวยากรณ์ใน Data Statement ได้อย่างไร

สวัสดี ฉันมาใหม่และต้องการแก้ปัญหานี้:

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

ฉันได้รับข้อผิดพลาดสำหรับ l และ n โดยบอกว่าเป็นข้อผิดพลาดทางไวยากรณ์ในคำสั่ง DATA ใครรู้วิธีแก้ปัญหานี้บ้าง?


person Jason    schedule 14.12.2015    source แหล่งที่มา
comment
ข้อความแสดงข้อผิดพลาดที่คุณได้รับคืออะไร? และคุณกำลังพยายามทำอะไรอยู่? นั่นคือเหตุใดคุณจึงต้องการใช้คำสั่ง data ที่นี่แทนการมอบหมายงาน   -  person francescalus    schedule 14.12.2015
comment
คำสั่งข้อมูลจะต้องปรากฏก่อนโค้ดที่ปฏิบัติการได้ ดังนั้นจึงไม่สามารถอยู่ในลูปได้   -  person agentp    schedule 14.12.2015
comment
@agentp นั่นไม่ถูกต้องแม้แต่ใน Fortran 2008/2015   -  person francescalus    schedule 14.12.2015
comment
เจสัน ผู้รวบรวมอะไร?   -  person agentp    schedule 14.12.2015


คำตอบ (1)


คุณมีปัญหาสามประการที่นี่ ไม่ใช่แค่กับลูป "l" และ "n" เท่านั้น

ปัญหาแรกคือค่าในคำสั่ง data ไม่สามารถเป็นนิพจน์ที่กำหนดเองได้ โดยเฉพาะอย่างยิ่ง จะต้องเป็นค่าคงที่ 0.5*(l-1) ไม่ใช่ค่าคงที่

ปัญหาที่สองคือขอบเขตในรายการวัตถุจะต้องคงที่ (นิพจน์) l ไม่ใช่นิพจน์คงที่

ประการแรก ควรสังเกตด้วยว่า * ในรายการค่าข้อมูลมีความหมายพิเศษ และไม่ใช่ตัวดำเนินการคูณ * ให้การนับซ้ำ และการนับซ้ำของ 0.5 ไม่ถูกต้อง

คุณสามารถแก้ไขจุดที่สองได้ค่อนข้างง่ายโดยใช้โครงสร้างเช่น

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

นอกวงหรือใช้วงโดยนัย

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

การทำบางสิ่งสำหรับการวนซ้ำ "l" นั้นน่าเบื่อกว่า

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

และเราต้องระมัดระวังเกี่ยวกับจำนวนค่าที่ระบุให้มาก สิ่งนี้ไม่สามารถเป็นไดนามิกได้

ปัญหาที่สามคือคุณไม่สามารถระบุการเริ่มต้นที่ชัดเจนสำหรับองค์ประกอบได้มากกว่าหนึ่งครั้ง ดูสองลูปแรกของคุณ: หากได้ผล คุณจะต้องเริ่มต้น H(1,1) สองครั้ง แม้ว่าจะได้รับค่าเดียวกัน แต่ก็ยังไม่ถูกต้อง

ที่จริงแล้วคุณมีปัญหาสี่ประการ ประการที่สี่เกี่ยวข้องกับประเด็นเกี่ยวกับจำนวนค่าแบบไดนามิก คุณอาจไม่ต้องการที่จะเริ่มต้นอย่างชัดเจน แม้ว่าจะเป็นไปได้ที่จะทำสิ่งที่ดูเหมือนคุณต้องการทำ แต่ใช้การมอบหมายงานโดยไม่มีข้อจำกัดเหล่านี้

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

ใช่ มีหลายครั้งที่การเริ่มต้นที่ซับซ้อนอย่างชัดเจนเป็นสิ่งที่พึงปรารถนา แต่ในกรณีนี้ สิ่งที่ฉันคิดว่าเป็นโค้ดใหม่ การรักษาสิ่งต่าง ๆ ให้เรียบง่ายเป็นสิ่งที่ดี ส่วน "การเริ่มต้น" ของโค้ดของคุณซึ่งทำหน้าที่มอบหมายนั้น "ทันสมัย" มากกว่ามาก

person francescalus    schedule 14.12.2015