передача покажчиків

  1. передача покажчиків

Next: подання Up: Здатність мови до взаємодії Previous: ініціалізація

& nbsp 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

Спонсори:

Хостинг:



Навигация сайта
Новости
Реклама
Панель управления
Информация