Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
26 / 26 / 1
Регистрация: 10.09.2018
Сообщений: 241
1

Некорректно работает структура с указателем на bool

23.08.2021, 00:48. Показов 2108. Ответов 8
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Привет, код должен выдавать 111 000, а получаю 111 111
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
#include <cstddef>
#include <utility>
#include <iostream>
 
struct StateMachine
{    
    StateMachine() : fortunes_{nullptr}, size_{0}
    {}
 
    void add(bool& state)
    {
        bool *tmp = new bool[++size_];
        for(size_t i{}; i < size_ - 1; ++i)
            tmp[i] = std::move(fortunes_[i]);
        tmp[size_] = state;
        delete[] fortunes_;
        fortunes_ = new bool[size_];
        for(size_t i{}; i < size_; ++i)
            fortunes_[i] = std::move(tmp[i]);
        delete[] tmp;
    }
 
    void allFalse()
    {
        for(size_t i{}; i < size_; ++i)
            fortunes_[i] = false;
    }
 
    ~StateMachine()
    {
        delete[] fortunes_;
        fortunes_ = nullptr;
    }
 
private:
    bool *fortunes_;
    size_t size_;
};
 
int main()
{
    auto sm = new StateMachine();
    bool x = true, y = true, z = true;
    sm->add(x); sm->add(y); sm->add(z);
    std::cout << x << " " << y << " " << z << std::endl;
    sm->allFalse();
    std::cout << x << " " << y << " " << z << std::endl;
 
    return 0;   
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.08.2021, 00:48
Ответы с готовыми решениями:

некорректно работает динамическая структура данных с++
Взял пример с книги, которая одобренная министерством образования. А код работает не совсем...

не работает bool xor(bool a, bool b)
Учусь по &quot;Базовому курсу&quot; Герберта Шилда #include &lt;iostream&gt; bool xor(bool a, bool d); int...

Структура с указателем
Дана структура typedef struct A{ int *array;}A; . Вопрос такой как обратиться к динамическому...

Функция twoTrue :: Bool -> Bool -> Bool -> Bool
Функция twoTrue :: Bool -&gt; Bool -&gt; Bool -&gt; Bool, которая возвращает True тогда и только тогда,...

8
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
23.08.2021, 01:28 2
1. Уже на 15-й строке выход за пределы массива. Вставляется на size-1 место.
2. move для bool'а абсолюно и полностью бесполезен.
3. В add не создавать 2 массива надо, а просто сделать fortunes_=tmp после удаления старого fortunes_.
4. Обнулять fortunes_ в деструкторе бессмысленно, вы его вызываете когда обьект удаляется, а значит указатель вы уже не используете.

Наконец, ваша проблема заключается в том что вы выходите значение x, y и z, а должны выводить значение элементов fortunes_..
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12812 / 6684 / 1800
Регистрация: 18.10.2014
Сообщений: 16,935
23.08.2021, 06:39 3
Цитата Сообщение от Egor2287678888 Посмотреть сообщение
C++
1
2
3
4
        bool *tmp = new bool[++size_];
        for(size_t i{}; i < size_ - 1; ++i)
            tmp[i] = std::move(fortunes_[i]);
        tmp[size_] = state;
В чем смысл этих загадочных манипуляций с массивом tmp и перекачиванием данных туда-обратно? Откуда вы это берете? Эта слепая бессмыслица повторяется в коде некоторых новичков здесь, то есть кто-то где-то этому "учит". Кто это делает?

Чтобы увеличить размер массива достаточно выделить новый массив, скопировать в него данные и освободить старый. Это одно выделение памяти, одно копирование и одно освобождение памяти. У вас у коде всего по два. Откуда лезет эта странная слепая манера использовать промежуточный массив и заниматься переливанием из пустого в порожнее? Где вы такое увидели? Что за ресурс/учебник/заведение насаждает подобное?

Цитата Сообщение от Egor2287678888 Посмотреть сообщение
tmp[size_] = state;
Почему tmp[size_]??? Это вылет за пределы массива.
0
Модератор
Эксперт С++
 Аватар для zss
13727 / 10923 / 6480
Регистрация: 18.12.2011
Сообщений: 29,157
23.08.2021, 09:55 4
Уточню, что имели ввиду Bleach163 и TheCalligrapher
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void add(bool state) // тут передача bool по ссылке ничем не лучше передачи по значению
{
        bool *tmp = new bool[++size_];
        for(size_t i=0; i < size_ - 1; ++i)
            tmp[i] = fortunes_[i];
        tmp[size_-1] = state; //  !!!!! size_ -1
        delete[] fortunes_;
        //fortunes_ = new bool[size_];
        //for(size_t i{}; i < size_; ++i)
        //    fortunes_[i] = std::move(tmp[i]);
        //delete[] tmp;
        fortunes_ = tmp; //  !!!!!!!!!!!!!
}
0
26 / 26 / 1
Регистрация: 10.09.2018
Сообщений: 241
23.08.2021, 10:22  [ТС] 5
Bleach163,TheCalligrapher, zss, последнее про
"ваша проблема заключается в том что вы выходите значение x, y и z, а должны выводить значение элементов fortunes_.."
В том и дело что мне надо добавить ссылки и при обнулении были x,y,z = 0;
0
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
23.08.2021, 10:25 6
Egor2287678888, а вектором пользоваться запрещено?
0
26 / 26 / 1
Регистрация: 10.09.2018
Сообщений: 241
23.08.2021, 10:38  [ТС] 7
Алексей1153, Da)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12812 / 6684 / 1800
Регистрация: 18.10.2014
Сообщений: 16,935
23.08.2021, 17:59 8
Цитата Сообщение от Egor2287678888 Посмотреть сообщение
В том и дело что мне надо добавить ссылки
Что такое "добавить ссылки"?
0
 Аватар для SmallEvil
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
23.08.2021, 18:21 9
Лучший ответ Сообщение было отмечено Egor2287678888 как решение

