Помогите решить проблему Вызвано исключение по адресу 0x00007FF7E367ACDD 0xC0000005: нарушение прав доступа при записи по адресу 0x0000027ACDAA423D 0x

#include <iostream>    
#include <fstream>   

using namespace std;    

int min_in_arr(float arr[], int n);    
int not_in(int arr[], int n, int a);    
int permetation(int arr[], int n, float** prob, float tprob[]);    
float sr_ar(float arr[], int n);
    
int main()
{
    setlocale(LC_ALL, "Russian");


    int ch, k;  // ch - количество частот      k - количество каналов
    ch = 20;    // вводим их вручную смотря на нашу таблицу exel    Проверить количество каналов и частот, мб не надо их задавать как параметры таблицы
    k = 8;

    int work_freq;             //  Вводим количество рабочих частот
    work_freq = 5;

    cout << "Введите требуемую вероятность подключения" << endl;
    float need_prob;                        // Введём требуемую вероятность
    cin >> need_prob;



    ifstream tabl("tabl.xls");    

    float** prob = new float* [k];     // Двумерный массив вероятностей
    for (int i = 0; i < k; i++)
        prob[i] = new float[ch];

    float* freq = new float[ch];    // Массив величин частот

        

    // Введение величины частот
    for (int i = 0; i < ch; i++)
        tabl >> freq[i];

    // Введение вероятности соединения частоты с каналом (заполняем таблицу вероятности)
    for (int i = 0; i < k; i++)
    {
        for (int j = 0; j < ch; j++)
            tabl >> prob[i][j];
    }
    
    tabl.close();



    int* combinations_freq = new int [work_freq];       // Стек для хранения комбинаций частот
 //   for (int i = 0; i < work_freq; i++)
 //       combinations_freq[i] = new int[1];


    for (int i = 0; i < work_freq; i++)             // заполняем массив комбинаций частот частотами от 0-й до work_freq-й частоты
        combinations_freq[i] = i;

    // Это первая комбинация которая в процессе выполнения программы будет меняться
    

    float** rank = new float* [work_freq];     // создаем массив рейтинга хранящий в себе комбинации частот и их среднюю вероятность соединеня
    for (int i = 0; i < work_freq; i++)
        rank[i] = new float[work_freq + 1];


    float* tProb = new float[k];   // Массив хранящий в себе вероятности подключения для каждого канала

    int i = 0;
    while (i != work_freq)  //Пока массив rank не будет заполнен 
    {
        for (int a = 0; a < k; a++)
            tProb[a] = 0;

        bool test = true;

        for (int n = 0; n < k; n++)
        {
            float tmp = 1;
            for (int t = 0; t < work_freq; t++)             // Вычисляем вероятность подключения для каждого канала
            {
                tmp *= 1 - prob[n][combinations_freq[t]];
            }
            
            if (1 - tmp < need_prob)       // Сверяем вероятность с требуемой
            {
                test = false;
                break;
            }
            else  tProb[n] = 1 - tmp;
        }

        if (test)
        {                                                       // Заполняем массив с рейтингом вероятности 
            rank[i][0] = sr_ar(tProb, k);
            for (int a = 0; work_freq; a++)
                rank[i][a] = float(combinations_freq[a]);

            combinations_freq[work_freq] = permetation(combinations_freq, work_freq, prob, tProb);

            i++;
        }
        else
        {
            combinations_freq[work_freq] = permetation(combinations_freq, work_freq, prob, tProb);

        }
    }
    

    //Сортируем массив rank по вероятности подключения
    while (true)
    {
        bool test = true;

        for (int i = 0; i < work_freq - 1; i++)
        {
            if (rank[i][0] < rank[i + 1][0])
            {
                for (int t = 0; t < work_freq + 1; t++)
                {
                    int tmp = rank[i][t];           //Потери данных нет, т.к. в rank лежат номера частот
                    rank[i][t] = rank[i + 1][t];
                    rank[i + 1][t] = tmp;
                }
            }
        }

        for (int i = 0; i < work_freq - 1; i++)
        {
            if (rank[i][0] < rank[i + 1][0])
            {
                test = false;
                break;
            }
        }

        if (test)
            break;

    }



    // Выводим результат действия программы
    for (int i = 0; i < work_freq; i++)
    {
        cout << i + 1 << "\t";
        cout << rank[i][0] << " - ";

        for (int j = 1; j < work_freq + 1; j++)
        {
            cout << rank[i][j] << "  ";
        }
        cout << endl;
    }

}


int min_in_arr(float arr[], int n)          // Параметрами функции являются массив tProb и его длинна
{
    int min = 10000;
    float min_prob = 1.1f;  // Т.К. вероятность всегда будем меньше 1

    for (int i = 0; i < n; i++)
    {
        if (arr[i] < min_prob)
        {
            min = i;
            min_prob = arr[i];
        }
    }

    return min;         // Возвращает индекс канала минимальной вероятности подключения
}

int not_in(int arr[], int n, int a)         // Возвращает номер частоты которй еще нет в используемой комбинации частот
{
    int k = 0;
    bool test = true;
    while (true)
    {
        for (int i = 0; i < n; i++)
        {
            if (k == arr[a])
            {
                test = false;
                break;
            }                
        }

        if (test) return k;
        else k++;
    }


}

int permetation(int arr[], int n, float** prob, float tprob[])
{
    int* new_combination = new int[n];

    float min = 1.1f;
    int index_of_min_prob = 0;

    for (int i = 0; i < n; i++)
    {
        if (prob[min_in_arr(tprob, n)][arr[i]] < min)
        {
            min = prob[min_in_arr(tprob, n)][arr[i]];
            index_of_min_prob = i;
        }            

    }

    for (int i = 0; i < n; i++)
    {
        if (i == index_of_min_prob)
        {
            new_combination[i] = not_in(arr, n, arr[index_of_min_prob]);
        }
        else
        {
            new_combination[i] = i;
        }
    }


    return *new_combination;
}

float sr_ar(float arr[], int n)
{
    float summ = 0;
    for (int i = 0; i < n; i++)
        summ += arr[i];
    return summ / n;
}

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Tim4ukys

У тебя ошибка в цикле for. Чтобы понять где у тебя ошибка, вспомни как устроен цикл for.

for(/*инициализация*/int a = 0; /*проверочное выражение*/work_freq; /*обновляющее выражение*/a++) {
    /*тело*/
}

Говоря простым языком, тело будет выполняться до тех пор, пока проверочное выражение истинно. work_freq в данном случае будет всегда возвращать true, т.к. он не равен нулю. В самом теле цикла у тебя work_freq никак не изменяется => у тебя бесконечный цикл.

Исключение появляется, т.к. "a" рано или поздно превысит размер массива.


Боюсь предположить, но правильно будет наверно вот так

for(int a = 0; a < work_freq; a++)
    rank[i][a] = float(combinations_freq[a]);
→ Ссылка