Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.12.2009, 18:27
ХодячийБаг ХодячийБаг вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 8
Репутация: 10
Восклицание Сортировка в динамической памяти

Помогите найти ошибку. Написал на паскале небольшой код.

Смысл в том чтобы сортировать двунаправленное кольцо, никак не получается. Вот мой код:

Код:
type
dat = integer;
colob=^obd;
obd = record
         ri,le: colob; // ri - укзатель на правый объект, le - на левый соответственно
         d: dat; // данное
         end;

...
var
b,e,q,ql: colob;
x: dat;
...
b:=nil;
e:=nil;
checkeof := true;
while not eof do
begin
 read(x);
 q:=b;
 while (q<>b) or (x<q^.d) do
 begin
   if x<=q^.d then
   begin
    ql:=q;
    q:=q^.ri;
   end;
 inkol(b,e,ql,x); // inkol - процедура добавления значения x слева от адреса ql. b,e - характеристика кольца (начало, конец), x данное, которое вводим.
 end;
end;

вероятно while циклится.. Ошибка "Runtime Error" вылезает после исполнения.

Помогите пожалуйста, заранее спасибо. (Язык Pascal)

p.s. сортировку производить при вводе входного потока

Последний раз редактировалось ХодячийБаг, 12.12.2009 в 18:30.
Ответить с цитированием
  #2  
Старый 12.12.2009, 21:26
ХодячийБаг ХодячийБаг вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 8
Репутация: 10
По умолчанию

ну что ребят, не подскажете как быть?
Ответить с цитированием
  #3  
Старый 12.12.2009, 23:24
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Как у вас реализована inkol
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 13.12.2009, 00:07
ХодячийБаг ХодячийБаг вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 8
Репутация: 10
Восклицание

Код:
procedure inkol(var B,E: colob; al:colob; nd: dat);
var
ar,q: colob;

begin
 new(q);
 q^.d :=  nd;
 if al=E then
 E := q;
 if al = nil then
 begin
  ar := B;
  al := E;
  B := q;
 end
 else
  ar := al^.ri;
 al^.ri :=  q;
 ar^.le :=  q;
 q^.ri  := ar;
 q^.le  := al;
 end;

Работает ввод отично, проверял. проблема в самой сортировке. Либо поставил не так условие, либо не так устроил цикл.

тоесть код

Код:
while not eof do
begin
 read(x);
 inkol(b,e,nil,x);
end;
работает безупречно...

внутри этой конструкции необходимо сделать сортировку. Программа циклится во внутреннем while и вылетает. В чем ошибка не понимаю, вот и прошу помощи. Заранее спасибо!

Последний раз редактировалось ХодячийБаг, 13.12.2009 в 00:13.
Ответить с цитированием
  #5  
Старый 13.12.2009, 00:31
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Что-то я раньше как-то не сталкивался с Eof без указания в явном виде дескриптора на файла - ну допустим. Но вот Read без указания на дескриптор файла... что-то я тут неуверен, что это правильно работает. Указатель в файле вроде не движется и получается бесконечный цикл.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 13.12.2009, 01:11
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Во первых, не понятно условие: while (q<>b), когда перед этим стоит q:=b;, то есть, получается ты даже не попадаешь в этот цикл.

Дальше, ты хочешь пробежать весь круг, при том b = начальный элемент, но по коду выше мы видим что он равен нулю b:=nil; притом в процедуру incol (где у тебя изменяет значение b) мы не попадаем, опять же из-за while (q<>b).

И Cтрадалецъ скорее всего прав, while not eof do - скорее всего равносильно фразе while true do, то есть если работа с файлом, то вид должен был быть while not eof(F) do, если у тебя только eof функция не переопределена., ну и конечно же, read(x) то же сомневает, так как read(x) ожидает ввод данных с клавиатуры, а если это должно читаться из файла, то должна быть передана ссылка на файл, вида: Read(F, x) ; , где F - ссылка на открытый файл, а если это ввод данных (опять противоречие while not eof do - вначале у нас нет элементов, значит not eof = false, тоже не попадаем в цикл), то лучше было бы сначала в цикле собрать эти данные, а потом их отсортировать, а не совмещать эти процессы.

Ну и наконец ошибка скорее всего возвращается словами ... or (x<q^.d) ..., так как при входе в цикл q = b; а b как мы помним ранее = nil, соответственно q^.d = Error)

Советую переписать весь алгоритм.

Последний раз редактировалось Asinkrit, 13.12.2009 в 01:27.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:10.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025