Решение

Цитата Сообщение от Egor2287678888 Посмотреть сообщение
мне надо добавить ссылки
если нужно изменить внешние переменные x,y,z, стоит использовать указатели.
Вопрос лишь, действительно ли это нужно ?

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
#include <cstddef>
#include <utility>
#include <iostream>
 
struct StateMachine
{    
    StateMachine() : fortunes_{nullptr}, size_{0}
    {}
 
    void add(bool* state)
    {
        bool ** tmp = new bool*[++size_];
        for(size_t i{}; i < size_ - 1; ++i)
            tmp[i] = fortunes_[i];
        tmp[size_-1] = state;
        delete[] fortunes_;
        fortunes_ = tmp;
    }
 
    void allFalse()
    {
        for(size_t i{}; i < size_; ++i)
            *fortunes_[i] = false;
    }
 
    ~StateMachine(){
        delete[] fortunes_;
    }
 
private:
    bool **fortunes_;
    size_t size_;
};
 
int main()
{
    auto sm = new StateMachine();
    bool x = true, y = true, z = true;
    sm->add(&x); sm->add(&y); sm->add(&z);
    std::cout << x << " " << y << " " << z << std::endl;
    sm->allFalse();
    std::cout << x << " " << y << " " << z << std::endl;
 
    return 0;   
}
0
23.08.2021, 18:21
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.08.2021, 18:21
Помогаю со студенческими работами здесь

Почему некорректно заполняется структура?
1-й вариант #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std;...

Получить определенные поля класса, работая с указателем на класс, как с указателем на массив
Мне бы хотелось узнать в чем ошибка моего кода Вот мои наработки которые не работают где я...

Функция с указателем не работает
Всем привет. Вот код. #include &lt;stdio.h&gt; char daytab = { {0, 31, 28, 31, 30, 31,...

Не работает условие с указателем
#include &lt;iostream&gt;; #include &lt;windows.h&gt;; using namespace std; int main() {...

В чем разница между указателем и указателем на указатель?
int x, *p, *q; x=10; p=&amp;x; q=p; cout&lt;&lt;*q; int x, *p, **q; x=10; p=&amp;x; q=&amp;p;

Не работает сортировка списка с указателем
Всем доброго времени суток! Не могу понять, почему не работает сортировка. Вот код:...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru