next up previous contents
Next: Представление Up: Способность языка к взаимодействию Previous: Инициализация   Contents

Передача указателей

Указатели передают между языками ФОРТРАН и Си или С++, используя явный упаковщик Си, чтобы преобразовать указатели языка ФОРТРАН к указателям Си. Прямого доступа к указателям Си или С++ в языке ФОРТРАН нет. Указатели передают между Си и С++, используя перегруженные операторы С++, вызываемые из кода С++. Прямого доступа к объектам С++ из Си нет.

Си и ФОРТРАН. Определение типа MPI_Fint предназначено в Си/С++ для целого числа размера, который соответствует INTEGER языка ФОРТРАН; часто MPI_Fint будет эквивалентен int.

Следующие функции предназначены в Си, чтобы преобразовать указатель коммуникатора языка ФОРТРАН (который является целым числом) к указателю коммуникатора языка Си, и наоборот.

MPI_Comm MPI_Comm_f2c(MPI_Fint comm)

Если comm - действительный указатель языка ФОРТРАН к коммуникатору, то MPI_Comm_f2c возвращает действительный указатель Си к тому же самому коммуникатору; если comm = MPI_COMM_NULL (значение ФОРТРАНА), то MPI_Comm_f2c возвращает нулевой указатель Си; если comm - недействительный указатель коммуникатора языка ФОРТРАН, то MPI_Comm_f2c возвращает недействительный указатель коммуникатора Си.

MPI_Fint MPI_Comm_c2f(MPI_Comm comm)

Функция MPI_Comm_c2f транслирует указатель коммуникатора языка Си в указатель языка ФОРТРАН того же самого коммуникатора; она отображает нулевой указатель в нулевой указатель и недействительный указатель в недействительный указатель.

Подобные функции предназначаются для других типов скрытых объектов.

MPI_Datatype MPI_Type_f2c(MPI_Fint datatype) MPI_Fint MPI_Type_c2f(MPI_Datatype datatype) MPI_File MPI_File_f2c(MPI_Fint file) MPI_Fint MPI_File_c2f(MPI_File file) MPl_Group MPI_Group_f2c(MPI_Fint group) MPI_Fint MPI_Group_c2f(MPI_Group group) MPI_Info MPI_Info_f2c(MPI_Fint info) MPI_Fint MPI_Info_c2f(MPI_Info info) MPI_Op MPI_Op_f2c(MPI_Fint op) MPI_Fint MPI_Op_c2f(MPI_Op op) MPI_Request MPI_Request_f2c(MPI_Fint request) MPI_Fint MPI_Request_c2f(MPI_Request request) MPI_Win MPI_Win_f2c(MPI_Fint win) MPI_Fint MPI_Win_c2f(MPI_Win win)

Пример 4.9 Пример ниже иллюстрирует, как функция MPI языка ФОРТРАН MPI_TYPE_COMMIT может быть осуществлена, упаковывая функцию MPI Си MPI_Type_commit с упаковщиком Си, чтобы сделать преобразования указателя. В этом примере принят ФОРТРАН-Си интерфейс, где функция языка ФОРТРАН набрана заглавными буквами, когда упоминается от Си, и аргументы передаются через адреса.

! ПРОЦЕДУРА ЯЗЫКА ФОРТРАН SUBROUTINE MPI_TYPE_COMMIT(DATATYPE, IERR) INTEGER DATATYPE, IERR CALL MPI_X_TYPE_COMMIT(DATATYPE, IERR) RETURN END /* Упаковщик Си */ void MPI_X_TYPE_COMMIT(MPI_Fint *f_handle, MPI_Fint *ierr) { MPI_Datatype datatype; datatype = MPI_Type_f2c(*f_handle); *ierr = (MPI_Fint)MPI_Type_commit(&datatype); f_handle = MPI_Type_c2f(datatype); return; }

Тот же самый подход может использоваться для всех других функций MPI. Вызов MPI_xxx_f2c (соответственно MPI_xxx_c2f) может быть опущен, когда указатель является OUT (соответственно IN) аргументом, а не INOUT.

