Вот код, работает, сортирует окна, по увеличению гипотенузы(расстояния от нижнего правого угла до верхнего левого экрана)
Но при повторном вызове Invalid floating point operation
процедура vivod лишь прорисовывает окна в одинарной рамке, а если конец списка, то в двойной.
Помогите исправить ошибку.
Рад буду услышать совет по оптимизации или другой алгоритм.
Программа работает, и сортирует, но при повторном вызове происходит нечто странное =) Я думаю что всё рисуется вновь в последнем окн
Тыкаем ентер, потом ф7
1. В процедуре сортировки у тебя идет попытка обращения к неинициализированному указателю, ибо память под CCC^ ты не выделяешь нигде... Как оно у тебя работало, и КУДА записывало информацию - никому не ведомо
k1:=sqr(round(tek^.x2/2)+tek^.x1);+ ниже (после обмена) не забудь удалить, иначе получишь утечку...
k2:=sqr(round(tek^.y2/2)+tek^.y1);
k1t:=sqr(round(tmp^.x2/2)+tmp^.x1);
k2t:=sqr(round(tmp^.y2/2)+tmp^.y1);
if sqrt(abs(k1+k2)) > sqrt(abs(k1t+k2t)) then
begin
new(ccc); { <--- Добавить }
ccc^.x1:=tmp^.x1; ccc^.x2:=tmp^.x2; ccc^.y2:=tmp^.y2; ccc^.y1:=tmp^.y1; ccc^.fonec:=tmp^.fonec;
tek:=tek^.next;- результат может быть непредсказуем... Я для теста поменял на While...
tmp:=tmp^.next;
k1t:=0;k2t:=0;k1:=0;k2:=0;i:=i+1; { <--- раз }
end
else
begin
k1t:=0;k2t:=0;k1:=0;k2:=0;i:=i+1; { <--- два }
tek:=tek^.next;
tmp:=tmp^.next;
type, то вместо поэлементного копирования полей мог бы записать:
InfoType = record
x1,x2,y1,y2,j,textc,fonec,k:word;
text:string;
end;
Wind = ^win;
win = record
info: InfoType;
Next,pred: Wind;
end;
CCC^.info := tmp^.info;, да и вообще можно было бы обойтись без выделения памяти под CCC, достаточно было бы описать статически структуру типа InfoType. Так что выбирай, или оставляешь все, как есть, или делаешь, как лучше
tmp^.info := tek^.info;
tek^.info := CCC^.info;
...
Вот пришёл с универа, проделал, то что ты написал =)
Но список first некорректно заполняется, незнаю почему.
Ну и ряд других функция перестали корректно работать, может я неправильно обращаюсь?
tek^.info.x1....
Также вопрос, загонять ли в констаты часто повторяемые фразы? "сохранить файл? д\н"
=)
Ну и ещё что-то изменять надо?
У тебя практически одно и то же делается дважды. Первый раз - со Словами, второй - с Окнами. И там и там создается список (только в первом случае он односвязный, а во втором - двухсвязный, но что тебе мешает сделать и в первом случае поле Prev, но не использовать его?)
Классическая задача на многократное использование кода (а не так как у тебя сейчас - отдельно - код для WordList, отдельно - для списка Wind). Поскольку задача решается тобой в процедурном стиле (а не ООП) - то могу предложить использование директивы {$i filename} для написания более компактной программы... Ее будет гораздо проще поддерживать... В том, что есть у тебя сейчас разбираться очень сложно...
Если интересно - покажу, как это делается...
Так ты не ответил на мой вопрос, я правильно обращаюсь к переменным?
Почему first теряется?
Если интересно, могу рассказать, что делает каждая процедура.
вопрос по другому:
type
InfoType = record
x1,x2,y1,y2,j,textc,fonec,k:word;
text:string;
end;
Wind = ^win;
win = record
info: InfoType;
Next,pred: Wind;
end
Помогите разобраться в выводе окон.
Теряется видимо где-то указатель.Хотя ватч везде показывает участок памяти.
В режиме сразу_все_окна, переход осуществляется между первым и предпоследним, а режиме последовательно, всё корректно.
Прикрепленные файлы
EX.PAS ( 9.25 килобайт )
Кол-во скачиваний: 258
А теперь сравни свой код вот с этим:
habi_02.pas ( 5.48 килобайт )
Кол-во скачиваний: 479
Что легче читать? А сопровождать?
М =) здорово =) Вот ещё бы всё остальное переделать. за ночь =)
Выложи плз свой TURBO.TPU а то у меня дизион бай 0, ошибка.
А с помощью тпумовер не патчит.
upd сортировка работает =)
Спасибо, не смог разобраться , как обращаться и записывать в инфотип
procedure MoveToLeft;
var p:wind;
r:infotype;
begin
p:=first;
r:=p^.info;
while p<>nil do
begin
with R do begin
X1 := 1;
X2 := X2;
Y2 := Y2;
Y1 := 24 - Y2;
end;
tek:=tek^.next;
end;
if klav<>#0 then vivod;
end;
Чуть-чуть не так:
procedure MoveToLeft;
var
p:wind;
r:infotype;
begin
p:=first;
while p<>nil do begin
R := p^.info; { R получаем уже после изменения P }
with R do begin
X1 := 1;
Y1 := 24 - Y2;
{ X2 := X2;
Y2 := Y2; } { <--- Это у тебя в коде не меняется, зачем его трогать? }
end;
p := p^.next;
end;
if klav<>#0 then vivod;
end;
Хм окна остаются на тех же местах.
Заново всё выводится со старыми координатами.
С чего бы?
p := first;
while p <> nil do begin
with p^.info do begin
Y1 := 24 - Y2;
X1 := 1;
end;
Show(p^.info, p^.next = nil);
p := p^.next;
end;
В том коде не была использована процедура show.
p.s. в icq не сидишЬ? =) если нарушил правила форума, то извиняюсь