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

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

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

6 страниц V « < 2 3 4 5 6 >  
Closed Topic Открыть новую тему 
> Задачи на знание ООП, (только для Турбо-Паскаля 7.0)
сообщение
Сообщение #61


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Цитата
1 удалять с кучи прежний объект


constructor TArr.init;{добавим некую полезную нагрузку в конструктор}
var i:byte;
begin
for i:=1 to maxSize do {обnilим все элементы}
arr[i]:=nil;
end;



procedure TArr.set_index(i: integer; const p: PT);
begin
if i<= maxSize then
begin
if arr[i]=nil then
arr[i]:=p
else
begin
dispose(arr[i],done);
arr[i]:=p;
end;
end;
end;


Прикрепленный файл  HHHH1.PAS ( 1.93 килобайт ) Кол-во скачиваний: 354


Цитата
2 не допускать этого


function TArr.set_index(i: integer; const p: PT):boolean; {сделаем функцию вместо процедуры
true - все нормально
false - наоборот}
begin
if i<= maxSize then
if arr[i]=nil then
begin
arr[i]:=p;
set_index:=true;
end
else
set_index:=false;
end;


Прикрепленный файл  HHHH2.PAS ( 1.96 килобайт ) Кол-во скачиваний: 353


Цитата
3 самому назначать индексы


type
TArr = object
arr: array[1 .. maxSize] of PT;
num:byte;{сколько объектов уже было добавлено}
procedure set_index(const p: PT);{i нам больше не понадобится}
end;




constructor TArr.init;
var i:byte;
begin
num:=0;{!!!!!!!!!!!!!!!!!}
for i:=1 to maxSize do
arr[i]:=nil;
end;



procedure TArr.set_index(const p: PT);
begin
if num< maxSize then
begin
inc(num);
arr[num]:=p;
end;
end;


Прикрепленный файл  HHHH3.PAS ( 1.81 килобайт ) Кол-во скачиваний: 365


PS Только что заметил: по времени вышло почти 10 часов, как и предсказывал, хотя я и не подстраивался smile.gif

Сообщение отредактировано: Bokul -


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #62


Гость






Первый вариант не убирает утечки: добавление тех же самых 3-х строк, что и раньше:
Прикрепленное изображение

Второй и третий не тестировал ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #63


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Я не понимаю почему там не возникает ошибки.
  
obj_int := new(PTint,create);
obj_int^.value := 3;
any_arr.set_index(1, obj_int);


Сейчас obj_int и первый элемент массива any_arr.arr указывают на один и тот же объект в кучи.


any_arr.set_index(1, obj_float);


Теперь я хочу поставить первым элементом указатель на другой объект.
		
begin
dispose(arr[i],done);
arr[i]:=p;
end;


Так как первый элемент не равнялся nil, то выполнение any_arr.set_index приведет к выполнению этого куска кода, в котором мы освобождаем память, выделенную под Tint, но один указатель, связанный с этим участком памяти, у нас остался - obj_int.
Почему не возникает ошибки сдесь:
dispose(obj_int,done);

? Эта ж память уже не с чем не связанна...


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #64


Гость






Цитата
Я не понимаю почему там не возникает ошибки.
Это ты как определил? Я бы выразился по-другому: Turbo Pascal не показывает тебе, что там есть ошибка... Попробуй тот же код (закомментировав MemAvail) прогнать в FPC smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #65


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Error 210
Цитата

With range-checking on, you made a call to an
object's virtual method, before the object
had been initialized via a constructor call.

Почему Turbo Pascal не видит эту ошибку? Что он делает? Еще раз освобождает эту память? А если она уже была зарезервированна для другого объекта или переменной?
А вот в таком случае (см. атач) получаем RunTime Error 204. Какая разница? Почему в данном варианте он видит, а там - нет?


Прикрепленные файлы
Прикрепленный файл  1.PAS ( 192 байт ) Кол-во скачиваний: 188


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #66


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Извиняюсь, не увидел вопроса
Цитата
Это ты как определил?

После столько часов медитации над кодом все видно yes2.gif . Fpc не запускал.


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #67


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Надо сделать деструктор объекта T виртуальным, так как для правильной очистки полиморфических объектов с памяти надо знать их размер, а виртуальный деструктор это обеспечит. Естественно у наследников надо тоже сделать деструкторы виртуальными. Правильно?????


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #68


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Цитата
Надо сделать деструктор объекта T виртуальным, так как для правильной очистки полиморфических объектов с памяти надо знать их размер, а виртуальный деструктор это обеспечит. Естественно у наследников надо тоже сделать деструкторы виртуальными. Правильно?????

Или уже никто не заглядывает в эту тему?

Сообщение отредактировано: Bokul -


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #69


Гость






Ну, так ты программу-то приаттачь со всеми изменениями, тогда и посмотрим, остаются утечки или нет smile.gif Что же толку, если я сделаю те изменения, которые нужны?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #70


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Вот:


Прикрепленные файлы
Прикрепленный файл  HHHH2.PAS ( 2.39 килобайт ) Кол-во скачиваний: 164


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #71


Гость






