@Cybseo

Ошибка Unhandled exception at 0x0099B514 in ConsoleApplication15.exe: 0xC0000094: Integer division by zero. Как исправить это?

Найти все неповторяющиеся элементы двухмерного массива целых чисел с использованием для рассылки строк массива функции MPI_Scatter и MPI_Comm_split для того, чтобы множество процессов разбивалось на три группы
получился такой код
#include <iostream>
#include <unordered_set>
#include <mpi.h>

using namespace std;

int main(int argc, char* argv[])
{
    int rank, size;
    int rows = 0, columns = 0;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    int* matrix = nullptr;
    if (rank == 0)
    {
        cout << "Enter the number of rows: ";
        cin >> rows;
        cout << "Enter the number of columns: ";
        cin >> columns;

        matrix = new int[rows * columns];

        cout << "Enter the elements of the matrix: " << endl;
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < columns; j++)
            {
                cin >> matrix[i * columns + j];
            }
        }
    }

    MPI_Bcast(&rows, 1, MPI_INT, 0, MPI_COMM_WORLD);
    MPI_Bcast(&columns, 1, MPI_INT, 0, MPI_COMM_WORLD);

    int sub_size = rows / size;
    int* local_matrix = new int[sub_size * columns];

    MPI_Scatter(matrix, sub_size * columns, MPI_INT, local_matrix, sub_size * columns, MPI_INT, 0, MPI_COMM_WORLD);

    unordered_set<int> local_set;
    for (int i = 0; i < sub_size; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            local_set.insert(local_matrix[i * columns + j]);
        }
    }

    MPI_Comm sub_comm;
    MPI_Comm_split(MPI_COMM_WORLD, rank / (size / 3), rank, &sub_comm);

    int sub_rank, new_sub_size;
    MPI_Comm_rank(sub_comm, &sub_rank);
    MPI_Comm_size(sub_comm, &new_sub_size);

    unordered_set<int>* global_set = nullptr;
    if (sub_rank == 0)
    {
        global_set = new unordered_set<int>[new_sub_size];
    }

    MPI_Gather(&local_set, sizeof(unordered_set<int>), MPI_BYTE, global_set, sizeof(unordered_set<int>), MPI_BYTE, 0, sub_comm);

    if (sub_rank == 0)
    {
        unordered_set<int> final_set;
        for (int i = 0; i < new_sub_size; i++)
        {
            for (auto it = global_set[i].begin(); it != global_set[i].end(); it++) {
                final_set.insert(*it);
            }
        }
        cout << "The unique elements in the matrix are: ";
        for (auto it = final_set.begin(); it != final_set.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
        delete[] global_set;
    }

    delete[] local_matrix;
    if (rank == 0) {
        delete[] matrix;
    }

    MPI_Finalize();
    return 0;
}


Компиляция проходит успешно, запускается программа, ввожу данные и visual studio на этом шаге
MPI_Comm_split(MPI_COMM_WORLD, rank / (size / 3), rank, &sub_comm);


выкидывает ошибку

Unhandled exception at 0x0099B514 in ConsoleApplication15.exe: 0xC0000094: Integer division by zero.

Как исправить это?
  • Вопрос задан
  • 339 просмотров
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Не делить на ноль.

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

Очевидно, что size/3 оказывается 0, потому что size меньше 3.

Надо менять логику. Или отдельно обрабатывать случай size = 0,1,2 или не делить на 3. Вообще, неясно, откуда в этом коде 3 вылезло и что оно означает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы