LINUX.ORG.RU

Фортран && Си++


0

0

Проблема такая. Вызываю из проги на Си++ функцию из фортрановской библиотеки.
Соответственно создаю для неё заголовочный файл, где меняю integer на int *, double на double *, ну и тд ...

типа вот так
extern "C" {
	void dnaupd_(int*ido, char*bmat, int*n, char *which, 
           int*nev, double *tol, double *resid, 
           int *ncv, double *v, int*ldv,
	     int *iparam, int *ipntr,
           double *workd, double *workl, int *lworkl, int *info);
}

библиотека собирается g77 (gcc-3.4.4) с опциями -O2 -g.

Если эта функция вызывается из .c файла, то всё работает без проблем, 
если она вызывается из .cpp файла и проект собирается с оптимизацией выше чем -O0, то вызов функции возвращает неверные значения

Если собирать весь проект с -O0 или собирать другим компилятором (msvc не зависимо от опций), то всё ok. 

Если собрать отдельно .cpp файлик с вызовом с -O0, а весь проект с -O, то опять возникает хрень.

Из-за чего такое дерьмо может происходить?
★★★★★

Попытаюсь ответить абсолютно не зная фортрана :)

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

в ядре линуха в таких случаях делается приблизительно так:

#define asmlinkage extern "C" __attribute__((regparm(0)))

а потом где-то обьявлается ф-ция, например:

asmlinkage int sys_execve(char *name, char **argv, char **envp);


попробуй info gcc на предмет regparm.

anonymous
()

всё. проблема снята. при первом запуске info надо было инициализировать нулем.

Reset ★★★★★
() автор топика
Ответ на: комментарий от anonymous

вообще всё равно странно и непонятно. написал int info = 0 передаю в функцию на gcc стало работать. но на всякий случай глянул в отладчике msvc чем он по дефолту инициализировал переменную info, оказалось, что черти чем, а ведь всё равно работало.

Reset ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.