В принципе, почти правильно... Но нужно еще кое-что добавить, потому что программа еще пропускает, например... Ну, вот результат:


Эскизы прикрепленных изображений
Прикрепленное изображение
 К началу страницы 
+ Ответить 
сообщение
Сообщение #72


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


А утечек нету?

А с 210 я воюю уже давно, даже догадываюсь что ты поменял yes2.gif
any_arr.count_each(new(PTfloat,create));

вместо new(PTfloat,create) поставил что-то наподобие obj_float... Так?
Бороться не знаю как... Подскажешь?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #73


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Продолжаю ставить вопросы на которые никто не отвечает dry.gif
Можно ли как-то программно отличить any_arr.count_each(new(PTfloat,create) ) от any_arr.count_each(obj_float )?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #74


Гость






Отвечаю... Естественно, вопросом на вопрос: "А зачем?"

Смысл этого привести сможешь? Что тебе даст, если ты это определишь? Все равно, у тебя (почти всегда) в count_each будет передан указатель на объект. Вот и работай с ним... Какая тебе (а тем более, твоей функции count_each) разница, сконструирована инициализация объекта прямо на месте, или передан указатель, уже использованный в программе? Это что-то меняет? Значит, неправильно спроектирована программа... Исправляй так, чтобы работало независимо от способа передачи параметров... blum.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #75


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Цитата
Значит, неправильно спроектирована программа...

Полностью согласен. smile.gif
Цитата
Какая тебе (а тем более, твоей функции count_each) разница, сконструирована инициализация объекта прямо на месте, или передан указатель, уже использованный в программе?

А как освободить с памяти объект на который нет указателя? Вот тебе и разница... smile.gif

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


Прикрепленные файлы
Прикрепленный файл  HHHH1.PAS ( 2.21 килобайт ) Кол-во скачиваний: 194


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #76


Гость






Цитата
А как освободить с памяти объект на который нет указателя?
А вот с этого места, пожалуйста, поподробнее... То есть, ты считаешь, что вот эта программа:
type
pT = ^T;
T = object
value: integer;

constructor init(x: integer);
procedure print; virtual;
end;

constructor T.init(x: integer);
begin value := X; end;
procedure T.print;
begin writeln(value); end;


procedure print_me(const p: pT);
begin
p^.print;
end;

begin
print_me(new(pT, init(20)));
print_me(new(pT, init(30)));
print_me(new(pT, init(40)));
end.
не напечатает ничего? Как же она может напечатать, если я передаю (да еще и константно) указатель на объект, который НЕ существует? Вынужден тебя огорчить, она будет работать... Объясни тогда, почему, если НЕТ указателя?

Цитата
Полностью согласен.
Ха... А ты что думал, я дам программку, в которой надо изменить 2 символа и она будет работать, как положено? Нет уж... no1.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #77


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


В общем я имел ввиду объект с потерянным на него указателем, но не страшно, развития вопроса мне нравится... smile.gif
Цитата
Как же она может напечатать, если я передаю (да еще и константно) указатель на объект, который НЕ существует?

Что, он действительно не существует? blink.gif Судя по изменению памяти я бы этого не сказал...
Цитата
Объясни тогда, почему, если НЕТ указателя?

Цитата
procedure print_me(const p: pT);

А что же тогда такое p?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #78


Гость






Цитата
Что, он действительно не существует?
А теперь я тебя спрошу:
procedure TArr.count_each(const p: PT);
var i, count: integer;
begin
count := 0;
for i := 1 to num do
if (typeof(arr[i]^) = typeof(p^))
then inc(count);
writeln('count = ', count);
dispose(p,done);
end;

...
any_arr.count_each( ??? );
Что должно быть на месте вопросов, чтобы внутри count_each произошла Run-Time ошибка 210 ? smile.gif И где именно она может произойти (желательно показать строчку внутри процедуры, и сказать, ЧТО эту ошибку может вызвать)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #79


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Цитата
И где именно она может произойти

Так как 210 ошибка возникает при обращению к виртуальному методу не инициализированного объекта, а единственный используемый метод это done, то следовательно такая ошибка может возникнуть только здесь -
Цитата
dispose(p,done);

Цитата
Что должно быть на месте вопросов, чтобы внутри count_each произошла Run-Time ошибка 210 ?

Указатель на не инициализированный объект, правда в таком случае ошибка произойдет раньше...


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #80


Гость






Ты сам себе противоречишь, тебе не кажется? Ты покажи такой ответ, которого можно добиться... То есть, чтобы ошибка была предсказуемой... Твой предыдущий пост не отвечает на поставленный вопрос, ты вводишь сам себя в заблуждение (так ошибка произойдет на показанной тобой строке, или раньше?) Вот я сейчас могу показать, что надо сделать, чтобы произошла именно ошибка №210, а не немедленное закрытие программы, "неправильная инструкция" или еще что-то в этом роде... Следовательно, я смогу и избежать этой ошибки... Пока ты не научишься ошибки предсказывать - об их исправлении не может быть и речи blum.gif
 К началу страницы 
+ Ответить 

6 страниц V « < 2 3 4 5 6 >
Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 22:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name