Объяснение: Оформление обеспечивает здесь удобное решение для распространенного случая, где используется упаковщик Си, чтобы позволить коду языка ФОРТРАН вызвать библиотеку Си, или коду Си вызвать библиотеку языка ФОРТРАН. Использование упаковщиков Си - более вероятно, чем использование упаковщиков ФОРТРАН, потому что более вероятно, что переменную типа INTEGER можно передать в Си, чем указатель Си можно передать в ФОРТРАН.

Возвращение преобразованного значения как значения функции, а не через список параметров, позволяет генерировать эффективный встроенный код, когда эти функции просты (например, тождество). Функция преобразования в упаковщике не захватывает недействительный аргумент указателя. Вместо этого недействительный указатель передают ниже в библиотечную функцию, которая, возможно, проверяет его входные аргументы. []

Си и С++. Интерфейс языка С++ обеспечивают функции, перечисленные ниже для многоязыковой способности к взаимодействию. Эстафетный <CLASS> используется ниже, чтобы указать любое действительное MPI скрытое имя указателя (например, Group), кроме специально отмеченных случаев. Для случая, где происходил класс С++, соответствующий <CLASS>, функции класса также предназначаются для преобразования между полученными классами и MPI_<CLASS> языка Си.

Следующая функция позволяет назначение от указателя MPI языка Си до указателя MPI языка С++.

MPI::<CLASS>& MPI::<CLASS>::operator=(const MPI_<CLASS>& data)

Конструктор ниже создает объект MPI С++ из указателя MPI Си. Это позволяет автоматическое преобразование указателя MPI языка Си к указателю MPI языка С++.

MPI::<CLASS>::<CLASS>(const MPI_<CLASS>& data)

Пример 4.10 Для программы Си, чтобы использовать библиотеку С++, библиотека С++ должна экспортировать интерфейс Си, который обеспечивает соответствующие преобразования перед использованием основного вызова из библиотеки С++. Этот пример показывает функцию интерфейса Си, которая использует вызов из библиотеки С++ с коммуникатором Си; коммуникатор автоматически преобразован к указателю С++, когда вызвана основная функция С++.

// Прототип библиотечной функции C++ void cpp_lib_call(MPI::Comm& cpp_comm); // Экспортируемый прототип функции C extern "C" void c_interface(MPI_Comm c_comm); void c_interface(MPI_Comm c_conm) { // MPI_Comm (c_comm) автоматически преобразован к MPI::Comm cpp_lib_call(c_comm); }

Следующая функция позволяет преобразовать объекты С++ в указатели MPI языка Си. В этом случае оператор приведения перегружен, чтобы обеспечить функциональные возможности.

MPI::<CLASS>::operator MPI_<CLASS>() const

Пример 4.11 Подпрограмма библиотеки Си вызывается из программы С++. Подпрограмма библиотеки Си смоделирована, чтобы принимать MPI_Comm как аргумент.

// Прототип функции Си extern "C" { void c_lib_call(MPI_Comm c_comm); } void cpp_function() { // Создает коммуникатор C++, и инициализирует его с dup // MPI::COMM_WORLD MPI::Intracomm cpp_comm(MPI::COMM.WORLD.Dup()); c_lib_call(cpp_comm); }

Объяснение: Обеспечение преобразования из Си в С++ через конструкторы и из С++ в Си через приведение позволяет компилятору делать автоматические преобразования. Вызов Си из С++ становится тривиальным, так что обеспечивается интерфейс языка Си или ФОРТРАН к библиотеке С++.[]

Совет пользователям: Обратите внимание, что операторы приведения и содействия возвращают новые указатели значения. Использование этих новых указателей как параметров INOUT затронет внутренний объект MPI, но не будет затрагивать первоначального указателя, из которого он приводился. []

Важно обратить внимание, что все объекты С++ и их соответствующие указатели Си могут взаимозаменяемо использоваться приложением. Например, приложение может кэшировать атрибут на MPI_COMM_WORLD и позже восстанавить его из MPI::COMM_WORLD.



Alex Otwagin 2002-12-10