Как сделать stdcall в GNU C Compiler? |
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://wasp.phys.msu.ru/forum/index.php?showtopic=6071
Дата изменения: Unknown Дата индексирования: Sun Apr 10 03:36:11 2016 Кодировка: Windows-1251 Поисковые слова: m 27 |
Здравствуйте, гость ( Вход | Регистрация )
Как сделать stdcall в GNU C Compiler? |
27.9.2006, 16:42
Сообщение
#1
|
|
супер-элита Группа: VIP Сообщений: 777 Репутация: 32 Предупреждения: (0%) |
А вот еще такой вопрос программерам. Как попросить GNU С Compiler вызывать процедуру в соответствии с stdcall? Мне нужно своя код на сях с фортрановской процедурой склеить, а g++ не ест ни extern "C" void __stdcall foo_(...), с любым числом подчеркиваний перед stdcall, ни __cdecl, ни даже __attribute__((__cdecl__)) (где-то я и такое откопал). Вроде он весь из себя ANSI-правильный, так я никак не найду, как по ANSI это называется.
Если это важно, компилирую под вот ЭТО: Код Machine hardware: sun4u OS version: SunOS 5.9 Processor type: sparc Hardware: SUNW,Sun-Fire-V250 Help! Сообщение отредактировал M_T - 27.9.2006, 16:46 -------------------- Just me, Gavrilla.
|
27.9.2006, 17:14
Сообщение
#2
|
|
живу здесь Группа: Гуру Сообщений: 337 Репутация: 96 Предупреждения: (0%) |
А чем скомпилирована процедура на FORTRAN? Если это g77, то можно попробовать следующий вариант:
Код extern "C"{ void foo_(...) } Т.е. явно соглашение о передаче аргументов stdcall указывать не нужно. Да, платформа, надо сказать, непопсовая -------------------- Неужели не ясно, что выбирать? Жизнь надо выбирать! Что же еще? Не телескопы же ваши, не пробирки... Да пусть они ими подавятся, телескопами вашими! Диффузными газами!.. Жить надо, любить надо, природу ощущать надо - ощущать, а не ковыряться в ней! (А. и Б. Стругацкие, "За миллиард лет до конца света")
---- It's like the Alt+F4 for our universe... |
27.9.2006, 17:20
Сообщение
#3
|
|
супер-элита Группа: VIP Сообщений: 777 Репутация: 32 Предупреждения: (0%) |
Ну, собственно, GCC и скомпилирована. Это ж теперь не просто GNU C Compiler, а GNU Compilers Collection!
А так, просто extern "C", я раньше и пробовал. Но это все время дает Segmentation fault (possibly corrupt stack). Что логично, учитывая, что каждый хочет почистить стек. И он становится слишком чистым... -------------------- Just me, Gavrilla.
|
27.9.2006, 17:45
Сообщение
#4
|
|
живу здесь Группа: Гуру Сообщений: 337 Репутация: 96 Предупреждения: (0%) |
Может быть, SEGFAULT возникает по какой-то другой причине?
У меня тестовая программа с предложенным мной синтаксисом компилируется и работает без проблем. Аргументы передаются в процедуру на Фортране через указатель? Возможно, имеет место несоответствие передаваемых и ожидаемых типов аргументов. Было бы здорово увидеть проблемный вызов и объявление процедуры на Фортране. Сообщение отредактировал ignit0r - 27.9.2006, 17:49 -------------------- Неужели не ясно, что выбирать? Жизнь надо выбирать! Что же еще? Не телескопы же ваши, не пробирки... Да пусть они ими подавятся, телескопами вашими! Диффузными газами!.. Жить надо, любить надо, природу ощущать надо - ощущать, а не ковыряться в ней! (А. и Б. Стругацкие, "За миллиард лет до конца света")
---- It's like the Alt+F4 for our universe... |
27.9.2006, 18:11
Сообщение
#5
|
|
супер-элита Группа: VIP Сообщений: 777 Репутация: 32 Предупреждения: (0%) |
Опс, а я тут пока эксперименировал, вроде сам все понял. Хотел поподробнее написать, что вызывает ошибку -- и, как обычно бывает, все решилось. Давно я что-то серьезно не программировал... Все выяснял, как соотносятся разные типы данных в фортране и си, как сделать, чтобы и там и там был integer четырехбайтный... И забыл, что раз все аргументы по ссылке передаются, это совершенно не важно, все равно там в стеке именно адрес лежит. И самое главное -- как раз не забыть "&" в нужном месте. А именно его я в одном месте забыл (что интересно, только в одном из четырех).
Все, спасибо! Все наконец-то работает. Не там искал... -------------------- Just me, Gavrilla.
|
Текстовая версия | Сейчас: 10.04.2016, 3:36 |