Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для CaH_CaHbl4
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137

Непонятный баг. Вставка в стек

12.11.2012, 22:17. Показов 684. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем суть. Дан Стек указателей, от него потомок - стек чисел.

Задача - распечатать в обратном порядке отдельно отрицательные и положительные числа.
Код немного недописан, основная суть понятна. но я пока из поля MemoForStack не могу все перетащить в обычный стек.
Как я собирался реализовывать: в поле InputReal вводится число, нажимается Ентер, число отправляется в MemoForStack/
Затем по нажатию кнопки Zadacha выполняется следующее:
перефигачиваем каждую строку из MemoForStack в integer и создаем указатель на этот integer, а затем запихиваем в некоторый стек указателей.
Затем, когда все строки из MemoForStack считаны, нужно дергать из стека указателей указатели по одному и смотреть, указывает ли он на положительное или отрицательное число, затем, соответственно, пихаем отрицательные в MemoMinus а положительные MemoPlus.



Модуль основной программы

Pascal
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
unit Unit_Main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit_Stack;
 
type
  TForm1 = class(TForm)
    InputReal: TEdit;
    InputString_TEXT: TLabel;
    addButton: TButton;
    MemoForStack: TMemo;
    InfoMemo: TLabel;
    Zadacha: TButton;
    CleanMemo: TButton;
    MemoPlus: TMemo;
    MemoMinus: TMemo;
    LMinus: TLabel;
    Lplus: TLabel;
    Label1: TLabel;
    procedure InputRealKeyPress(Sender: TObject; var Key: Char);
    procedure addButtonClick(Sender: TObject);
    procedure ZadachaClick(Sender: TObject);
    procedure CleanMemoClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.InputRealKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
  begin
    MemoForStack.Lines.add(InputReal.Text);
    InputReal.Clear;
  end;
end;
 
procedure TForm1.addButtonClick(Sender: TObject);
begin
  MemoForStack.Lines.add(InputReal.Text);
  InputReal.Clear;
end;
 
procedure TForm1.ZadachaClick(Sender: TObject);
var
  n,i:integer;
  S:Stack_int;
 
  r:integer;
  e:Pinteger;
  p:Telem;
 
 
begin
  MemoPlus.Visible:=True;
  MemoMinus.Visible:=True;
  Lplus.Visible:=True;
  LMinus.Visible:=True;
  n:=MemoForStack.Lines.Count;
  for i:=0 to n-1 do
    begin
      r:=StrToInt(MemoForStack.Lines[i]);
      New(p);
      p:=@r;
      s.push(p);
    end;
   while not s.isEmpty do
    begin
      i:=s.get;
      if i>0 then MemoPlus.Lines.Add (IntToStr(i));
      if i<0 then MemoMinus.Lines.Add (IntToStr(i));;
    end;
 
 
 
 
end;
 
procedure TForm1.CleanMemoClick(Sender: TObject);
begin
  MemoForStack.Clear;
end;
 
end.

Модуль работы со стеком

Pascal
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
unit Unit_Stack;
 
interface
 
type
  TElem = Pointer;
  TStack = ^Tlist;
  Tlist = record
          inf : TElem;
          next : TStack;
          end;
 
  Stack = class
        protected
          first : TStack;
        public
          constructor create ;
          function pop : TElem ;
          procedure push ( e:TElem ) ;
          function isEmpty:Boolean ;
          procedure clean ;
          destructor Destroy; override ;
          end;
 
  Stack_Int = class(Stack)
              public
                function Get :  Integer;
               end;
 
implementation
 
{методы Stack}
constructor stack.Create();
begin
  inherited create;
  first:=nil;
end;
 
function stack.isEmpty:Boolean ;
begin
  Result:=(first=nil);
end;
 
 
function stack.pop : TElem ;
var q:TElem;
begin
  if isEmpty then Exit
  else
    begin
      q:=first;
      result:=first^.inf;
      first:=first^.next;
      Dispose(q);
    end;
end;
 
procedure Stack.push ( e:TElem ) ;
var q:TStack;
begin
  New(q);
  q^.inf:=e;
  q^.next:=First;
  First:=q;
end;
 
procedure Stack.clean ;
var q:TStack;
begin
  while first<>nil do
    begin
      q:=first;
      first:=first^.next;
      Dispose(q);
    end;
end;
 
destructor Stack.Destroy;
begin
  clean;
  inherited Destroy;
end;
 
{методы для стека чисел}
 
function Stack_int.Get : Integer;
var g:Telem;
begin
  g:=pop;
  result:=PInteger(g)^;
end;
 
 
end.
То что происходит при нажатии на кнопку Выполнить прилагаю скриншотом.
Уважаемые гуру, помогите. Забивать не хочется (можно конечно сделать все через статический массив, но так неинтересно)
Заранее спасибо
Миниатюры
Непонятный баг. Вставка в стек   Непонятный баг. Вставка в стек  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2012, 22:17
Ответы с готовыми решениями:

