Я понимаю, что extra care needs to be taken при распределении памяти в C, чтобы обеспечить массив 2d, но я все еще не получаю ожидаемых результатов, когда передаю его Fortran. Ниже приведена игрушечная версия моей попытки: файл main.c, который выделяет память для 2d-массива и присваивает значение каждому элементу, и файл foo.f90, который выводит элементы массива 2d.Попытка передать непрерывный динамический массив 2d от C до Fortran
#include <stdio.h>
#include <stdlib.h>
void foo_(double **,int *,int *);
int main() {
int i, j, cols, rows;
double *_x, **x;
cols = 3;
rows = 2;
// Allocate memory
_x = malloc(rows*cols*sizeof(double));
x = malloc(cols*sizeof(double *));
for(i=0;i<cols;i++)
x[i] = &(_x[rows*i]);
// Generate elements for the 2d array
for(i=0;i<cols;i++)
for(j=0;j<rows;j++)
x[i][j] = i*j;
// Call Fortran subroutine foo
foo_(x,&rows,&cols);
return EXIT_SUCCESS;
}
foo.h
subroutine foo(x,rows,cols)
use iso_c_binding
implicit none
integer(c_long), intent(in) :: rows,cols
real(c_double), intent(in), dimension(rows,cols) :: x
integer :: i,j
do i = 1,cols
do j = 1,rows
print *, j,i,x(j,i)
end do
end do
end subroutine
Как выход, я ожидаю список элементов массива. Вместо этого, я получаю следующие выходные данные
1 1 1.1654415706619996E-316
2 1 1.1654423611670330E-316
Segmentation fault (core dumped)
Существует ** нет ** 2D-массив в вашем коде C и ничего, что может представлять или указывать на один! Указатель не является массивом. Если вам нужен 2D-массив, используйте его! – Olaf
Двойной указатель может представлять собой 2D-массив и на самом деле есть @Olaf, я думаю, проблема в foo_ (double **, int *, int *); не должно быть просто foo_ (double **, int, int); ? – koper89
@Olaf Ваш комментарий либо неправильный, либо слишком тупой, чтобы быть дидактически бесполезным. На языке программирования C многомерные массивы, хранящиеся в куче, сохраняют память во время выполнения, а указатели используются в качестве инструментов ведения бухгалтерского учета для управления адресами (https://www.cs.swarthmore.edu/~newhall/unixhelp/C_arrays.html). – DJames