Передача массивов через Fortran DLL из приложения vb.net превращается в одноэлементные массивы. Должен ли я передать только первый элемент? - PullRequest
0 голосов
/ 02 февраля 2010

У меня есть консольное приложение VB.net, и я открываю функцию в dll, написанной на фортране. Я передаю 3 массива через функцию по ссылке. Когда они возвращаются с другой стороны, они все настроены на массивы только одного элемента. И этот элемент равен 0.

Я где-то читал в интернете, что при подобных вещах полезно передавать в функцию только первый элемент массива. Я попытался изменить объявление своей функции, чтобы принимать отдельные элементы, а не одномерные массивы, и теперь массивы имеют одинаковую длину до и после вызова функции, но, похоже, они не меняются вообще, поэтому я не уверен, что это работает.

Кто-нибудь когда-нибудь сталкивался с подобными проблемами или знает, что попробовать? Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 06 февраля 2010

Функции FORTRAN получают только указатели, независимо от того, является ли он массивом или единственным значением.

Я не знаю, как вы можете сделать это в VB.net, но попробуйте найти способ отправить указатель на первый элемент.

В C это будет:

double *a = ...;  
fortran_func(a);  // or...
fortran_func(&a[0]); 

Кроме того, убедитесь, что вы отправили правильный тип с плавающей запятой (действительное * 8 против действительного * 4, для двойной или одинарной точности). Попав в Фортран, вы не сможете узнать размер массива, вам нужно будет его принять.

SUBROUTINE fortran_func(a)
  real*8 a(16)
  ...
END

если размер не статичен, возможно, сделайте что-то подобное

SUBROUTINE fortran_func(a,sz)
  real*8 a(sz)
  integer sz
  ...
END

Затем отправьте целое число также в качестве указателя. В C это будет:

int sz=16;
fortran_func(a,&sz);
...