Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2014, 10:01   #1
VedyNN
 
Аватар для VedyNN
 
Регистрация: 31.03.2009
Сообщений: 5
По умолчанию OpenMP MPI::Init помогите разобраться с аргументами

Доброго времени суток!

В книге "Технологии параллельного программирования" Лупин С.А. Есть простой пример на С программы выводящей строку и он компилируется и работает, но если переписать его на С++ компилятор выдает ошибку о некорректных аргументах передаваемых функции Init.

Пример из книги на С :

Код:
#include <stdio.h>
#include <mpi.h>

int main(int argc, char* argv[]){

MPI_Init(&argc, &argv);
printf("any text\n");
MPI_Finalize();

return 0;
}
Та же программа на С++
API C++
http://www.open-mpi.org/doc/v1.6/man3/

#include <iostream>
Код:
#include <mpi.h>

int main(int argc, char* argv[]){

MPI::Init(&argc, **&argv);
std::cout<<"any text"<<std::endl;
Finalize();

return 0;
}


Компиляция производится с помощью mpic++ v 1.6 ОС Linux
Запуск приложения через mpirun
Не могу предоставить пример ошибки из-за недоступности ПК.
VedyNN вне форума Ответить с цитированием
Старый 07.04.2014, 10:13   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вот как вот это &argv из С вдруг стало **&argv в С++? Какой логикой вы руководствовались?
p51x вне форума Ответить с цитированием
Старый 07.04.2014, 12:25   #3
VedyNN
 
Аватар для VedyNN
 
Регистрация: 31.03.2009
Сообщений: 5
По умолчанию

Логика примерно такая:
Во-первых апи где указан второй аргумент функции как **&argv.
Тут я запутался так как на той же странице для С указан второй аргумент как ***argv ему можно присвоить значение &argv значит в С++ варианте правомерно присвоить второму аргументу значение &*argv.

Не до конца понимаю механизм работы указателей и ссылок...
VedyNN вне форума Ответить с цитированием
Старый 07.04.2014, 12:36   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

еще раз:
Код:
int main(int argc, char* argv[]){

MPI_Init(&argc, &argv);
Код:
int main(int argc, char* argv[]){

MPI::Init(&argc, **&argv);
каким образом оно мутировало?
(указатели и в С и в С++ одинаковые как бы)
Цитата:
Тут я запутался так как на той же странице для С указан второй аргумент как ***argv ему можно присвоить значение &argv значит в С++ варианте правомерно присвоить второму аргументу значение &*argv.
в С++ варианте объявление какое?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.04.2014, 13:24   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
ему можно присвоить значение &argv значит в С++ варианте правомерно присвоить второму аргументу значение &*argv
С чего вдруг? Почему в С вы берете адрес указателя, т.е. фактически делает двойной указатель, а в С++ разыменовываете указатель и опять берете адрес?

Может вы просто не в курсе про операции разыменования и взятия адреса? И не понимаете, что &*argv != &argv... хотя тут даже по значка видно, что не похоже. Странно...

Цитата:
в С++ варианте объявление какое?
Тоже самое... МПИ функции через экстернен С объявлены.

Последний раз редактировалось p51x; 07.04.2014 в 13:27.
p51x вне форума Ответить с цитированием
Старый 07.04.2014, 14:07   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Тоже самое... МПИ функции через экстернен С объявлены.
а просто в неймспейсе.
тогда вообще не понимаю логики.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.04.2014, 08:59   #7
VedyNN
 
Аватар для VedyNN
 
Регистрация: 31.03.2009
Сообщений: 5
По умолчанию

В моих действиях логики мало :D

Разобрался корректным будет такой вариант

Код:
MPI::Init (*&argc , *&argv);
Не совсем понял ведь &argc в апи говорит что мы должны передать адрес первой переменной , ведь так трактуется эта операция? почему при передачи ее в качестве аргументы я получаю ошибку вида
Код:
 В функции «int main(int, char**)»:
testmpi.cpp:7:33: ошибка: нет соответствующей функции для вызова «Init(int*, char**&)»
testmpi.cpp:7:33: замечание: candidates are:
In file included from /usr/lib/openmpi/include/openmpi/ompi/mpi/cxx/mpicxx.h:289:0,
                 from /usr/lib/openmpi/include/mpi.h:2087,
                 from testmpi.cpp:2:
/usr/lib/openmpi/include/openmpi/ompi/mpi/cxx/functions_inln.h:119:1: замечание: void MPI::Init(int&, char**&)
/usr/lib/openmpi/include/openmpi/ompi/mpi/cxx/functions_inln.h:119:1: замечание:   no known conversion for argument 1 from «int*» to «int&»
/usr/lib/openmpi/include/openmpi/ompi/mpi/cxx/functions_inln.h:126:1: замечание: void MPI::Init()
/usr/lib/openmpi/include/openmpi/ompi/mpi/cxx/functions_inln.h:126:1: замечание:   candidate expects 0 arguments, 2 provided
Хотя в файлике функция объявлена как

Код:
MPI::Init(int& argc, char**& argv)
{
  (void)MPI_Init(&argc, &argv);
  Real_init();
}
VedyNN вне форума Ответить с цитированием
Старый 10.04.2014, 10:08   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Не совсем понял ведь &argc в апи говорит что мы должны передать адрес первой переменной , ведь так трактуется эта операция?
узнайте сначала что значит &, это не только взятие адреса.
Цитата:
Разобрался корректным будет такой вариант
неа
Код:
MPI::Init (argc , argv);
Цитата:
В моих действиях логики мало :D
плохая фраза для программиста.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.04.2014, 10:28   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Код:
*&argc
ЕЩЕ раз: прочитайте про операции разыменования и взятия адреса. Включите логику и подумайте зачем делать две операции в пустую.. это если б вы передавали не 2 (как требуется), а 2 + 2 - 2
p51x вне форума Ответить с цитированием
Старый 10.04.2014, 12:02   #10
VedyNN
 
Аватар для VedyNN
 
Регистрация: 31.03.2009
Сообщений: 5
По умолчанию

Цитата:
ЕЩЕ раз: прочитайте про операции разыменования и взятия адреса. Включите логику и подумайте зачем делать две операции в пустую.. это если б вы передавали не 2 (как требуется), а 2 + 2 - 2
Этим сейчас и займусь.

Спасибо всем за терпение и ответы.
VedyNN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо переделать программу из MPI в OpenMP MrViperTNU Помощь студентам 0 04.04.2012 16:09
Распараллеливание кусочка кода на Си (MPI && openMP) Quew Общие вопросы C/C++ 0 02.02.2012 19:38
Задача на С++ с аргументами Sofa Помощь студентам 1 22.12.2011 22:13
Помогите с MPI, плз! kbbudanov Общие вопросы C/C++ 1 25.11.2009 17:53
Параллельная программа для метода холецкого с помощью openMp и mpi игоревна Помощь студентам 0 06.06.2009 20:47