Помогите решить проблему Вызвано исключение по адресу 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]);
