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

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

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

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


Гость






Цитата
Честно говоря не понимаю почему так.
Потому, что этот вариант некорректен по определению. Если бы ты компилировал ЭТО в FPC, например, то получил бы Error 216 или AV. Почему?

А кто тебе сказал, что
getmem(p,sizeof(ob));
инициализирует указатель нулем? Ты что, переопределял где-то HeapFunc? По умолчанию GetMem возвращает ненулевой указатель на выделенную область памяти, а при нехватке памяти инициирует RunTime Error, то есть, корректно получить указатель равный Nil с ее помощью - проблематично.

Если TP "замалчивает" ошибку - это еще не значит, что ее нет. Насколько я знаю, эта тема как раз и создавалась для того, чтобы научить избегать подобных ошибок, а не делать их преднамеренно. Есть гораздо более корректный и красивый способ сделать то, что требовалось по условию. yes2.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #102


Гуру
*****

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

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



type
pT = ^T;
T = object
end;

pTT=^TT;
TT=object(T)
end;

procedure X(const the_pointer: pT);
begin
if the_pointer=nil then writeln('not assigned');
end;

var
p: ^TT;
mem:longint;
begin
mem:=memavail;
new(p);
X(p);
writeln('Difference: ',mem-memavail);
readln;
end.



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


Гость






no1.gif Не пойдет... Имелся в виду другой способ... А теперь - о природе данного вопроса, почему собственно я его задал, хотя, казалось бы, предыдущий вопрос еще не решен окончательно? А вот почему. Я как раз это и хотел выяснить, знаешь ли ты, что при таком вызове
X(new(pT, Init));
в процедуру может передаваться NIL (и в каком именно случае это происходит)? Оказалось, что не знаешь... Вот отсюда и вытекает одна из проблем, с которой ты столкнулся в предыдущей задачке, решать которую тебе пришлось "костылями"...

Теперь, с подсказкой, КАК вызывать процедуру, сможешь написать код, который делает то, что требовалось? smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #104


Гуру
*****

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

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


Цитата(volvo @ 12.12.2006 17:34) *

знаешь ли ты, что при таком вызове
X(new(pT, Init));
в процедуру может передаваться NIL (и в каком именно случае это происходит)? Оказалось, что не знаешь...

Даже хуже - я не понимаю почему... Ведь если есть конструктор, должно быть и поле виртуальных методов, а значит размер объекта в куче будет не нулевым. Тогда как new может вернуть nil?
Цитата

Теперь, с подсказкой, КАК вызывать процедуру, сможешь написать код, который делает то, что требовалось? smile.gif

Не понял, о каком коде идет речь? unsure.gif


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


Гость






Цитата
Не понял, о каком коде идет речь?
О том коде, при добавлении которого в программу (и вызове процедуры так, как я показал), получим сообщение "not assigned"... По умолчанию ты его не получишь, нужно кое-что сделать дополнительно...

Цитата
Даже хуже - я не понимаю почему...
Вот-вот... Я догадался, в чем проблема... А раз ты не понимаешь почему это происходит, то, само собой, не проверяешь и такой возможности, что при выделении памяти под объект "на лету" тебе может вернуться нулевой указатель... Может... Дело все в том, что Constructor - это не совсем простая процедура... Это, скорее, даже не процедура, а функция... И она может возвращать True/False для статических объектов и Nil/{указатель_на_объект} для динамических...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #106


Гуру
*****

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

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


Цитата
И она может возвращать True/False для статических объектов и Nil/{указатель_на_объект} для динамических...

Ха, действительно так good.gif Никогда не встречал информации об этом. В каких ситуациях Constructor будет возвращать False, True? Какие преимущества дает использование конструктора для статических объектов?

Цитата
О том коде, при добавлении которого в программу (и вызове процедуры так, как я показал), получим сообщение "not assigned"..

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

procedure X(const the_pointer: pT);
begin
if the_pointer=nil then writeln('not assigned');
end;



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


Гость






Вот с таким:
procedure X(const the_pointer: pT);
begin
if not assigned(the_pointer) then writeln('not assigned');
end;

