В Fortran у меня есть массив, указанный как:
dimension insv(*)
Теперь я хотел бы отредактировать этот массив из C. Мне удалось прочитать массив из C с помощью iso_c_binding:
SUBROUTINE userroutine(insv)
IMPLICIT NONE
INTERFACE
SUBROUTINE MODIFYARRAY(insv) BIND(C)
USE, INTRINSIC::ISO_C_BINDING
REAL(C_DOUBLE),DIMENSION(*), INTENT(INOUT) :: insv
END SUBROUTINE MODIFYARRAY
END INTERFACE
dimension insv(*)
WRITE(insv(0))
call modifyarray(insv)
WRITE(insv(0))
END
Моя функция C:
__declspec(dllexport) void modifyarray(double * insv)
Но изменение значения в этом массиве в C либо приводит к сбою, либо вообще не изменяется.
__declspec(dllexport) void modifyarray(double * insv)
{
insv[0] = 1234.00;
}
Я не уверен, что я должен изменить на iso_c_binding или функцию C, чтобы это заработало.
Еще немного контекста: тип массива фортрана не может быть изменен, поскольку переменная измерения является параметром пользовательской процедуры, так сказать, не под моим контролем. Массив уже заполнен при входе в функцию фортрана, но его необходимо изменить в C.
insv
является целочисленным массивом. Подпрограмма ожидает реального аргумента. - person francescalus   schedule 15.06.2017implicit none
и включая все объявления переменных. - person Vladimir F   schedule 15.06.2017common/bmcntc/ibmcnt(101) common/thropt/itopaz(101),iprm_thrm(20),rprm_thrm(20) common/blk03/rdumy1(2),idumy6(25),numsh12,ndtot,nsl_th,lenhsv, . numel2,numel4,numel6,numel8,numel10,numel20 dimension insv(*),areas(*),xs(*),ys(*),zs(*),lsv(*), . ix1(*),ix2(*),ix3(*),ix4(*),aream(*),xx1(nlq,*),xx2(nlq,*) . ,xx3(nlq,*),stfn(*),stf(*),fni(*),dx(*),dy(*),dz(*),ua(*)
- person Satchmode   schedule 15.06.2017program
, закончитеend program
. Создайте полный, компилируемый пример кода (минимальный воспроизводимый пример). Удалите ненужные части кода, но протестируйте сокращенный код, прежде чем публиковать его здесь. - person Vladimir F   schedule 15.06.2017implicit none
. - person Vladimir F   schedule 15.06.2017