Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 22.02.2019
Сообщений: 34
1

Ошибка при delete[]

22.02.2019, 17:52. Показов 1937. Ответов 46
Метки нет (Все метки)

Не понимаю, почему при delete[] Y; выдает ошибку. Без этой строки код работает на ура. Надеюсь на вашу помощь.

Что делает программа:
Кликните здесь для просмотра всего текста

Исходные данные: массив чисел размером N.

Сформировать другой массив из элементов исходного массива, величины
которых находятся в заданных пределах от А до В, и вставить в середину
полученного массива среднее значение элементов этого массива.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <conio.h>
#include <ctime>
 
 
using namespace std;
 
void CreateX(int X[], int N)                        
{
    srand(time(NULL));
 
    printf("Исходный массив: ");
 
    for (int i = 0; i < N; i++)
    {
        X[i] = rand() % 50;
        printf(" %d ", X[i] );
    }
 
}
 
int CreateY(int X[], int N, int Y[], int A, int B)
{
    int k = 0;
    for (int i = 0; i < N; i++)
    {
        if (i >= A - 1 && i <= B - 1) 
        {
            Y[k] = X[i];
            k++;
        }
    }
 
 
    return k;
}
 
int FindAverageValue(int Y[], int k)
{
    int summ = 0; // сумма элементов
    for (int i = 0; i < k; i++)
    {
        summ += Y[i];
    }
    int AverageValue = round(summ / k); // среднее значение
 
    return AverageValue;
}
 
 
void FindAveragePos(int Y[], int k, int AverageValue)
{
    int AveragePos = ceil(k / 2);
 
    for (int i = k + 1; i > AveragePos; i--)
    {
        Y[i] = Y[i - 1];
    }
 
    Y[AveragePos] = AverageValue;
}
 
void InferenceY(int Y[], int k)
{
    printf("\nПолученный массив: ");
    for (int i = 0; i < k + 1; i++)
    {
        printf(" %d ", Y[i]);
    }
}
 
