IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Сортировка по возрастанию, Двумерный список
habi
сообщение 27.05.2008 23:19
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +



Вот код, работает, сортирует окна, по увеличению гипотенузы(расстояния от нижнего правого угла до верхнего левого экрана)
Но при повторном вызове Invalid floating point operation

процедура vivod лишь прорисовывает окна в одинарной рамке, а если конец списка, то в двойной.
Помогите исправить ошибку.

Рад буду услышать совет по оптимизации или другой алгоритм.

Сообщение отредактировано: habi - 28.05.2008 17:37
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.05.2008 23:24
Сообщение #2


Гость






Цитата
Помогите исправить ошибку.
Угу... Как ты думаешь, очень интересно кому-то придумывать, что там у тебя за структура, что за список, какие поля и каких типов присутствуют в нем, если даже автор не потрудился создать простейшую законченную программу, которая показывает эффект? (тем более, что работа ведется с ГЛОБАЛЬНЫМИ переменными, которые могут меняться совершенно непредсказуемо между вызовами процедуры)

Добавлено через 1 мин.
P.S. Кстати, движок этого форума позволяет не только вставлять код внутрь поста, но и добавлять файлы как аттач...

Сообщение отредактировано: volvo - 27.05.2008 23:27
 К началу страницы 
+ Ответить 
habi
сообщение 27.05.2008 23:29
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Программа работает, и сортирует, но при повторном вызове происходит нечто странное =) Я думаю что всё рисуется вновь в последнем окн

Тыкаем ентер, потом ф7

Сообщение отредактировано: habi - 27.05.2008 23:54
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2008 0:18
Сообщение #4


Гость






1. В процедуре сортировки у тебя идет попытка обращения к неинициализированному указателю, ибо память под CCC^ ты не выделяешь нигде... Как оно у тебя работало, и КУДА записывало информацию - никому не ведомо yes2.gif
         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;

+ ниже (после обмена) не забудь удалить, иначе получишь утечку...

2. Внутри For-цикла запрещено менять параметр (если уж так надо - пользуйся While-ом), а ты меняешь, там же, в процедуре Sortirovka:
              tek:=tek^.next;
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;
- результат может быть непредсказуем... Я для теста поменял на While...

3. Если б ты сразу отделил информационное поле от next/prev, т.е., делал как-нибудь так:
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;
tmp^.info := tek^.info;
tek^.info := CCC^.info;
...
, да и вообще можно было бы обойтись без выделения памяти под CCC, достаточно было бы описать статически структуру типа InfoType. Так что выбирай, или оставляешь все, как есть, или делаешь, как лучше smile.gif

Сообщение отредактировано: volvo - 28.05.2008 8:01
 К началу страницы 
+ Ответить 
habi
сообщение 28.05.2008 18:33
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Вот пришёл с универа, проделал, то что ты написал =)
Но список first некорректно заполняется, незнаю почему.
Ну и ряд других функция перестали корректно работать, может я неправильно обращаюсь?

tek^.info.x1....

Также вопрос, загонять ли в констаты часто повторяемые фразы? "сохранить файл? д\н"
=)
Ну и ещё что-то изменять надо?

Сообщение отредактировано: habi - 28.05.2008 18:38
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2008 19:12
Сообщение #6


Гость






У тебя практически одно и то же делается дважды. Первый раз - со Словами, второй - с Окнами. И там и там создается список (только в первом случае он односвязный, а во втором - двухсвязный, но что тебе мешает сделать и в первом случае поле Prev, но не использовать его?)

Классическая задача на многократное использование кода (а не так как у тебя сейчас - отдельно - код для WordList, отдельно - для списка Wind). Поскольку задача решается тобой в процедурном стиле (а не ООП) - то могу предложить использование директивы {$i filename} для написания более компактной программы... Ее будет гораздо проще поддерживать... В том, что есть у тебя сейчас разбираться очень сложно...

Если интересно - покажу, как это делается...
 К началу страницы 
+ Ответить 
habi
сообщение 28.05.2008 19:17
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Так ты не ответил на мой вопрос, я правильно обращаюсь к переменным?
Почему first теряется?
Если интересно, могу рассказать, что делает каждая процедура.

Сообщение отредактировано: habi - 28.05.2008 19:17
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2008 19:53
Сообщение #8


Гость






Цитата
я правильно обращаюсь к переменным?
Мне неинтересно разбираться в дебрях кода. Вчера ты привел программу, которая была значительно меньше, я ее посмотрел. Сегодня - программа огромна и нечитабельна... Хочешь - разбирайся в таком коде, тут я тебе не помощник...
 К началу страницы 
+ Ответить 
habi
сообщение 28.05.2008 19:56
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


вопрос по другому:
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

Я создал такой список.
Как правильно обращаться к ячейкам х1,у1.....?
Tek^.Info.X1...?

А насчёт obj готов почитать. Может и переделаю.

Сообщение отредактировано: habi - 28.05.2008 19:59
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
habi
сообщение 28.05.2008 21:00
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Помогите разобраться в выводе окон.
Теряется видимо где-то указатель.Хотя ватч везде показывает участок памяти.
В режиме сразу_все_окна, переход осуществляется между первым и предпоследним, а режиме последовательно, всё корректно.


Прикрепленные файлы
Прикрепленный файл  EX.PAS ( 9.25 килобайт ) Кол-во скачиваний: 182
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2008 22:26
Сообщение #11


Гость






А теперь сравни свой код вот с этим:
Прикрепленный файл  habi_02.pas ( 5.48 килобайт ) Кол-во скачиваний: 367


Что легче читать? А сопровождать? rolleyes.gif
 К началу страницы 
+ Ответить 
habi
сообщение 28.05.2008 22:41
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


М =) здорово =) Вот ещё бы всё остальное переделать. за ночь =)
Выложи плз свой TURBO.TPU а то у меня дизион бай 0, ошибка.
А с помощью тпумовер не патчит.

upd сортировка работает =)

Сообщение отредактировано: habi - 28.05.2008 23:12
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2008 23:54
Сообщение #13


Гость






Цитата
Выложи плз свой TURBO.TPU
Ты про Turbo.TPL?


Прикрепленные файлы
Прикрепленный файл  turbo_tpl.rar ( 27 килобайт ) Кол-во скачиваний: 129
 К началу страницы 
+ Ответить 
habi
сообщение 29.05.2008 0:05
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Спасибо, не смог разобраться , как обращаться и записывать в инфотип

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;

Как понятно из кода, нужно окна в нижний левый угол вогнать.

[upd]сдам курсовую и переделаю старый вариант =) потомучто за 1 ночь не верну все нужные функции.алгоритм обращения к инфотипу не понял

Сообщение отредактировано: habi - 29.05.2008 0:13
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.05.2008 0:19
Сообщение #15


Гость






Чуть-чуть не так:

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;
 К началу страницы 
+ Ответить 
habi
сообщение 29.05.2008 0:25
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Хм окна остаются на тех же местах.
Заново всё выводится со старыми координатами.

Сообщение отредактировано: habi - 29.05.2008 0:26
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.05.2008 0:51
Сообщение #17


Гость






С чего бы?

  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;

сразу после SortList, и никаких старых координат, все сброшено в левый нижний угол... Сделаешь X1 := 1; Y1 := 1 - все будет в левом верхнем...
 К началу страницы 
+ Ответить 
habi
сообщение 29.05.2008 1:07
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


В том коде не была использована процедура show.
p.s. в icq не сидишЬ? =) если нарушил правила форума, то извиняюсь

Сообщение отредактировано: habi - 29.05.2008 1:10
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 25.06.2024 20:58
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"