ข้อผิดพลาดในการแบ่งส่วนโดยใช้ f2py

นี่คือการติดตามคำถามที่ฉันถามที่นี่... ฉันจะจัดสรรอาร์เรย์อินพุตด้วย f2py ได้อย่างไร

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

ฉันกำลังพยายามใช้ f2py เพื่อรวมรูทีนย่อย/ฟังก์ชัน fortran ต่างๆ สำหรับการอ่านข้อมูลที่ส่งออกจากรหัสฟิสิกส์อะตอมมิกต่างๆ ที่เขียนใน fortran 77 ฉันใช้การกระจาย Anaconda python (python 3.4 64 บิต) บน Ubuntu 14.04 (64 บิต) ด้วยชุดคอมไพเลอร์ gnu (gcc, gfortran ฯลฯ )

ฉันมีปัญหาในการพยายามจัดสรรอาร์เรย์ล่วงหน้าใน python คำถามเดิมของฉันเกี่ยวข้องกับการจัดสรรอาร์เรย์อักขระ ปรากฎว่าฉันมีรูปร่างผิดปกติ ฉันได้แก้ไขปัญหานั้นแล้ว (ฉันคิดว่า) และตอนนี้กำลังเผชิญกับข้อผิดพลาดในการแบ่งส่วน ฉันได้รวบรวมรูทีนย่อย fortran ด้วย f2py โดยใช้แฟล็ก --debug-capi เพื่อเปิดใช้งานการรายงานข้อผิดพลาดแบบละเอียด

นี่คือส่วนที่เกี่ยวข้องของเอาต์พุตเทอร์มินัลที่ฉันได้รับเมื่อฉันรันสคริปต์ Python

debug-capi:Python C/API function adf04_2py.xxdata_04(iunit,titled,iz,iz0,iz1,bwno,npl,bwnoa,lbseta,prtwta,cprta,il,qdorb,lqdorb,qdn,iorb,ia,cstrga,isa,ila,xja,wa,cpla,npla,ipla,zpla,nv,scef,itran,maxlev,tcode,i1a,i2a,aval,scom,beth,iadftyp,lprn,lcpl,lorb,lbeth,letyp,lptyp,lrtyp,lhtyp,lityp,lstyp,lltyp,itieactn,ltied,ndlev=len(ia),ndtrn=shape(tcode,0),ndmet=len(bwnoa),ndqdn=len(qdn),nvmax=len(scef))
debug-capi:int lltyp=:input,required,scalar
debug-capi:lltyp=0

        ####### omitted ##########

