2012-03-23 5 views
1

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

double *x = new double[21] 

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

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

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

+0

С удалением летучей мыши, вероятно, Fortran ожидает, что размер массива будет храниться где-то в памяти относительно указателя, который вы передаете, но C++ не обязывает его. –

ответ

1

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

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

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

+0

Спасибо за ответ. Вероятно, вы используете компиляторы intel и gnu и только для небольших частей проекта. Если я в конечном итоге использую код Fortran, я, вероятно, просто напишу обертку вокруг него. – Alain

0

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

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

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

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

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

0

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

double* x = new double[2*21] 

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

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