การแบ่งส่วนความผิด C และ fortran

------ main.c ---------

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <string.h>

int main()
{   
    char* lib_name = "./a.out";
    int array[5] = {1,2,3,4,5};
    int size_a = sizeof(array)/sizeof(int);            
    void* handle = dlopen(lib_name, RTLD_NOW);
    if (handle) {
        printf("[%s] dlopen(\"%s\", RTLD_NOW): incarcare finalizata\n", 
           __FILE__, lib_name);
    }
    else {
        printf("[%s] nu poate fi deschis: %s\n", __FILE__, dlerror());
        exit(EXIT_FAILURE);
    }
    void (*subrutine_fortran)(int*, int*) = dlsym(handle, "putere");
    if (subrutine_fortran) {
        printf("[%s] dlsym(handle, \"_set_name\"): simbol gasit\n", __FILE__);
    }
    else {
        printf("[%s] simbol negasit: %s\n", __FILE__, dlerror());
        exit(EXIT_FAILURE);
    }



    subrutine_fortran(&array,&size_a);
    //dlclose(handle);
    for(int i=1;i<4;i++) {
    array[i]=array[i]+1;
    }
}

------ สวัสดี f90 --------

subroutine putere(a,h) bind(c)
    use ISO_C_BINDING
    implicit none
    integer(c_int) :: h
    integer(c_int), dimension(h) :: a
    integer i
    do concurrent (i=0:5)
        a(i)=a(i)*10
    end do
    !write (*,*) a
end subroutine

เมื่อฉันทำการวนซ้ำผ่านองค์ประกอบอาเรย์:

for(int i=1;i<4;i++) {
  array[i]=array[i]+1;
}

ฉันได้รับข้อผิดพลาดในการแบ่งส่วน

มันไม่ได้เกิดขึ้นเมื่อฉันเขียน:

array[3]=array[3]+1

person tracius01    schedule 15.08.2011    source แหล่งที่มา
comment
หากคุณรันโค้ดของคุณในดีบักเกอร์ seg-fault จะเกิดขึ้นที่บรรทัดใด   -  person Oliver Charlesworth    schedule 15.08.2011
comment
อาร์เรย์ Fortran เป็นแบบ 1- หรือ 0 หรือไม่ (ไม่ใช่คำถามเชิงโวหาร)   -  person zwol    schedule 15.08.2011
comment
โปรแกรมรับสัญญาณ EXC_BAD_ACCESS ไม่สามารถเข้าถึงหน่วยความจำ เหตุผล: KERN_INVALID_ADDRESS ตามที่อยู่: 0x0000000a00000df3 0x0000000a00000df3 ใน ?? () (gdb) โดยที่ #0 0x0000000a00000df3 ใน ?? () ไม่สามารถเข้าถึงหน่วยความจำตามที่อยู่ 0xa00000df3 #1 0x0000000100000d0c ในการเริ่มต้น ()   -  person tracius01    schedule 15.08.2011
comment
@Zack ฉันเชื่อว่า Fortran ใช้อาร์เรย์แบบ 1 ตัว folk.uio.no/steikr/doc/f77/tutorial/arrays. HTML   -  person EMiller    schedule 15.08.2011


คำตอบ (1)


รหัส C ของคุณคือ:

int array[5] = {1,2,3,4,5};
int size_a = sizeof(array)/sizeof(int);            

subrutine_fortran(&array,&size_a);

และรหัส Fortran ของคุณคือ:

subroutine putere(a,h) bind(c)
    use ISO_C_BINDING
    implicit none
    integer(c_int) :: h
    integer(c_int), dimension(h) :: a
    integer i
    do concurrent (i=0:5)
        a(i)=a(i)*10
    end do
    !write (*,*) a
end subroutine

นี่เป็นสิ่งที่ผิดสองประการ - ดังที่ Zack ชี้ให้เห็น อาร์เรย์ของ Fortran นั้นมีดัชนี 1 รายการ (แม้ว่าจะมาจากที่อื่น เช่น C ก็ตาม) นี่ควรเริ่มที่ 1 และถ้า 0 ถูกต้อง ขนาดก็จะผิด คุณต้องการบางอย่างเช่น

    do concurrent (i=1:h)

ด้วยการเปลี่ยนแปลงนั้น มันได้ผลสำหรับฉัน

person Jonathan Dursi    schedule 15.08.2011
comment
ฉันไม่ต้องการอ้างสิทธิ์เครดิตสำหรับการ รู้ ว่าอาร์เรย์ Fortran เป็นแบบ 1 ความทรงจำเลือนลางที่ได้อ่านเรื่องนั้นที่ไหนสักแห่งใช่ - person zwol; 15.08.2011