debug-capi:int ndmet=len(bwnoa):input,optional,scalar
debug-capi:ndmet=1
debug-capi:Checking `len(bwnoa)>=ndmet'
debug-capi:int ndqdn=len(qdn):input,optional,scalar
debug-capi:ndqdn=1
debug-capi:Checking `len(qdn)>=ndqdn'
debug-capi:int ndlev=len(ia):input,optional,scalar
debug-capi:ndlev=1
debug-capi:Checking `len(ia)>=ndlev'
debug-capi:int lqdorb=:input,required,array,dims((ndqdn*(ndqdn+1))/2|(ndqdn*(ndqdn+1))/2)
debug-capi:string cprta=:input,required,array,string array,dims(ndmet|ndmet,9|9)
debug-capi:double prtwta=:input,required,array,dims(ndmet|ndmet)
debug-capi:double beth=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:string cstrga=:input,required,array,string array,dims(ndlev|ndlev,(*)|(*))
debug-capi:double zpla=:input,required,array,dims(ndmet|ndmet,ndlev|ndlev)
debug-capi:int ltied=:input,required,array,dims(ndlev|ndlev)
debug-capi:int npla=:input,required,array,dims(ndlev|ndlev)
debug-capi:int i2a=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:int lbseta=:input,required,array,dims(ndmet|ndmet)
debug-capi:int i1a=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:int ila=:input,required,array,dims(ndlev|ndlev)
debug-capi:double scom=:input,required,array,dims(nvmax|nvmax,ndtrn|ndtrn)
debug-capi:double qdorb=:input,required,array,dims((ndqdn*(ndqdn+1))/2|(ndqdn*(ndqdn+1))/2)
debug-capi:string cpla=:input,required,array,string array,dims(ndlev|ndlev,1|1)
debug-capi:int isa=:input,required,array,dims(ndlev|ndlev)
debug-capi:double wa=:input,required,array,dims(ndlev|ndlev)
debug-capi:int ipla=:input,required,array,dims(ndmet|ndmet,ndlev|ndlev)
debug-capi:double xja=:input,required,array,dims(ndlev|ndlev)
debug-capi:Fortran subroutine `xxdata_04(&iunit,&ndlev,&ndtrn,&ndmet,&ndqdn,&nvmax,titled,&iz,&iz0,&iz1,&bwno,&npl,bwnoa,lbseta,prtwta,cprta,&il,qdorb,lqdorb,qdn,&iorb,ia,cstrga,isa,ila,xja,wa,cpla,npla,ipla,zpla,&nv,scef,&itran,&maxlev,tcode,i1a,i2a,aval,scom,beth,&iadftyp,&lprn,&lcpl,&lorb,&lbeth,&letyp,&lptyp,&lrtyp,&lhtyp,&lityp,&lstyp,&lltyp,&itieactn,ltied,slen(titled),flen(cstrga))'
Segmentation fault (core dumped)

คำถามแรกของฉันคือสิ่งนี้ เป็นไปได้ไหมที่จะบอกได้ว่ามีอะไรเกิดขึ้นบ้างจากเอาต์พุตการดีบัก ฉันไม่เห็นวิธีการ

สำหรับคำถามที่สอง หากคุณดูที่จุดเริ่มต้นของเอาต์พุตการดีบัก คุณจะเห็นสิ่งที่ดูเหมือนการเรียกใช้ฟังก์ชัน ซึ่งฉันเชื่อว่าเป็น python เรียกใช้ฟังก์ชันจากอ็อบเจ็กต์ที่แชร์ ในตอนท้ายของเอาต์พุตการดีบัก คุณจะเห็นบางสิ่งที่เกือบจะเหมือนกัน แต่ถูกระบุว่าเป็น 'รูทีนย่อย fortran' ตัวแปรในรูทีนย่อย fortran ไม่อยู่ในลำดับเดียวกันกับฟังก์ชัน python วัตถุที่ใช้ร่วมกันถูกสร้างขึ้นโดยอัตโนมัติโดย f2py จากรหัส fortran ดั้งเดิม มีใครรู้บ้างไหมว่าเหตุใดตัวแปรเหล่านี้จึงอยู่ในลำดับที่แตกต่างกัน

ขอบคุณล่วงหน้า


