[FORTRAN,WIN]объявление функции из дллки & вопрос про Intel Compiler

Andbar

Как правильно объявлять функции из самописной dllки?
Смотрел стандартные заголовки у интеловского фортрана, там никакого упоминания о dll-ках нет, просто описания функций с указанием их имени в dll, а также ссылки на lib-файл. Вот только lib-файла в моём случае нет.
зы: в поисковике наиболее обещающие ссылки указывают на описания из книжных магазинов

durka82

Объявлять для использования в своей проге на фортране?
Попробуй использовать interface - в компаковском и интеловском хелпе по нему даже вроде бы написано про внешние длл (в Бартеньеве точно было).

Andbar

ладно, попробую еще поискать.
Другой вопрос... Поставил Intel Fortran 7.1, пишу некий код, что-то типа:
module rcrt
use dfwinty
use kernel32
integer(HANDLEprivate :: CHandle

contains

subroutine InitCrt
CHandle = GetStdHandle(STD_INPUT_HANDLE)
end subroutine

end module
компилится нормально, а при линковке получаю:
RCRT.obj : error LNK2001: unresolved external symbol _GETSTDHANDLE
Аналогично с функцией Beep
Если использовать Compaq Visual Fortran, то всё нормально линкуется. Это как-то лечится?

durka82

Если использовать Compaq Visual Fortran, то всё нормально линкуется.

У компаковского и интеловского фортрана не все библиотеки называются одинаково и имеют одинаковую функциональность (например компаковский dflib - более менее соответствует интеловскому iflib)
RCRT.obj : error LNK2001: unresolved external symbol _GETSTDHANDLE

То есть если твоя GETSTDHANDLE описана в use dfwinty - попробуй вместо dfwinty использовать ifwinty (здесь у меня фортрана нет, но наверняка должна быть либа с аналогичной функциональностью).
Вот такая вот совместимость у интеловского фортрана с компаковским
п.с.:
Есть еще такой вариант - можно скопировать компаковскую библиотеку в папку интеловских библиотек (там вроде бы еще файл с описанием нужно малость подправить по аналогии). Но по понятным причинам это не работает для 64-х битного компилятора.

Andbar

Ммм... GetStdHandle описана в kernel32:

INTERFACE
FUNCTION GetStdHandle( &
nStdHandle)
USE DFWINTY
integer(HANDLE) :: GetStdHandle ! HANDLE
!MS$ ATTRIBUTES STDCALL, ALIAS:'_Ge4' :: GetStdHandle
integer(DWORD) nStdHandle ! DWORD nStdHandle
END FUNCTION
END INTERFACE
В компаковском фортране - тоже самое

interface !lib=kernel32.lib
integer(4) function GetStdHandle (nStdHandle)
!DEC$ ATTRIBUTES DEFAULT :: GetStdHandle
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_Ge4' :: GetStdHandle
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'GetStdHandle' :: GetStdHandle
!DEC$ ENDIF
integer nStdHandle
end function GetStdHandle
end interface
Кстати, в обоих файлах есть use dfwinty
И еще одно. другие функции из того-же kernel32 нормально линкуются. Например, SetConsoleCursorPosition, FillConsoleOutputCharacter, etc.

durka82

dfwinty в либах интеловского фортрана есть?
А то мб в C:\Program Files\Intel\Compiler70\IA32\Include\KERNEL32.F90 ошибка - забыли исправить?..
Еще можно попробовать
INTERFACE
FUNCTION GetStdHandle( &
nStdHandle)
USE DFWINTY
integer(HANDLE) :: GetStdHandle ! HANDLE
!MS$ ATTRIBUTES STDCALL, ALIAS:'_Ge4' :: GetStdHandle
integer(DWORD) nStdHandle ! DWORD nStdHandle
END FUNCTION
END INTERFACE
явно прописать в своей либе.
Еще такое соображение - integer по умолчанию в интеловском и компаковском проектах точно одинаковой размерности?

Andbar

Еще такое соображение - integer по умолчанию в интеловском и компаковском проектах точно одинаковой размерности?
ну размерность задаётся тем, что в описании винапишных функций BOOL и DWORD имеют размер 4 байта, просто так принято.
Да, в обеих папках include имеется dfwinty.f90 (разных размеров, правда а ifwinty.f90 вообще отсутствует.
А вот явное прописывание помогло, спасибо.
Но, вообще говоря, какой-то странный глюк.

durka82

Раз помогло - хорошо.
Насчет глюка - мне вообще фортран показался несколько глючным (и компаковский, и интеловский)
Точнее так: есть некоторый "путь фортрана" - пока ему следуешь - все нормально - стоит немного сойти - на ровном месте могут глюки появиться

Andbar

Да, кстати. А он приводить типы по размерности сам вообще не умеет чтоли? Или догадаться какую размерность надо для константы использовать?
Т.е., у меня есть процедура
subroutine GotoXY(X,Y)
integer(WORD intent(IN) :: X,Y
...
end subroutine
При этом компилятор ругается на вызов GotoXY(1,1 приходится писать GotoXY(1_2,1_2)

durka82

Не умеет (хотя мб есть флаг для компилятора)
Если объявить результат функции real*4, а в другую нужно real*8, например, линковщик будет ругаться
Оставить комментарий
Имя или ник:
Комментарий: