Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
1

Вывод элементов списка в Memo не работает

15.10.2017, 17:03. Просмотров 418. Ответов 16
Метки нет (Все метки)

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
template<typename T>
void queue<T>::show_qF(TStrings *s)
{
        Node<T> *p;
        p = First;
        String sn;
        while(p != NULL)
        {
            sn = p -> val;
            s -> Add(sn);
            p = p -> Next;
        }
}
 
template<typename T>
void queue<T>::show_qL(TStrings *s)
{
        Node<T> *p;
        p = Last;
        String sn;
        while(p != NULL)
        {
            sn = p -> val;
            s -> Add(sn);
            p = p -> Prev;
        }
}
show_qL - это вывести элементы списка начиная с конца и он полностью работает, а show_qF - это вывести элементы списка начиная с начала списка. После того как я удаляю один элемент show_qF уже не работает а show_qL работает. В show_qF при аварийном выходе из программы указывает 10 строку с ошибкой. Не пойму в чём дело, уже 5 час сижу
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2017, 17:03
Ответы с готовыми решениями:

Не работает вывод в Memo
Не выводит список в Memo хотя, в первые несколько прогонов программа работала. Код не изменял и на...

Вывод данных из списка в memo
Информационная запись о книге, выданной на руки абоненту, представляет собой структуру следующего...

Вывод данных из списка TList в редактор Memo
Необходимо написать процедуру для вывода данных из списка TList в редактор Memo. Прошу, помогите...

Однонаправленный список. Вывод элементов, списка. Удаление списка.
Создать однонаправленный список натуральных чисел. Найти и вывести элементы списка, кратные 3....

Не работает вывод заполненного односвязного списка
Пробую решать задачки по Дейтелю, и вот застрял на этой: Написать программу, которая вставляет 25...

16
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
15.10.2017, 17:15  [ТС] 2
Вот скрин
0
Миниатюры
Вывод элементов списка в Memo не работает  
Avazart
Эксперт С++
7822 / 5720 / 563
Регистрация: 10.12.2010
Сообщений: 26,142
Записей в блоге: 17
15.10.2017, 17:24 3
Я бы не советовал "впечатовать" VCL - классы в свои велосипеды.

Делайте вывод используя интерфейс своего класса (pop(), empty()) или же напишите отдельные независимые ф-ции для вывода.

Тем более у вас шаблон, как вы собираетесь T приводить к String ?

Добавлено через 1 минуту
C++
1
2
Node<T> *p;
p = Last;
Совместить не судьба?
C++
1
Node<T> *p= Last;
1
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
15.10.2017, 17:42  [ТС] 4
Цитата Сообщение от Avazart Посмотреть сообщение
Совместить не судьба?
Я и так и так писал. После многих часов поиска ошибок уже что угодно подумаешь
Цитата Сообщение от Avazart Посмотреть сообщение
Делайте вывод используя интерфейс своего класса (pop(), empty()) или же напишите отдельные независимые ф-ции для вывода.
Независимые функции? Т е функции вне класса?
0
15.10.2017, 17:42
Avazart
Эксперт С++
7822 / 5720 / 563
Регистрация: 10.12.2010
Сообщений: 26,142
Записей в блоге: 17
15.10.2017, 18:02 5
Цитата Сообщение от no swear Посмотреть сообщение
Независимые функции? Т е функции вне класса?
Да.
Что общего между обобщенной очередью и конкретным типом списка строк?
Ничего, тогда что "оно" делает в классе?

Добавлено через 3 минуты
Вообще идея обходить очередь с конца сомнительна.
Ибо как правило классы очереди не имеют для этого средств например std::queue имеет только pop() c помощью которого можно обойти очередь с ее начала (при этом удалив все элементы)

Добавлено через 2 минуты
О́чередь — абстрактный тип данных с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, First In — First Out). Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется.
https://ru.wikipedia.org/wiki/%D0%9E...BD%D0%B8%D0%B5)

Добавлено через 3 минуты
Печать очереди, с перебором элементов не через интерфейс класса:
C++
1
2
3
4
5
while(!q.empty())
{
    auto value = q.front();
    q.pop();
}
По сути нарушение инкапсуляции и логики класса.
1
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
15.10.2017, 18:22  [ТС] 6
Цитата Сообщение от Avazart Посмотреть сообщение
Вообще идея обходить очередь с конца сомнительна.
Знаю но у меня задание такое, препод сказал сделай чтобы выводилась очередь задом наперёд и наоборот. Сам знаю что это не очередь из std::queue это ХЗ что
0
Avazart
Эксперт С++
7822 / 5720 / 563
Регистрация: 10.12.2010
Сообщений: 26,142
Записей в блоге: 17
15.10.2017, 18:42 7
Цитата Сообщение от no swear Посмотреть сообщение
Знаю но у меня задание такое, препод сказал сделай чтобы выводилась очередь задом наперёд и наоборот.
Ну так преподу два и на увольнение ... какого зарплату получает ?

Цитата Сообщение от no swear Посмотреть сообщение
Сам знаю что это не очередь из std::queue это ХЗ что
Это список вероятно.
1
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
15.10.2017, 21:27  [ТС] 8
А может использовать sstream для вывода вместо TStrings? Создать поток а потом когда захочется просто выводить его?

Добавлено через 2 часа 40 минут
Написал с одним указателем *Last без указателя *First результат всё - работает
0
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
15.10.2017, 21:30  [ТС] 9
А нет всё равно вылетает но уже в другом месте
0
Миниатюры
Вывод элементов списка в Memo не работает  
Avazart
Эксперт С++
7822 / 5720 / 563
Регистрация: 10.12.2010
Сообщений: 26,142
Записей в блоге: 17
15.10.2017, 22:45 10
Цитата Сообщение от no swear Посмотреть сообщение
А может использовать sstream для вывода вместо TStrings? Создать поток а потом когда захочется просто выводить его?
А разница ? Это все равно фигня, такое допустимо разве что в целях отладки.

Добавлено через 1 минуту
Цитата Сообщение от no swear Посмотреть сообщение
А нет всё равно вылетает но уже в другом месте
Нафига мне ваши скрины ?
Вы код и описание ошибки копируйте.
Среда же явно указывает место ошибки и говорит что не так.
0
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
16.10.2017, 14:23  [ТС] 11
Извините. Вот сам код целиком
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
template<typename T>
struct Node
{
        Node *Next;
        Node *Prev;
        T val;
};
 
template<typename T>
class queue
{
        Node<T> *Last;
        Node<T> *First;
        int size;
 
public:
        queue();
        ~queue();
        void push(T);
        void pop();
        void show_qF(TStrings*);
        void show_qL(TStrings*);
        bool empty();
        int show_size();
};
 
template<typename T>
queue<T>::queue()
{
        Last = First = NULL;
        size = 0;
}
 
template<typename T>
queue<T>::~queue()
{
        Node<T> *tmp;
        while(Last != NULL)
        {
            tmp = Last -> Prev;
            delete Last;
            Last = tmp;
        }
}
 
template<typename T>
void queue<T>::push(T n)
{
        Node<T> *p = new Node<T>;
        p -> val = n;
        p -> Next = First;
        p -> Prev = NULL;
        size++;
 
        if(First == NULL)
        {
            First = Last = p;
            Last -> Next = NULL;
            First -> Prev = NULL;
            return;
        }
 
        First -> Prev = p;
        First = p;
}
 
template<typename T>
void queue<T>::pop()
{
        if(Last == NULL) return;
 
        Node<T> *tmp;
        tmp = Last;
        if(Last -> Prev != NULL)
        {
            Last = Last -> Prev;
        }
        else
        {
            Last = First = NULL;
        }
 
        delete tmp;
        size--;
}
 
template<typename T>
int queue<T>::show_size()
{
        return size;
}
 
template<typename T>
void queue<T>::show_qF(TStrings *s)
{
        Node<T> *p;
        p = First;
        while(p != NULL)
        {
            s -> Add(p -> val);
            p = p -> Next;
        }
}
 
template<typename T>
void queue<T>::show_qL(TStrings *s)
{
        Node<T> *p;
        p = Last;
        while(p != NULL)
        {
            s -> Add(p -> val);
            p = p -> Prev;
        }
}
 
template<typename T>
bool queue<T>::empty()
{
        return First == NULL;
}
 
queue<String> obj;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
        try
        {
            obj.push(Edit1 -> Text);
            Memo1 -> Clear();
            obj.show_qL(Memo1 -> Lines);
            Edit1 -> Clear();
        }
        catch(...)
        {
            ShowMessage("Âû ââåëè Г*ГҐГЇГ°Г*âèëüГ*îå Г§Г*Г*Г·ГҐГ*ГЁГҐ!");
        }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
        Memo1 -> Clear();
        obj.show_qL(Memo1 -> Lines);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
        obj.pop();
        Memo1 -> Clear();
        obj.show_qL(Memo1 -> Lines);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
        Memo1 -> Clear();
        obj.show_qF(Memo1 -> Lines);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton5Click(TObject *Sender)
{
        Memo1 -> Clear();
}
//---------------------------------------------------------------------------
А сообщение с ошибкой вот такое, строка с ошибкой это 177. Не понимаю что там такого
0
Миниатюры
Вывод элементов списка в Memo не работает  
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
16.10.2017, 14:33  [ТС] 12
С конца выводит все элементы а вот с начала никак не получается. Причем после ввода он выводит, а после удаления одного элемента выходит такая ошибка, именно после того как я удалил элемент. Я даже написал функции для проверки указателей First и Last стоят ли они на своих местах и ответ да, после множественных добавок и удаления из списка элементов указатели остаются на своих местах.
0
Avazart
Эксперт С++
7822 / 5720 / 563
Регистрация: 10.12.2010
Сообщений: 26,142
Записей в блоге: 17
17.10.2017, 00:16 13
Ошибка говорит от нарушении доступа к памяти.
Т.е. где то с указателями проблема.
Можно отлаживать в пошаговом режиме.

Добавлено через 14 минут
Странно код

C++
1
2
3
4
5
6
7
8
         q.push("1");
         q.push("2");
         q.push("3");
 
         q.pop();
 
         Memo1->Clear();
         q.show_qF(Memo1->Lines);
У меня не вызывает ошибок.

И сразу такой вопрос

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename T>
void queue<T>::pop()
{
    if(Last==NULL)
        return;
 
    Node<T> *tmp= Last;
    if(Last->Prev!= NULL)
    {
        Last = Last->Prev;
    }
    else
    {
        Last= First= NULL;
    }
 
    delete tmp;
    size--;
}
почему pop() у вас удаляет последний элемент, а не первый ?

Как в http://ru.cppreference.com/w/cpp/container/queue

Добавлено через 6 минут
С другими методами походу та же беда.
1
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
17.10.2017, 17:03  [ТС] 14
Цитата Сообщение от Avazart Посмотреть сообщение
почему pop() у вас удаляет последний элемент, а не первый ?
Ну потому что опять таки по "приказу" препода надо чтобы push добавляла в голову а pop удаляла хвост.

Щас начинаю писать код двойной очереди, т е добавка может происходит как и в голове так и в хвосте и pop так же, удаления элемента из хвоста или из головы

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
У меня не вызывает ошибок.
А у меня ошибка! Вот как так???
0
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
17.10.2017, 17:04  [ТС] 15
Интересненько. Builder надо переустанавливать?
0
Миниатюры
Вывод элементов списка в Memo не работает   Вывод элементов списка в Memo не работает  
Avazart
Эксперт С++
7822 / 5720 / 563
Регистрация: 10.12.2010
Сообщений: 26,142
Записей в блоге: 17
17.10.2017, 17:50 16
Цитата Сообщение от no swear Посмотреть сообщение
Ну потому что опять таки по "приказу" препода надо чтобы push добавляла в голову а pop удаляла хвост.
Тогда надо дать преподу в "голову" и послать в "хвост".

Добавлено через 2 минуты
Цитата Сообщение от no swear Посмотреть сообщение
Щас начинаю писать код двойной очереди, т е добавка может происходит как и в голове так и в хвосте и pop так же, удаления элемента из хвоста или из головы
Это не очередь это двусвязный список называется. Т.е см. std::list

Добавлено через 4 минуты
Цитата Сообщение от no swear Посмотреть сообщение
А у меня ошибка! Вот как так???
нет все же ошибка есть https://ideone.com/eDUZHJ

Судя по всему ошибка в void queue<T>::pop() ибо без этой операции работает.
Но так как все перепутано, тяжело понять что не так.
2
no swear
178 / 154 / 80
Регистрация: 01.07.2016
Сообщений: 863
Завершенные тесты: 1
17.10.2017, 18:56  [ТС] 17
Щас pop заново напишу

Добавлено через 44 минуты
Ой нашел ошибку! Ну ё ма ё как же так!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename T>
void queue<T>::pop()
{
        if(Last == NULL) return;
 
        Node<T> *tmp = Last;
        if(Last -> Prev != NULL)
        {
            Last = Last -> Prev;
            Last -> Next = NULL;
        }
        else
        {
            Last = First = NULL;
        }
 
        delete tmp;
        size--;
}
Надо было написать Last -> Next = NULL потому что в в функции show я иду по списку пока он не NULL
0
17.10.2017, 18:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2017, 18:56

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

Вывод элементов списка
Доброго времени суток. Не могу понять, что делаю не так. Есть список, который я заполняю случайными...

Обход элементов списка и их вывод
Всем доброго времени суток, уважаемые форумчане! Разбираюсь с Python'ом, даётся не так просто, как...


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

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

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