Member 12855422 Ответов: 1

Ошибка в сортировке слияния кода с MPI C++


У меня есть массив сортировки слиянием кода в c++, но он не работает.
Мой код:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <cstdlib>
#include <time.h>
#include <mpi.h>


void merge(int *, int *, int, int, int);
void mergeSort(int *, int *, int, int);
void* malloc(size_t);

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

	/********** Create and populate the array **********/
	int n = atoi(argv[1]);
	int *original_array = malloc(n * sizeof(int));

	int c;
	srand(time(NULL));
	printf("This is the unsorted array: ");
	for (c = 0; c < n; c++) {

		original_array[c] = rand() % n;
		printf("%d ", original_array[c]);

	}

	printf("\n");
	printf("\n");

	/********** Initialize MPI **********/
	int world_rank;
	int world_size;

	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
	MPI_Comm_size(MPI_COMM_WORLD, &world_size);

	/********** Divide the array in equal-sized chunks **********/
	int size = n / world_size;

	/********** Send each subarray to each process **********/
	int *sub_array = malloc(size * sizeof(int));
	MPI_Scatter(original_array, size, MPI_INT, sub_array, size, MPI_INT, 0, MPI_COMM_WORLD);

	/********** Perform the mergesort on each process **********/
	int *tmp_array = malloc(size * sizeof(int));
	mergeSort(sub_array, tmp_array, 0, (size - 1));

	/********** Gather the sorted subarrays into one **********/
	int *sorted = NULL;
	if (world_rank == 0) {

		sorted == malloc(n * sizeof(int));

	}

	MPI_Gather(sub_array, size, MPI_INT, sorted, size, MPI_INT, 0, MPI_COMM_WORLD);

	/********** Make the final mergeSort call **********/
	if (world_rank == 0) {

		int *other_array = malloc(n * sizeof(int));
		mergeSort(sorted, other_array, 0, (n - 1));

		/********** Display the sorted array **********/
		printf("This is the sorted array: ");
		for (c = 0; c < n; c++) {

			printf("%d ", sorted[c]);

		}

		printf("\n");
		printf("\n");

		/********** Clean up root **********/
		free(sorted);
		free(other_array);

	}

	/********** Clean up rest **********/
	free(original_array);
	free(sub_array);
	free(tmp_array);

	/********** Finalize MPI **********/
	MPI_Barrier(MPI_COMM_WORLD);
	MPI_Finalize();

}

/********** Merge Function **********/
void merge(int *a, int *b, int l, int m, int r) {

	int h, i, j, k;
	h = l;
	i = l;
	j = m + 1;

	while ((h <= m) && (j <= r)) {

		if (a[h] <= a[j]) {

			b[i] = a[h];
			h++;

		}

		else {

			b[i] = a[j];
			j++;

		}

		i++;

	}

	if (m < h) {

		for (k = j; k <= r; k++) {

			b[i] = a[k];
			i++;

		}

	}

	else {

		for (k = h; k <= m; k++) {

			b[i] = a[k];
			i++;

		}

	}

	for (k = l; k <= r; k++) {

		a[k] = b[k];

	}

}

/********** Recursive Merge Function **********/
void mergeSort(int *a, int *b, int l, int r) {

	int m;

	if (l < r) {

		m = (l + r) / 2;

		mergeSort(a, b, l, m);
		mergeSort(a, b, (m + 1), r);
		merge(a, b, l, m, r);

	}

}


Ошибка:

Severity    Code    Description Project File    Line    Suppression State
Error (active)      a value of type "void *" cannot be used to initialize an entity of type "int *" ConsoleApplication2 c:\Users\Андрей\Desktop\ЛАБАТРИ\ConsoleApp2\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2.cpp 16


На этой линии:

int *original_array = malloc(n * sizeof(int));


Помогите, пожалуйста!

Что я уже пробовал:

Я попытался написать массив по-другому, но это не сработало. Я пытался писать как
void* malloc(size_t);
но это не работает.

1 Ответов

Рейтинг:
9

Jochen Arndt

С помощью C++ вы должны привести void* возвращаемое значение, поскольку C++ использует строгую систему типов:

int *original_array = reinterpret_cast<int*>(malloc(n * sizeof(int)));

Однако с помощью C++ вы должны использовать new и delete вместо:
int *original_array = new int[n];


Member 12855422

Я использовал этот int *original_array = оператора reinterpret_cast И Л;int*&ГТ;Танос(Н * оператор sizeof(тип int)); но что malloc не работает :(
Я могу создать массив следующим образом: int *original_array = new int[n]; но в сортировке marge мне нужен malloc, да?

Jochen Arndt

Уупс.
Я забыл скобки для оператора cast (см. обновленный ответ).

Вам не нужен malloc (). Вы можете (и должны) заменить его везде новым.
Обратите внимание, что выделенные массивы должны быть удалены с помощью скобок:
удалить [] original_array;

Преимущества использования новых:
- Это типобезопасно
- Не заботьтесь о размере элемента (нет необходимости использовать sizeof())
- delete может быть вызван с нулевым аргументом
- Выбрасывает исключение, когда не хватает памяти

Member 12855422

Большое спасибо!
Где в этом коде я должен удалить массив?

Jochen Arndt

В качестве замены бесплатных () звонков.

Member 12855422

Большое спасибо! Но у меня много ошибок - :(
Например, " Состояние Подавления Строки Файла Проекта Описания Кода Серьезности
Ошибка LNK2001 неразрешенный внешний символ _MPI_Init@8"

Jochen Arndt

Это ошибка компоновщика, которая говорит вам, что код функции MPI_init() не может быть найден.

Вы, вероятно, забыли связать его с библиотекой, содержащей эти функции. Заголовочный файл mpi. h содержит только объявления, но компоновщику нужны определения (реализация). У вас должна быть библиотека (возможно, mpi. lib), которая должна быть добавлена в настройках проекта.

В качестве альтернативы вы можете использовать
#Pragma comment(lib, filename)
с Visual Studio.
Видишь https://msdn.microsoft.com/en-us/library/7f0aews7.aspx

Если у вас все еще есть другие проблемы, такие как такие ошибки компоновщика, вы должны поднять новый вопрос. Это было бы видно всем, кто читает здесь, в то время как спрашивать такое в комментариях видят только немногие.