person ivanarnold    schedule 10.02.2016    source แหล่งที่มา
comment
โปรดระบุโค้ดขั้นต่ำที่มีพฤติกรรมที่สามารถทำซ้ำได้! เราไม่ได้อยู่ที่นี่เพื่ออ่านโค้ดยาวๆ ของคุณทั้งหมด ตัวอย่างที่มีรูทีนย่อยเดียวจะดีที่สุด   -  person innoSPG    schedule 10.02.2016
comment
ไม่แน่ใจว่าทำไมถึงสมควรได้รับการโหวตลง? หากคุณได้อ่านโพสต์ต้นฉบับของฉัน (ซึ่งมีลิงก์อยู่ในโพสต์นี้) คุณจะรู้ว่าไม่มีโค้ดขั้นต่ำในกรณีนี้ รหัส fortran ดั้งเดิมมีความยาวและสคริปต์ python ของฉันมีอยู่ในคำถามที่โพสต์ดั้งเดิม ไม่ว่าในกรณีใด นี่เป็นคำถามหลักเกี่ยวกับวิธีการตีความเอาต์พุตการดีบักจาก f2py ซึ่งฉันได้ให้ไว้ ฉันแค่พยายามหลีกเลี่ยงสิ่งที่หลีกเลี่ยงไม่ได้ โปรดโพสต์ความคิดเห็นทั้งหมดที่ฉันเห็นบ่อยมากที่นี่ ขออภัยที่เสียเวลา แต่คุณสามารถหยุดอ่านได้ตลอดเวลา   -  person ivanarnold    schedule 10.02.2016
comment
ฉันไม่ได้ลงคะแนน มันไม่ใช่ธรรมชาติของฉันที่จะลงคะแนนเสียงลง! แม้ว่าฉันจะพบว่าความคิดเห็นของคุณเป็นการตัดสินมากกว่าในขณะที่เดาว่าฉันและผู้แสดงความคิดเห็นก็เป็นผู้ลงคะแนนเสียงด้วยเช่นกัน แต่ฉันก็ยังจะไม่ลงคะแนนเสียง นั่นเป็นเพราะว่าคำถามของคุณแม้จะติดตามได้ยากก็ดูสมเหตุสมผลมาก ฉันมักจะแสดงความคิดเห็นเพื่อให้ OP ให้รายละเอียดเพิ่มเติมหรือปรับปรุงคำถามของพวกเขา นั่นเป็นกรณีที่นี่ และเพื่อให้มั่นใจว่าฉันไม่ใช่ผู้เชี่ยวชาญ f2py ดังนั้นแม้จะมีคำถามที่ชัดเจนกว่านี้ ฉันก็ไม่มีความรู้ที่จะตอบอย่างแน่นอน   -  person innoSPG    schedule 10.02.2016
comment
ยุติธรรมเพียงพอ ไม่พยายามที่จะผ่านการตัดสิน เมื่อมองย้อนกลับไปแล้ว คำถามของฉันก็ยาวและไม่ชัดเจนนัก ฉันได้แก้ไขตามนั้นแล้ว อย่างไรก็ตาม ในกรณีนี้ การโพสต์โค้ดเวอร์ชันขั้นต่ำนั้นเป็นไปไม่ได้จริงๆ ขอบคุณสำหรับการตอบกลับของคุณ.   -  person ivanarnold    schedule 10.02.2016


คำตอบ (1)


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

ข้อมูลทั้งหมด (จนถึงตอนนี้) มีอยู่ในเอาต์พุตการดีบัก หลังจากจัดสรรตัวแปร 'scef' เป็นอาร์เรย์ที่มีขนาด/รูปร่าง/ประเภทที่เหมาะสมแล้ว segfault ก็หายไป

ฉันยังคงได้รับข้อผิดพลาดเพิ่มเติม แต่จนถึงขณะนี้ได้ผ่านเอาต์พุตเทอร์มินัลโดยใช้ --debug-capi และดูเหมือนว่าจะปรับขนาดสิ่งใดก็ตามที่ไม่ใช่รูปร่าง/ขนาด/ประเภทที่ถูกต้องอย่างระมัดระวัง ดูเหมือนว่าจะแก้ไขได้

หากใครกำลังประสบปัญหาเหล่านี้ ฉันหวังว่านี่จะช่วยได้

person ivanarnold    schedule 10.02.2016
comment
ไม่แน่ใจว่าฉันควรจะตอบคำถามของตัวเองแบบนี้หรือไม่ - หากคุณถามคำถามเกี่ยวกับปัญหาเฉพาะเจาะจงแล้วหาทางแก้ไขปัญหานั้นด้วยตัวเอง คุณยังให้กำลังใจ< /b> เพื่อตอบคำถามของคุณเอง ! นั่นเป็นเหตุผลที่คุณสามารถยอมรับคำตอบของคุณเองได้! - person Programmer; 29.06.2021