Передача c массивов в fortran в виде матрицы переменного размера - PullRequest
4 голосов
/ 08 сентября 2011

Итак, мне было поручено перевести некоторые фортрановые подпрограммы в C. Эти подпрограммы вызываются как часть потока управления большой программы, основанной в основном на C.

Я перевожу функции одинв то же время, начиная с функций, которые находятся наверху стеков вызовов.

Проблема, с которой я сталкиваюсь, заключается в передаче данных массива из C в fortran.

Предположим, мыобъявили массив в c как

int* someCArray = (int*)malloc( 50 * 4 * sizeof(int) );

Теперь этот массив должен быть передан в подпрограмму fortran для заполнения данными

someFortranFunc( someCArray, someOtherParams );

, когда массив прибывает в землю fortran, она объявляется как матрица переменного размера как таковая:

subroutine somefortranfunc(somecarray,someotherparams)
integer somefarray(50,*)

Проблема в том, что фортран, похоже, неправильно определяет размер массива из-за ошибок программы.Когда я отлаживаю программу, я обнаруживаю, что индексирование

somefarray(1,2)

сообщает, что это недопустимый индекс.Любые ссылки на любые элементы в первом столбце работают нормально, но в массиве есть только один доступный столбец, когда он прибывает в Фортран.

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

[править]

Кстати, подпрограмма fortran в настоящее времявызывается из замененного кода Фортрана как

integer somedatastorage(plentybignumber)
integer someindex
...
call somefarray(somedatastorage(someindex))

, где хранилище данных представляет собой большой 1d массив.Нет проблем с превышением размера хранилища данных.Тем не менее, каким-то образом разница между передачей массива C и массива fortran (под) вызывает разницу в подпрограмме fortran.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 сентября 2011

То, что не должно быть, что другие предложили: 1. Размер int против размера Integer.Так как первый столбец имеет правильные значения.2. Порядок строк и столбцов.Будет просто получить значения в неправильном порядке, а не сегментация неисправна.3. Ссылка против передачи значения.Так как первый столбец имеет правильные значения.Если компилятор не делает что-то плохое за вашей спиной.

Вы уверены, что не делаете это каким-то секретным способом?после того, как вы сделаете это и прямо перед тем, как пройти.Вы также должны распечатать его, используя отладчик в коде fortran, просто чтобы убедиться, что компилятор не генерирует некоторые временные копии, чтобы помочь вам.

2 голосов
/ 09 сентября 2011

Рассматривали ли вы крепление Fortran ISO C? У меня были очень хорошие результаты, чтобы связать Fortran и C в обоих направлениях. Я предпочитаю избегать перезаписи существующего, проверенного кода. Существует несколько типов, которые нельзя перенести в текущей версии привязки ISO C, поэтому может потребоваться перевод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...