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);
}
почему возникает данная ошибка и как ее избежать?