Сортировка слиянием не работает.
У меня есть код сортировки слияния в 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 (что бы это ни было), прежде чем пытаться запустить вышеописанное.