Документ взят из кэша поисковой машины. Адрес оригинального документа : http://wasp.phys.msu.ru/forum/lofiversion/index.php?t6071.html
Дата изменения: Unknown
Дата индексирования: Mon Apr 11 11:25:54 2016
Кодировка: Windows-1251
Студенческий форум Физфака МГУ > Как сделать stdcall в GNU C Compiler?
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сделать stdcall в GNU C Compiler?
Студенческий форум Физфака МГУ > Наука физика > Есть проблема
M_T
А вот еще такой вопрос программерам. Как попросить 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! preved.gif
ignit0r
А чем скомпилирована процедура на FORTRAN? Если это g77, то можно попробовать следующий вариант:
Код
extern "C"{
void foo_(...)
}

Т.е. явно соглашение о передаче аргументов stdcall указывать не нужно.

Да, платформа, надо сказать, непопсовая good.gif
M_T
Ну, собственно, GCC и скомпилирована. Это ж теперь не просто GNU C Compiler, а GNU Compilers Collection!
А так, просто extern "C", я раньше и пробовал. Но это все время дает Segmentation fault (possibly corrupt stack). Что логично, учитывая, что каждый хочет почистить стек. И он становится слишком чистым...
ignit0r
Может быть, SEGFAULT возникает по какой-то другой причине?
У меня тестовая программа с предложенным мной синтаксисом компилируется и работает без проблем.
Аргументы передаются в процедуру на Фортране через указатель? Возможно, имеет место несоответствие передаваемых и ожидаемых типов аргументов.

Было бы здорово увидеть проблемный вызов и объявление процедуры на Фортране.
M_T
Опс, а я тут пока эксперименировал, вроде сам все понял. Хотел поподробнее написать, что вызывает ошибку -- и, как обычно бывает, все решилось. Давно я что-то серьезно не программировал... Все выяснял, как соотносятся разные типы данных в фортране и си, как сделать, чтобы и там и там был integer четырехбайтный... И забыл, что раз все аргументы по ссылке передаются, это совершенно не важно, все равно там в стеке именно адрес лежит. И самое главное -- как раз не забыть "&" в нужном месте. А именно его я в одном месте забыл (что интересно, только в одном из четырех).
Все, спасибо! Все наконец-то работает. Не там искал...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2016 IPS, Inc.