Непонятный баг
Пишу программу на Си++ с использованием Qt и FMOD. Вот место, где глючит (тут только куски кода, не весь): void...

Непонятный баг в ListView
В общем, суть такова: Имеется список контактов в ListView. Каждый пункт содержит аватарку, имя и телефон. Адаптер ListView: ...

Непонятный баг в правильном коде
Есть ирк-бот на c#, раньше все работало нормально, но теперь стало игнорироваться условие if ((CHANNEL != &quot;#shock-world&quot;) |...

5
 Аватар для CaH_CaHbl4
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
12.11.2012, 23:30  [ТС]
Прочитал то, что написал первый раз на эмоциях. Стало стыдно

Вот так я осмыслил условие задачи:

Задача - распечатать в обратном порядке отдельно отрицательные и положительные числа из предложенных пользователем.

пока из поля MemoForStack не могу все перетащить в обычный стек.
Как я собирался реализовывать: в поле InputReal вводится число, нажимается Ентер, число отправляется в MemoForStack.
Затем по нажатию кнопки Zadacha выполняется следующее:
каждую строку из MemoForStack переделываем в integer с помощью StrToInt и создаем указатель на это число, а затем вставляем в некоторый стек указателей.
Затем, когда все строки из MemoForStack считаны, нужно взять из стека указателей по одному указателю и смотреть, указывает ли он на положительное или отрицательное число, затем, соответственно, записывать отрицательные в MemoMinus, а положительные MemoPlus.

Добавлено через 1 час 5 минут
проблема решилась не полностью, но пропали ошибки такие грубые.
s:=Stack_Int.create; исправил ситуацию...
0
angstrom
12.11.2012, 23:36
Цитата Сообщение от CaH_CaHbl4 Посмотреть сообщение
проблема решилась не полностью, но пропали ошибки такие грубые.
s:=Stack_Int.create; исправил ситуацию...
А кто "родителя" создавать будет?
 Аватар для CaH_CaHbl4
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
12.11.2012, 23:49  [ТС]
а нужно? если я создал потомка, то поля и методы родителя не подразумеваются?
0
angstrom
13.11.2012, 00:08
У тебя в Stack_Int имеется конструктор который вызывает inherited? Что-то не заметил.
 Аватар для CaH_CaHbl4
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
13.11.2012, 18:21  [ТС]
хм. сейчас исправлю.
видимо вызвался конструктор по умолчанию

Добавлено через 5 минут
тепреь другая проблема, программа выводит в поле мемо (для минусовых или для плюсовых) только самое последнее число, которое было введено в стек. программа почему то не поднимает значиния из стека.
подозрительный участок
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
s:=Stack_int.create;
 
  for i:=0 to n-1 do
    begin
      r:=StrToInt(MemoForStack.Lines[i]);
      s.push(@r);
    end;
 
  while not s.isEmpty do
    begin
      r:=s.get;
      if r>0 then MemoPlus.Lines.Add (IntToStr(r));
      if r<0 then MemoMinus.Lines.Add (IntToStr(r));;
    end;
он на то и подозрительный, если изменить код на
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
 for i:=0 to n-1 do
    begin
      r:=StrToInt(MemoForStack.Lines[i]);
      s.push(@r);
    end;
  r:=404;
  while not s.isEmpty do
    begin
      r:=s.get;
      if r>0 then MemoPlus.Lines.Add (IntToStr(r));
      if r<0 then MemoMinus.Lines.Add (IntToStr(r));;
    end;
то в мемоплюс попадут числа 404. причем столько раз, сколько чисел было введено в мемо.
т.е. получается стек из чего то состоит, но не получается обратиться к значению этого чего то.
видимо указатели как то коряво работают =(

Добавлено через 17 часов 54 минуты
в общем баг был в куске кода, когда из поля MemoForStack перегонял в стек поинтеров.
правильный кусочек кода
Pascal
1
2
3
4
5
6
7
8
for i:=0 to n-1 do
    begin
      r:=StrToInt(MemoForStack.Lines[i]);
      new(e); //e : Pinteger;
      e^:=r;
      p:=e; //p:pointer;
      s.push(p);
    end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2012, 18:21
Помогаю со студенческими работами здесь

непонятный баг textarea под ie
проверял под ie8 и ff 3 у кого есть другие браузеры под рукой, скиньте результаты в ff 3 все ок код такой: &lt;!DOCTYPE...

Непонятный баг со спрайтом в Unity 2D
Всем доброго времени суток. Разрабатываю двухмерную RTS с видом сверху на движке Unity, и вчера столкнулся с очень непонятным явлением. ...

Непонятный баг при запросе
Подскажите, это баг или что? Выводит 77тыс, а показывает 70тыс

Непонятный баг при получении сообщения
Отправка сообщения.. package send; import java.io.IOException; import java.net.DatagramPacket; import...

Непонятный баг в приложении ASP.Net
Здравствуйте друзья. Это очень странный баг, выскакивает наверно из 100 попыток 1 раз. Есть ASP.Net приложение работающее с базой...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru