| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Fortran > [Interop] Работающий пример iso_c_binding |
| Автор: popovda 29.3.2009, 23:20 | ||||||||||
| Итак. Пример прост: фортрановская программа вызывает статическую библиотеку на C. Всё сделано в VisualStudio 2003/2005 и Intel Fortran 10.1. По субъективным впечатлениям - g95+gcc работают гораздо удобнее, но оптимизация кода ниже. Да и не родные это для Windows компиляторы. Так что смотрите, кому интересно Исходник библиотеки
Исходник модуля с интерфейсами к библиотеке
И сама вызывающая программа
P.S. пора бы всё же фортрановский код подсветить P.S.S кстати, интересный способ предлагает Silverfrost Fortran для связывания с C. Удобный, но не стандартный. Объявление C_EXTERNAL
Например для
Обратите внимание - результат объявляется по-фортрановски, а в скобках указывается - по ссылке или по значению передавать аргумент. Довольно удобно. |
| Автор: adejneka 30.3.2009, 05:34 |
| Интересно, а как компилятор Фортрана определяет, что второй аргумент showArray - это указатель именно на double, а не на что-то другое? Или сейчас это уже не имеет значения? |
| Автор: popovda 30.3.2009, 07:54 |
| Вот это и мне интересно Следует заметить, что в g95 передача массива как массива (естественно, без атрибута value) так же работает. |
| Автор: popovda 1.4.2009, 22:00 |
| Да. Вроде бы так. Но с массивом подразумеваемой длины 10-ый интел у меня страшно кочевряжился и не заработал. g95 этот же код съел. Так что я в легком затруднении [code] ! Для void showArray(const int sz, double Arr[]) subroutine ShowArray(sz, Arr) bind(C,name = "showArray") use, intrinsic :: iso_c_binding; integer(c_int), value, intent(in) :: sz; type(c_ptr), value, intent(in) :: Arr; [\code] Что до интерфейса - пользователь передаёт в C-функцию указатель type(C_PTR), и это всего лишь указатель, целое число. А целое - оно всегда целое. P.S. Точка с запятой - привычка из C. И Ады. Лучше я буду их и фортране ставить - это не вызывает ошибки, чем я буду забывать их ставить в C и тем более Аде. |
| Автор: adejneka 2.4.2009, 05:26 | ||
С x86 понятно - здесь указатели на все типы совпадают (даже если вспомнить про сегменты, которые несколько нарушают идею, что указатель = целое число). Меня интересовали другие архитектуры. В стандарте C явно оговаривается, что, например, (void*) и (double*) могут иметь разный размер и разное внутреннее представление. Отсюда и вопрос - как Фортрану указать вид указателя, принимаемого программой на C? |
| Автор: popovda 13.4.2009, 22:21 |
| Кстати, на форуме Intel мне указали на ещё одну проблему - если, например, в структуре указать атрибут sequence, то некоторые данные C не правильно будет интерпретировать, например, у меня так было с символами. Дутчик категорически не рекомендовал использовать его при межъязыковом программировании. Если не изменяет память, Бартеньев, как раз наоборот, - рекомендовал. |