int main()
{
    int N; // количество элементов
    
    setlocale(LC_ALL, "rus");
 
    printf("Введите количество N элементов в массиве: ");
    scanf_s("%d", &N);
 
    int *X = new int[N];
 
    CreateX(X, N);
    
    printf("\nВведите пределы в формате [A ... B]: ");
    int A, // левый предел
        B; // правый предел
        
    scanf_s("%d %d", &A, &B);
 
    int *Y = new int[B - A + 2];
    int k = CreateY(X, N, Y, A, B);
    delete[] X;
 
    int AverageValue =  FindAverageValue(Y, k);
 
    FindAveragePos(Y, k, AverageValue);
 
    InferenceY(Y, k);
    delete[] Y;
 
    _getch();
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2019, 17:52
Ответы с готовыми решениями:

Ошибка при использовании delete
И снова здравствуйте! Пишу раз третий.Я уже готов убицца ап сцену изза этого delete.Я не понимаю...

Ошибка при использовании new[] / delete[]
Здравствуйте. Пишу учебную программу, моделирующую движение лифта (если кто учебник Дейтелов читал,...

Ошибка при вызове delete
Вот код // ConsoleApplication1.cpp: определяет точку входа для консольного приложения. // ...

Ошибка при использовании delete[] C++
Здравствуйте. Я создал класс, где должен динамически выделить память, а потом в конце программы, с...

46
"C with Classes"
1640 / 1262 / 476
Регистрация: 16.08.2014
Сообщений: 5,271
Записей в блоге: 1
22.02.2019, 17:55 2
Лучший ответ Сообщение было отмечено wcoestarw как решение

Решение

Цитата Сообщение от wcoestarw Посмотреть сообщение
Надеюсь на вашу помощь.
память где то расстрелял, в смысле вылез за предел массива и переписал
1
1 / 1 / 0
Регистрация: 22.02.2019
Сообщений: 34
22.02.2019, 18:02  [ТС] 3
Спасибо. Благодаря твоей наводке, устранил проблему путем объявления размерности массива на 1 элемент больше.
0
Модератор
Эксперт CЭксперт С++
4428 / 3997 / 743
Регистрация: 07.10.2015
Сообщений: 8,346
22.02.2019, 20:54 4
wcoestarw, программа написана неправильно!
Требуется: "Сформировать другой массив из элементов исходного массива, величины которых находятся в заданных пределах от А до В".
Т.е. надо найти элементы, значение которых от А до В. Значение, а не индексы!
Посему и создавать массив Y, как в программе, - неправильно!
Рекомендую сделать так: за два прохода. Сначала считаем, сколько таких чисел, затем выделяем память и затем заполняем массив Y.
1
Комп_Оратор)
Эксперт по математике/физике
8676 / 4392 / 596
Регистрация: 04.12.2011
Сообщений: 13,144
Записей в блоге: 16
22.02.2019, 23:12 5
Цитата Сообщение от liv Посмотреть сообщение
Сначала считаем, сколько таких чисел
И за одно суммируем чтобы среднее подсчитать. Тип int как среднее арифметическое смотрится слишком средне кстати.
1
1 / 1 / 0
Регистрация: 22.02.2019
Сообщений: 34
23.02.2019, 13:09  [ТС] 6
Не понял, что тебе не понравилось при выделении памяти под новый массив Y[]. Я указал размерность B - A +2 с запасом на новый элемент (среднее значение).
0
Модератор
Эксперт CЭксперт С++
4428 / 3997 / 743
Регистрация: 07.10.2015
Сообщений: 8,346
23.02.2019, 13:19 7
wcoestarw, перечитай внимательно ещё раз то, что я написал выше

Добавлено через 46 секунд
Что такое А и В?
0
1 / 1 / 0
Регистрация: 22.02.2019
Сообщений: 34
23.02.2019, 13:26  [ТС] 8
A и B - это индексы предельных элементов, в которых будут располагаться элементы нового массива. ( A 5 6 7 8 B)
Я сначала объявляю эти пределы
C++
1
2
int A, // левый предел
    B; // правый предел
, а потом уже выделяю память под массив.
C++
1
int *Y = new int[B - A + 2];
У меня всё работает на ура. В новый массив выводятся значения, а не индексы. Так и не понимаю, чем ты возмущен.
0
Комп_Оратор)
Эксперт по математике/физике
8676 / 4392 / 596
Регистрация: 04.12.2011
Сообщений: 13,144
Записей в блоге: 16
23.02.2019, 13:33 9
Цитата Сообщение от wcoestarw Посмотреть сообщение
Так и не понимаю
Это шаг к успеху. Перечитайте условие и повторите про себя несколько раз:
Цитата Сообщение от wcoestarw Посмотреть сообщение
из элементов исходного массива, величины
которых
находятся в заданных пределах от А до В
не индексов а элементов. То есть, если там нет ни одного, то массив будет содержать один элемент - среднее значение. Массив нужно сделать из чисел с плавающей точкой иначе средне-арифметическое теряет смысл. Не говоря уже о том, что с точки зрения переполнения, всегда лучше:
C++
1
mediocre+=Arr[i]/size_Arr;
А вот если итоговый массив имеет не чётное количество элементов (от A до B) то существует 2 способа вставить в середину. Это минус условию.
1
Модератор
Эксперт CЭксперт С++
4428 / 3997 / 743
Регистрация: 07.10.2015
Сообщений: 8,346
23.02.2019, 13:39 10
Разве индексы? Читаем ещё раз условие:
величины которых находятся в заданных пределах от А до В
Речь идёт о величинах элементов! в пределах А и В, а не о пределах индексов элементов

