А вот еще такой вопрос программерам. Как попросить 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!
А чем скомпилирована процедура на FORTRAN? Если это g77, то можно попробовать следующий вариант:
Код
extern "C"{
void foo_(...)
}
Т.е. явно соглашение о передаче аргументов stdcall указывать не нужно.
Да, платформа, надо сказать, непопсовая
Ну, собственно, GCC и скомпилирована. Это ж теперь не просто GNU C Compiler, а GNU Compilers Collection!
А так, просто extern "C", я раньше и пробовал. Но это все время дает Segmentation fault (possibly corrupt stack). Что логично, учитывая, что каждый хочет почистить стек. И он становится слишком чистым...
Может быть, SEGFAULT возникает по какой-то другой причине?
У меня тестовая программа с предложенным мной синтаксисом компилируется и работает без проблем.
Аргументы передаются в процедуру на Фортране через указатель? Возможно, имеет место несоответствие передаваемых и ожидаемых типов аргументов.
Было бы здорово увидеть проблемный вызов и объявление процедуры на Фортране.
Опс, а я тут пока эксперименировал, вроде сам все понял. Хотел поподробнее написать, что вызывает ошибку -- и, как обычно бывает, все решилось. Давно я что-то серьезно не программировал... Все выяснял, как соотносятся разные типы данных в фортране и си, как сделать, чтобы и там и там был integer четырехбайтный... И забыл, что раз все аргументы по ссылке передаются, это совершенно не важно, все равно там в стеке именно адрес лежит. И самое главное -- как раз не забыть "&" в нужном месте. А именно его я в одном месте забыл (что интересно, только в одном из четырех).
Все, спасибо! Все наконец-то работает. Не там искал...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.