Member 12855422 Ответов: 1

Сортировка слиянием не работает.


У меня есть код сортировки слияния в MPI:

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

#include "mpi.h"

#pragma comment (lib, "msmpi.lib")

using namespace std;


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

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

	/********** Create and populate the array **********/

	int n = atoi(argv[1]);
	//int *original_array = malloc(n * sizeof(int));
	int *original_array = reinterpret_cast<int*>(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 = reinterpret_cast<int*>(malloc(n * 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 = reinterpret_cast<int*>(malloc(n * 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 = reinterpret_cast<int*>(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);
		delete[] sorted;
		delete[] other_array;
		//free(other_array);

	}

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

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

	system("pause");

}

/********** 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);

	}

}


Но когда я запускаю программу, она выключается, и все. Как я могу это исправить?

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

система ("пауза"); - не работает, консоль появляется через 1-2 секунды.
Пил подключения.

jeron1

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

Member 12855422

Вы правы! Я нашел некоторые ошибки при отладке кода, это LNK2019. Как я могу это исправить?

jeron1

Вы на самом деле не отлаживали, потому что exe-файл не был построен, то, что вы видите, - это ошибка компоновщика, что-то, что происходит во время процесса сборки. Попробуйте опубликовать всю ошибку целиком.

NotPolitcallyCorrect

https://msdn.microsoft.com/en-us/library/799kze2z.aspx

Philippe Mori

Не смешивайте выделение памяти C и C++. Если вы кодируете на C++, то используйте new и если вы кодируете на C, то не используйте никакой C++...

В частности, это неопределенное поведение, если вы вызываете delete или распределение, сделанное с помощью malloc.

jeron1

По-видимому, им сказали то же самое в более ранней теме. Ошибка в сортировке слияния кода с MPI C++[^]

Richard MacCutchan

Это уже третий раз, когда вы задаете этот вопрос, и вы до сих пор (кажется) не поняли, как построить свою программу. Я предлагаю вам написать очень короткую тестовую программу и связать ее с MPI (что бы это ни было), прежде чем пытаться запустить вышеописанное.

1 Ответов

Рейтинг:
1

KarstenK

Сначала: не смешивайте malloc и delete. Используйте new и delete, потому что у них есть современные команды для C++.

Во-вторых: ваши массивы для сортировки не инициализированы.

Третье и последнее: научитесь использовать отладчик в вашей IDE. Понаблюдайте за некоторыми видеоролики на YouTube за то, что научился.