Fortran90 и размер массивов, созданных в C ++ - PullRequest
1 голос
/ 23 марта 2012

Я пытаюсь вызвать код на Fortran 90 из основной программы на C ++. Подпрограмма Fortran принимает массив double (назовем его X) в качестве параметра, затем переходит к использованию size (X) во многих местах кода. Я вызываю подпрограмму с массивом C, созданным через

double *x = new double[21]

но когда я печатаю результат размера (X) в коде Фортрана, я получаю 837511505 или некоторые другие большие числа.

Прямо сейчас я могу изменить код Фортрана, поэтому в худшем случае переписать функцию, передав размер в качестве параметра. Но я бы предпочел не делать этого.

Кто-нибудь знает, есть ли способ, которым я могу создать массив C таким образом, чтобы подпрограмма Fortran могла определить его размер?

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Это особенность реализации. Многие реализации (например, RSX и OpenVMS) определяют структуру для передачи указателя на данные, а также описания измерений, типов и т. Д. Другие реализации не пропускают ничего подобного, если внешнее объявление явно не вызывает механизм для генерации дескриптор. Большинство других не предоставляют такого механизма.

Не зная, какая реализация используется:

а) прочитайте документацию компилятора
б) попросить компилятор сгенерировать сборку и проверить, что он ожидает

0 голосов
/ 13 июня 2012

Я лично использую тонну смешанного кодирования от c ++ до fortran 90/95/2003. Обычно я использую gfortran в качестве компилятора, но чтобы избежать этой проблемы, обычно всегда отправляют размер массивов. Это даже позволяет изменить форму. Рассмотрим двумерный массив, содержащий точки x, y:

double* x = new double[2*21]

real(8),intent(in),dimension(2,21)::x

Это очень удобная функция, которая позволит вам использовать команду размера. Ответы о специфике компилятора верны. Чтобы ваш код можно было использовать на большинстве компиляторов, вы должны указать длину при использовании многоязычных интерфейсов.

0 голосов
/ 08 июня 2012

Intel F95 использует структуру дескриптора массива, которая помимо указателя массива также хранит информацию о границах и размерах. size () получает информацию из дескриптора.

Поскольку вы передаете только указатель C, информация о дескрипторе недоступна, поэтому size () возвращает тарабарщину.

Как правило, вы находитесь на грубой территории программирования на разных языках, где массивы и структуры часто являются болью программиста. В документации пользователя компилятора Intel есть отдельный раздел о смешанных вызовах C <=> F95.

В частности, проверьте интерфейсы и привязку - замечательная функция F95, которая помогает в межязыковых вызовах.

Хорошая новость, C <=> Вызов F95 работает очень хорошо, когда вы придерживаетесь соглашений.

...