![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
punkska |
![]() ![]()
Сообщение
#1
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
вот наступила оень пора закрывать сессию!=)
вот смотрю я на свою прогу и не могу понять зачем я в ней счётчик сделал? без него вроде не работает .. а что он делает я не поёму (забыл за лето) может опытный глаз профи увидит недочёты program laba_4_a; -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
punkska |
![]()
Сообщение
#2
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
ой блин осенило!!! он нужен чтоб нельзя была зайти в просмотр таблицы без еёё введения! сори за беспокойство!!
может есть недочёты в проге? -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Цитата(punkska @ 5.09.05 20:36) может есть недочёты в проге? У тебя очень нехорошо организавано выделение/освобождение памяти. С Mark/Release очень просто получить утечки памяти: представь себе, например, что пользователь вошел в программу, нажал "1", ввел данные, нажал "2", просмотрел их, и вышел (по нажатию на "0"). Результат? Утечка памяти. Выходов может быть 2: 1) Mark - в самом начале программы, Release - в самом конце, так ты гарантированно вернешься к первоначальному состоянию кучи 2) Отказаться от Mark/Release, и пользоваться только New/Dispose, это более сложный (может потребоваться реорганизация структуры программы), но и более надежный путь. Хотя по большому счету это вроде бы не имеет значения (все равно программа закрывается, и вся память освобождается), но лучше привыкать сразу писАть программы правильно, это сэкономит в дальнейшем очень много времени и нервов... |
punkska |
![]()
Сообщение
#4
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата 1) Mark - в самом начале программы, Release - в самом конце, так ты гарантированно вернешься к первоначальному состоянию кучи не получаеться!!! =((( -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Что именно "не получается"?
Я имел в виду вот так: Var |
punkska |
![]()
Сообщение
#6
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
я правильно понял твою мысль?
так? Код program laba_4_a; uses crt; type link=^komanda; komanda=record name:string[20]; shayb:integer; peredach:integer; stime:integer; nkom:string[10]; score:integer; next:link; end; fkom=file of komanda; var f:fkom; xxx,k,z,n,i:integer; s,newrec:link; p_start, p:pointer; beg:link; min_score:integer; begin mark(p_start); xxx:=0; repeat;clrscr; writeln(' vvv....'); gotoxy (1,10); writeln ('1. VvoD DaHHbIX..........'); writeln ('2. View DaHHbIX..........'); writeln ('3. SaVe DaHHbIE..........'); writeln ('4. Load DaHHbIE..........'); writeln ('5. Delete................'); writeln ('9. BEST PLAYERS..........'); writeln (' '); writeln ('0. E-X-I-T'); writeln ('Press 1-4:'); readln (z); case z of 1: begin xxx:=xxx+1; clrscr; writeln ('BBeDuTe Kol-vo igrokov:'); readln (n); mark(p); beg:=nil; for i:=1 to n do begin new(s); write ('N',i); write (' Name of player:'); readln (s^.name); write (' Kol-vo shayb:'); readln (s^.shayb); write (' Kol-vo peregach:'); readln (s^.peredach); write (' Shtraf.time:'); readln (s^.stime); s^.score:=s^.shayb+s^.peredach; s^.next:=beg; beg:=s; end; end; 2: begin clrscr; s:=beg; writeln('Name of player Kol-vo shayb Kol-vo peredach Shraf.Time'); repeat writeln(s^.name,' ',s^.shayb,' ',s^.peredach,' ',s^.stime); s:=s^.next; until s=nil; readln; end; 3: begin assign (f,'file.dat'); rewrite(f); s:=beg; repeat write (f,s^); s:=s^.next until s=nil; release(p); end; 4: begin if xxx>0 then release(p); assign (f,'file.dat'); reset(f); mark(p); s:=beg; for i:=1 to filesize (f) do begin new (s); read(f,s^); s^.next:=beg; beg:=s; end; close (f); {s:=beg;} end; 9: begin clrscr; writeln ('Enter min. Score'); readln (min_score); s:=beg; writeln('Name of player Kol-vo shayb Kol-vo peredach Shraf.Time'); repeat if (min_score<=s^.score) then writeln(s^.name,' ',s^.shayb,' ',s^.peredach,' ',s^.stime); s:=s^.next; until s=nil; readln; end; 5: begin writeln ('Enter Number...'); readln (n); if n=1 then begin newrec:=beg; beg:=beg^.next; end else begin s:=beg; for i:=1 to n-2 do s:=s^.next; newrec:=s^.next; s^.next:=newrec^.next; end; dispose(newrec); end; end; until z=0; release(p_start); end. у меня он постоянно ругаеться ... если выполнять пункты в след порядке 1, 2 , 3 ,5 или 1,2,3,4,5,2 помогите -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Да объясни ты наконец, что значит "ругается"? Что, не работает, или сбоит, или вообще не запускается? Я ж не телепат...
|
punkska |
![]()
Сообщение
#8
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
"ругается" - вылетает.
может что-то не так с выделением памити и её отчисткой? -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
На самом деле это и должно происходить, потому что при выполнении "Сохранить" ты делаешь Release(P), а потом, например при "Удалить", хочешь освободить уже несуществующий указатель. Это - ошибка работы с памятью. Если тебе достаточно "залатать дыры", и заставить быстро программу работать - просто закомментируй описание
p: Pointer;и все вызовы Mark(P)/Release(P) ... Все равно перед выходом Release(p_start) вернет всю память системе. Если же ты хочешь написать программу, ПРАВИЛЬНО работающую с памятью, то придется ее переписывать (в частность - добавление/удаление элементов в список). Лучше всего - с нуля, и при этом делать это не одним куском программы, а используя процедуры и функции. Структура программы станет более ясной, и будет гораздо легче организовать правильную работу со списком, а значит и с памятью в целом. P.S. Вообще Mark/Release - очень нехорошее решение. Вот, например в FPC эти процедуры вообще не включены... Делай выводы... |
punkska |
![]()
Сообщение
#10
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо! попрбую перелопатить...
блин... значит мне надо идти по этому пути 2) Отказаться от Mark/Release, и пользоваться только New/Dispose, это более сложный (может потребоваться реорганизация структуры программы), но и более надежный путь. попрую с нуля написать... а на форуме есть примеры прог похлжих на мою? если есть подскажите где! спс! -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
punkska |
![]()
Сообщение
#11
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
program list; так правильно использовать new??? хелп !! пдскажите советом! горит!!! ща всю прогу долопачу ! хоть начало правильно! нпа правильном пути??? -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
:no: Попробуй разобраться:
Прикрепленные файлы ![]() |
punkska |
![]()
Сообщение
#13
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
![]() ![]() спасибо :molitva: :flowers: я конечно в шоке... вся ночь уйдёт на понимание .... я наверно ещё свой набросок минут через 5ть покажу -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
punkska |
![]()
Сообщение
#14
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
program list; =))) что скажет суровый профи? -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Уже лучше, чем было, но все равно есть еще много над чем работать. Например, возьмем структуру Obj... Ты прямо в этой структуре хранишь указатель на следующий элемент (next), так? А зачем? Если ты запишешь эту структуру в файл, а потом прочитаешь, то прочитаешь ты элементы в другие адреса памяти, т.е. для сохранения работоспособности придется в поле next заново заносить правильную информацию, т.е. производятся лишние действия. Кроме того, размер файла тоже увеличивается (всего на 2 байта для каждого элемента списка, но все-таки, этого тоже можно избежать)...
Далее... При добавлении всех возможностей программы ты обязательно столкнешься с тем, что вот этот кусок будет дублироваться почти в каждой процедуре: P:=Beg;Этого можно избежать (посмотри, как я это сделал). Кстати, с таким кодом ты элементарно можешь получить Run-Time Error: например, если в момент вызова View список еще не сформирован, и следовательно Beg = nil, что приведет к попытке перехода по нулевому указателю, а это Ошибка !!! Вот так будет гораздо правильнее: P:=Beg;Теперь если Beg = nil, то ты вообще не войдешь в цикл, как и должно быть... ![]() |
punkska |
![]()
Сообщение
#16
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 139 Пол: Мужской Репутация: ![]() ![]() ![]() |
репит на вайл поменял=) спасибо! :molitva: :molitva: :molitva:
а вот с нехт не догнал... -------------------- ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА!!!!
|
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 23:09 |