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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2015, 21:11   #1
фаридофф
Новичок
Джуниор
 
Регистрация: 09.08.2012
Сообщений: 2
По умолчанию MPI В C++

Error 1 error C4700: uninitialized local variable 'ProcNum' used
Код:
#include <stdio.h>
#include <MPI.h>
// Умножение матрицы на вектор – ленточное горизонтальное разбиение
// (исходный и результирующий векторы дублируются между процессами)	
// Функция для выделения памяти и инициализации исходных данных
void ProcessInitialization(double* &pMatrix, double* &pVector,
	double* &pResult, double* &pProcRows, double* &pProcResult,	int &Size, int RowNum=0 )
{
	int RestRows, ProcRank;	// Количество строк матрицы, которые еще 
	// не распределены
	int i, ProcNum = 0;
	if (ProcRank == 0) {
		do {
			printf("\nВведите размер матрицы: ");
			scanf_s("%d", &Size);
			if (Size < ProcNum) {
				printf("Размер матрицы должен превышать количество 	процессов!\n ");
			}
		} while (Size < ProcNum);
	}
	MPI_Bcast(&Size, 1, MPI_INT, 0, MPI_COMM_WORLD);

	RestRows = Size;
	for (i = 0; i<ProcRank; i++)
		RestRows = RestRows - RestRows / (ProcNum - i);
	RowNum = RestRows / (ProcNum - ProcRank);

	pVector = new double[Size];
	pResult = new double[Size];
	pProcRows = new double[RowNum*Size];
	pProcResult = new double[RowNum];

	if (ProcRank == 0) {
		pMatrix = new double[Size*Size];
	}
}
// Функция для распределения исходных данных между процессами
void DataDistribution(double* pMatrix, double* pProcRows,
	double* pVector, int Size, int RowNum) {
	int *pSendNum, ProcNum;    	// Количество элементов, посылаемых процессу
	int *pSendInd;    	// Индекс первого элемента данных, 
	// посылаемого процессу
	int RestRows = Size;	// Количество строк матрицы, которые еще 
	// не распределены

	MPI_Bcast(pVector, Size, MPI_DOUBLE, 0, MPI_COMM_WORLD);

	// Выделение памяти для хранения временных объектов
	pSendInd = new int[ProcNum];
	pSendNum = new int[ProcNum];
	int ProcRank;
	// Определение положения строк матрицы, предназначенных 
	// каждому процессу
	RowNum = (Size / ProcNum);
	pSendNum[0] = RowNum*Size;
	pSendInd[0] = 0;
	for (int i = 1; i<ProcNum; i++) {
		RestRows -= RowNum;
		RowNum = RestRows / (ProcNum - i);
		pSendNum[i] = RowNum*Size;
		pSendInd[i] = pSendInd[i - 1] + pSendNum[i - 1];
	}
	// Рассылка строк матрицы
	MPI_Scatterv(pMatrix, pSendNum, pSendInd, MPI_DOUBLE, pProcRows,
		pSendNum[ProcRank], MPI_DOUBLE, 0, MPI_COMM_WORLD);

	// Освобождение памяти
	delete[] pSendNum;
	delete[] pSendInd;
}
// Функция для вычисления части результирующего вектора
void ParallelResultCalculation(double* pProcRows, double* pVector,
	double* pProcResult, int Size, int RowNum) {
	int i, j;
	for (i = 0; i<RowNum; i++) {
		pProcResult[i] = 0;
		for (j = 0; j<Size; j++)
			pProcResult[i] += pProcRows[i*Size + j] * pVector[j];
	}
}

// Функция для сбора результирующего вектора на всех процессах
void ResultReplication(double* pProcResult, double* pResult,
	int Size, int RowNum) {
	int *pReceiveNum;  // Количество элементов, посылаемых процессом
	int *pReceiveInd;  // Индекс элемента данных в результирующем 
	// векторе
	int RestRows = Size; // Количество строк матрицы, которые еще не 
	// распределены
	int i, ProcNum;

	// Выделение памяти для временных объектов
	pReceiveNum = new int[ProcNum];
	pReceiveInd = new int[ProcNum];

	// Определение положения блоков результирующего вектора 
	pReceiveInd[0] = 0;
	pReceiveNum[0] = Size / ProcNum;
	for (i = 1; i<ProcNum; i++) {
		RestRows -= pReceiveNum[i - 1];
		pReceiveNum[i] = RestRows / (ProcNum - i);
		pReceiveInd[i] = pReceiveInd[i - 1] + pReceiveNum[i - 1];
	}
	// Сбор всего результирующего вектора на всех процессах
	int ProcRank;
	MPI_Allgatherv(pProcResult, pReceiveNum[ProcRank],
		MPI_DOUBLE, pResult, pReceiveNum, pReceiveInd,
		MPI_DOUBLE, MPI_COMM_WORLD);

	// Освобождение памяти
	delete[] pReceiveNum;
	delete[] pReceiveInd;
	void RandomDataInitialization(double pMatrix, double  pVector, double Size);


}
почему возникает данная ошибка и как ее избежать?

Последний раз редактировалось Аватар; 27.06.2015 в 21:42.
фаридофф вне форума Ответить с цитированием
Старый 27.06.2015, 22:07   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Цитата:
почему возникает данная ошибка
переведите текст ошибки и все станет ясно

Код:
int i, ProcNum;

// Выделение памяти для временных объектов
pReceiveNum = new int[ProcNum];
pReceiveInd = new int[ProcNum];
И какой размер вы выделяете? Чему равно ProcNum будет?
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MPI koldunja C++ Builder 0 13.01.2013 14:17
MPI Symple me Visual C++ 7 10.10.2012 14:51
MPI Sparky Помощь студентам 0 21.05.2012 14:29
MPI Olga_611 Помощь студентам 0 25.03.2012 10:05
mpi skrudjmagdak C++ Builder 4 23.03.2010 19:05