Fortran and C++
От: Nondefine  
Дата: 25.05.02 13:27
Оценка:
Есть такая проблема. В фортрановском файлике определена функция:
/////////////////////////
INTEGER*4 function my()

INTEGER*4 i1

i1=i1+1
my=i1
return
end
////////////////////////
Потом ее нужно вызвать из сишного:
...

extern int __stdcall my();

void main()
{
integer i;

i = my();

}

В результате при линковке всего этого дела в VC 6.0 с встроенным Compac Visual Fortran 6.1 получаю unresolved external _my.

Как с этим бороться?
Re: Fortran and C++
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 25.05.02 13:46
Оценка:
Здравствуйте Nondefine, Вы писали:

N>Есть такая проблема. В фортрановском файлике определена функция:

N>INTEGER*4 function my()
...
N>Потом ее нужно вызвать из сишного:
N>extern int __stdcall my();

N>В результате при линковке всего этого дела в VC 6.0 с встроенным Compac Visual Fortran 6.1 получаю unresolved external _my.


N>Как с этим бороться?

Ответа я не знаю. Сразу говорю. Но можно попытаться.

Возможно, дело в декорировании имен. Либо в несоответствии соглашений о вызовах. В первом случае ни в одном из прилинкованных obj-файлов не будет найдена функция, требуемая С-шным компилятором. (можно поискать любым текстовым редактором соответствие)

Можно попытаться посмотреть (в map-файле), во что преобразуется имя my. Возможно, поможет вставка "C" между extern и int:
extern "C" int __stdcall my();


Возможно, что и не поможет. Если точно не известно, что фортранные функции имеют соглашение о вызовах __stdcall, то можно попробовать __cdecl.
Алексей Кирдин
Re[2]: Fortran and C++
От: Nondefine  
Дата: 25.05.02 14:01
Оценка:
Здравствуйте Kaa, Вы писали:

Kaa>Здравствуйте Nondefine, Вы писали:


N>>Есть такая проблема. В фортрановском файлике определена функция:

N>>INTEGER*4 function my()
Kaa>...
N>>Потом ее нужно вызвать из сишного:
N>>extern int __stdcall my();

N>>В результате при линковке всего этого дела в VC 6.0 с встроенным Compac Visual Fortran 6.1 получаю unresolved external _my.


N>>Как с этим бороться?

Kaa>Ответа я не знаю. Сразу говорю. Но можно попытаться.

Kaa>Возможно, дело в декорировании имен. Либо в несоответствии соглашений о вызовах. В первом случае ни в одном из прилинкованных obj-файлов не будет найдена функция, требуемая С-шным компилятором. (можно поискать любым текстовым редактором соответствие)


Kaa>Можно попытаться посмотреть (в map-файле), во что преобразуется имя my. Возможно, поможет вставка "C" между extern и int:

Kaa>
Kaa>extern "C" int __stdcall my();
Kaa>


Kaa>Возможно, что и не поможет. Если точно не известно, что фортранные функции имеют соглашение о вызовах __stdcall, то можно попробовать __cdecl.


Известно точно (описано в MSDN), что фортрановские функции, вызываемые из С, должны декларироваться с __stdcall. Но как ни странно и мсдеэновский сампл тоже не линкуется.
Re[3]: Fortran and C++
От: TepMuHyc  
Дата: 25.05.02 14:11
Оценка:
Здравствуйте Nondefine, Вы писали:

N>Известно точно (описано в MSDN), что фортрановские функции, вызываемые из С, должны декларироваться с __stdcall. Но как ни странно и мсдеэновский сампл тоже не линкуется.


Дело в том что ко всем именам сишных функций компилятор неявно добавляет
спереди подчеркивание. Вот на это ты и наступил.

Попробуй в Фортране обьявить эту функцию как _my (если это возможно).
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Re: Fortran and C++
От: YuriS Германия www.yuris.de
Дата: 26.05.02 10:03
Оценка:
Здравствуйте Nondefine, Вы писали:

Вот тебе пример из моего проекта:

Вот так в хедере:
extern "C"
{
   float a03b51_(double*, double*, double*, double*, double*, double*);
};


а вот так в фортране

Double Precision FUNCTION A03B51 (X1,Y1,W1R, X2,Y2,W2R)


И вот так дальше в коде:

double arc=a03b51_(&h->p0_x,&h->p0_y,&h->w0,&h->p1_x,&h->p1_y,&h->w1);


Использую Visual Fortran 6.5
Re: Fortran and C++
От: SergH Россия  
Дата: 27.05.02 01:39
Оценка:
Здравствуйте Nondefine, Вы писали:

N>Есть такая проблема. В фортрановском файлике определена функция:

N>/////////////////////////
N>INTEGER*4 function my()

N>INTEGER*4 i1


N>i1=i1+1

N>my=i1
N>return
N>end
N>////////////////////////
N>Потом ее нужно вызвать из сишного:
N>...

N>extern int __stdcall my();


N>void main()

N>{
N>integer i;

N>i = my();


N>}


N>В результате при линковке всего этого дела в VC 6.0 с встроенным Compac Visual Fortran 6.1 получаю unresolved external _my.


N>Как с этим бороться?


Чтобы сделать функцию stdcall, попробуй определить её так:

N>INTEGER*4 function my[stdcall]()
...
Делай что должно, и будь что будет
Re: Fortran and C++
От: Sergei  
Дата: 27.05.02 11:25
Оценка:
Здравствуйте Nondefine, Вы писали:

Вот пример интерфейсной части фортраной функции:
Interface
Subroutine FGetSpeciesCount
* ( nCount )
!MS$ ATTRIBUTES ALIAS: '_FGetSpeciesCount' :: FGetSpeciesCount
!MS$ ATTRIBUTES STDCALL :: FGetSpeciesCount
!MS$ ATTRIBUTES REFERENCE :: nCount
integer*4 nCount
End Subroutine FGetSpeciesCount
End Interface

На www.programme.ru есть статья в каком-то из номеров об использовании dll C++->Fortran и Fortran->C++
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.