Добавлено через 6 минут
Да, в массив Y кидаешь значения, а речь то ведём об А и В! Это тоже значения! А ты их используешь для определения размера массива Y
Это не индексы, а значения, а пределах которых и надо выбрать значения из Х
1
1 / 1 / 0
Регистрация: 22.02.2019
Сообщений: 34
23.02.2019, 13:44  [ТС] 11
Всё. Наконец то понял, что ты имел ввиду. Я понял это задание по-своему, и до сих пор не считаю, что понял его неправильно. Скажу тебе потом, что скажет преподаватель на защите, и как надо было правильно.
0
Модератор
Эксперт CЭксперт С++
4428 / 3997 / 743
Регистрация: 07.10.2015
Сообщений: 8,346
23.02.2019, 13:47 12
Ну наконец-то
Рекомендую сделать сразу и второе решение. Ждём вердикт препода
0
"C with Classes"
1640 / 1262 / 476
Регистрация: 16.08.2014
Сообщений: 5,271
Записей в блоге: 1
23.02.2019, 13:49 13
wcoestarw, Сформировать другой массив из элементов исходного массива, величины (не индексы)
которых находятся в заданных пределах от А до В. Лучше исправь сразу, препод скажет тоже самое.
0
Модератор
Эксперт CЭксперт С++
4428 / 3997 / 743
Регистрация: 07.10.2015
Сообщений: 8,346
23.02.2019, 13:51 14
wcoestarw, послушай, что тебе говорят...
Перечитай ещё раз условие , вникни и исправь...
0
"C with Classes"
1640 / 1262 / 476
Регистрация: 16.08.2014
Сообщений: 5,271
Записей в блоге: 1
23.02.2019, 13:58 15
wcoestarw, и покажи препаду оба варианта. нынешний и исправленный, получишь от него респект.
0
1 / 1 / 0
Регистрация: 22.02.2019
Сообщений: 34
23.02.2019, 14:06  [ТС] 16
Хорошо Спасибо.
А все началось с delete []
0
Комп_Оратор)
Эксперт по математике/физике
8676 / 4392 / 596
Регистрация: 04.12.2011
Сообщений: 13,144
Записей в блоге: 16
23.02.2019, 15:42 17
Никому больше не кажется, что даже если выбрать массив double, то и тогда:
Цитата Сообщение от wcoestarw Посмотреть сообщение
вставить в середину полученного массива среднее значение элементов этого массива.
это извращённое порно?
0
"C with Classes"
1640 / 1262 / 476
Регистрация: 16.08.2014
Сообщений: 5,271
Записей в блоге: 1
23.02.2019, 15:47 18
Цитата Сообщение от IGPIGP Посмотреть сообщение
это извращённое порно?
Цитата Сообщение от wcoestarw Посмотреть сообщение
в заданных пределах от А до В
пределы видать тоже нужно контролировать.

Добавлено через 1 минуту
и размерность видимо должна зависеть от пределов
0
Комп_Оратор)
Эксперт по математике/физике
8676 / 4392 / 596
Регистрация: 04.12.2011
Сообщений: 13,144
Записей в блоге: 16
23.02.2019, 15:57 19
_stanislav, ... (хорошо)
1/ Ты понимаешь, что деление нацело в операции получения среднего, это интим? По отношению к среднему в частноcти и математике, вообще?
2/ Вот я вставляю число 7 в середину последовательности 1, 3, 17
7 это среднее из (21/3) я подобрал тройку, чтобы в целых числах оно было красиво.
Как правильно:
1,7,3,17
или
1,3,7,17
?
Имхо, - двойной изврат.
0
"C with Classes"
1640 / 1262 / 476
Регистрация: 16.08.2014
Сообщений: 5,271
Записей в блоге: 1
23.02.2019, 16:08 20
Цитата Сообщение от IGPIGP Посмотреть сообщение
Как правильно:
думаю, если не оговорено конкретно, куда (влево или вправо) вставлять решает разработчик, либо конечно уточнить у клиента
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2019, 16:08

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Ошибка при освобождении памяти (delete)
Здравствуйте! Есть массив lines, созданный вот так : int *line = new int ; Потом, пытаюсь его...

Ошибка при работе delete в деструкторе
enum place { first = 1, second }; class Passanger { public: Passanger(); void Call(); ...

Ошибка при удалении массива с помощью delete
Изучаю C++ и у меня задание разбить текст неопределенной длинны на массив строк. Нацарапал класс...

Ошибка при Delete[] и удаление латинских букв
Задача без ипользования стандартных библиотек ввести размер строки и после этого строку, например ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.