kesalahan segmentasi C dan 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;
    }
}

------ halo.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

Ketika saya melakukan perulangan melalui elemen array:

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

Saya mendapatkan kesalahan segmentasi.

Itu tidak terjadi ketika saya menulis:

array[3]=array[3]+1

person tracius01    schedule 15.08.2011    source sumber
comment
Jika Anda menjalankan kode di debugger, di baris manakah kesalahan seg terjadi?   -  person Oliver Charlesworth    schedule 15.08.2011
comment
Apakah array Fortran berbasis 1 atau 0? (Bukan pertanyaan retoris.)   -  person zwol    schedule 15.08.2011
comment
Program menerima sinyal EXC_BAD_ACCESS, Tidak dapat mengakses memori. Alasan: KERN_INVALID_ADDRESS di alamat: 0x0000000a00000df3 0x0000000a00000df3 di ?? () (gdb) di mana #0 0x0000000a00000df3 di ?? () Tidak dapat mengakses memori di alamat 0xa00000df3 #1 0x0000000100000d0c di start ()   -  person tracius01    schedule 15.08.2011
comment
@Zack, saya yakin Fortran menggunakan array berbasis 1. folk.uio.no/steikr/doc/f77/tutorial/arrays. html   -  person EMiller    schedule 15.08.2011


Jawaban (1)


Kode C Anda adalah ini:

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

subrutine_fortran(&array,&size_a);

dan kode Fortran Anda adalah ini:

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

Ini salah dalam beberapa hal - seperti yang ditunjukkan Zack, array Fortran diindeks 1 (bahkan ketika array tersebut berasal dari tempat lain, seperti C). Jadi ini harus dimulai dari 1. Selain itu, jika 0 benar, ukurannya akan salah. Anda menginginkan sesuatu seperti

    do concurrent (i=1:h)

Dengan perubahan itu, itu berhasil untuk saya.

person Jonathan Dursi    schedule 15.08.2011
comment
Saya tidak ingin mengklaim penghargaan karena mengetahui bahwa array Fortran berbasis 1. Redupkan ingatan pernah membacanya di suatu tempat, ya. - person zwol; 15.08.2011