Аленка была абсолютна права, я сразу просто забыл поставить not, она же мне и напомнила...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #108


Гуру
*****

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

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


Цитата
. В каких ситуациях Constructor будет возвращать False, True? Какие преимущества дает использование конструктора для статических объектов?
А
rolleyes.gif rolleyes.gif rolleyes.gif ???????
Цитата
Вот с таким:

Я же тоже самое написал...


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


Гость






Цитата
Какие преимущества дает использование конструктора для статических объектов?
blink.gif Попробуй обратиться к методу статического объекта, лучше - виртуальному, чтобы прочувствовать как следует, без предварительного вызова конструктора...

(главное - не запутайся, статический объект - тот, который описывается так:
var obj: TObject;
и соответственно создается в сегменте данных, а динамический - это тот, который создается через New в "куче")
 К началу страницы 
+ Ответить 
сообщение
Сообщение #110


Гуру
*****

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

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


Цитата
главное - не запутайся

Правильно заметил - я запутался с терминами. Теперь все ясно.

Почему не отвечаешь на самые интересные вопросы? smile.gif

Я понял, что эта задача сводится к тому, чтобы конструктор вернул false?
Цитата
По умолчанию, когда для динамического экземпляра объекта не
хватает памяти, вызов конструктора, использующий расширенный син-
таксис стандартной процедуры New, генерирует ошибку этапа выпол-
нения 203. Если вы установили функцию обработки ошибки динамичес-
ки распределяемой области, которая вместо стандартного результата
функции 0 возвращает 1, когда выполнить запрос невозможно, вызов
конструктора через New возвращает nil (вместо прерывания програм-
мы).

Восстановление ошибок конструктора
Так что, надо замусорить всю память в куче для решение?

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


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


Гуру
*****

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

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


Разобрался, даже память не надо использовать, просто в конструкторе вызвать Fail, и все будет хорошо... smile.gif

type
pT=^T;
T=object
constructor init;
destructor done;
end;
constructor T.init;
begin
done;
fail;
end;


destructor T.done;
begin end;

procedure x(const the_pointer:pT);
begin
if the_pointer=nil then
writeln('not assigned');
end;

var mem:longint;
begin
mem:=memavail;
X(new(pT,init));
writeln('Difference: ',mem-memavail);
readln;
end.



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


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


Гуру
*****

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

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


Значит правильно? smile.gif

Теперь я хотел бы вернутся к вопросу о организации и освобождения с память указателей на один и тот же объект - Сообщение #88.

Как сделать правильное освобождение, чтобы потом не возникло Error 210?


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


Гость






Цитата
Теперь я хотел бы вернутся к вопросу о организации и освобождения с память указателей на один и тот же объект
Ну что ж... Давай вернемся... smile.gif Только вначале я хотел бы тебя переадресовать вот сюда:

Задачи на знание ООП (сообщение №58)... Здесь ты совершил стратегическую ошибку, выбрав для себя вариант №3 - назначение индексов самому... Я, если честно, на такой вариант не рассчитывал (потому, что я объяснил, что структура представляет собой кортеж, в котором обращение идет не как в списке, чтобы сам объект назначал нумерацию, а нумерация задается мной) - поэтому вот тот вариант, который я имел в виду, когда создавал тему:

Спойлер (Показать/Скрыть)

smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #114


Гуру
*****

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

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


Ясно, все красиво и просто.. smile.gif после того как уже посмотрел... sad.gif
Цитата
Я, если честно, на такой вариант не рассчитывал

А я на функцию copy не рассчитывал... Это специально для нее ты сделал метод make_copy виртуальным?

Ну как, продолжение будет? rolleyes.gif

М
Нет, продолжения не будет... Я, если честно, рассчитывал на бОльшую посещаемость данной темы. Но, как выяснилось, на этом форуме все считают себя достаточно разбирающимися в ООП (только вот непонятно, что ж никто не отвечает на вопросы по этой теме, редко, но все-же появляющиеся в разделе "Задачи"?), для одного человека я поддерживать тему не буду.

Закрыто...



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


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

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

 





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