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

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

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

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


Гуру
*****

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

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


Супер, спасибо!!!
any_arr.count_each(new(PTfloat));

А можно брать TypeOf типа? У него же нет VMT... Или есть?


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


Гость






Цитата
А можно брать TypeOf типа? У него же нет VMT...
Смотрим в документацию:
Цитата(TP Help)
TypeOf (function)
Returns a pointer to an object type's virtual method table.

Declaration:
procedure TypeOf (Param1: ObjectType) : Pointer
Remarks:
Param1 is either an object type identifier or an instance of an object type.
Can only be applied to object types that have a VMT; all other types result in an error.
Значит, можно smile.gif А почему? У типа действительно нет VMT... У него вообще ничего нет, главное, чтобы VMT могла быть у экземпляра этого типа...
 К началу страницы 
+ Ответить 
Bokul
сообщение 26.11.2006 3:58
Сообщение #23


Гуру
*****

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

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


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


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


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


Гость






Bokul no1.gif Не будет того, что ты написал:

Спойлер (Показать/Скрыть)
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 26.11.2006 12:41
Сообщение #25


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


Цитата
У него вообще ничего нет, главное, чтобы VMT могла быть у экземпляра этого типа...

Значит, я слегка увлеклась и
obj_int^.Create; 
...
obj_float^.create;

на компиляцию не повлияют. что с ними, что без них...

volvo, я же уточнила, что код будет только компилироваться. Это, конечно, для корректной работы необходимо, но не достаточно.
По поводу корректной работы.
Спойлер (Показать/Скрыть)


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.11.2006 12:53
Сообщение #26


Гость






мисс_граффити blink.gif Да ты что? smile.gif Не будет и этого smile.gif Два предположения из твоих трех - ошибочны...

Если бы все было так просто, неужели же я стал бы задавать этот вопрос? blum.gif
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 26.11.2006 13:46
Сообщение #27


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


Расскажешь, как на самом деле?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.11.2006 14:51
Сообщение #28


Гость






Цитата
Расскажешь, как на самом деле?
yes2.gif Рассказываю... (здесь описание всех ошибок, которые я намеренно внес в программу, и объяснение, почему ошибочно то или иное предположение, высказанное ранее, так что, если кто-то хочет подумать самостоятельно - не открывайте текст, и заодно подумайте об ответе на... )

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

... очередной вопрос: где именно (желательно показать конкретные строки кода, и рассказать, почему именно тут) происходят в этой программе утечки памяти, и как нужно переделать программу (НЕ меняя иерархию объектов), чтобы убрать утечки, и добиться полностью правильной ее работы?

О том, что это за структура: Это что-то напоминающее кортеж языка Python, только с изменяемыми элементами...
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 26.11.2006 15:24
Сообщение #29


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


Цитата
Чем же непонятное? Указатель описан, как указатель на базовый класс, значит, в любом случае, в массиве будут указатели на экземпляры одного из типов в цепочке наследования...

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.11.2006 16:32
Сообщение #30


Гость






Цитата
Почему так?
А что, собственно, вызывает сомнения? Три объекта в иерархии, три адреса VMT... То, что есть четвертое значение?

smile.gif Так сделай
any_arr.set_index(4, nil);
и посмотри на содержимое Evaluate ...arr[4]^ и ...arr[5]^
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 26.11.2006 16:55
Сообщение #31


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


те же Ptr(DSeg,$1068)
соответственно, typeof(arr[4]^)<>typeof (объект одного из классов T,TInt,TFloat)
так?
или я что-то совсем неправильно понимаю?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.11.2006 17:31
Сообщение #32


Гость






Ну, естественно... Какой же тип у NIL-а? Вообще-то, обращение по nil^ приводит к тому, что в С++ называется UB (Undefined Behavior)... НЕЛЬЗЯ этого делать... Поэтому, какой бы результат ты не получила - он будет некорректным, если значение указателя эквивалентно NIL
 К началу страницы 
+ Ответить 
Bokul
сообщение 26.11.2006 21:21
Сообщение #33


Гуру
*****

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

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


Спасибо за ссылку.
Цитата
Дело все в том, что TypeOf возвращает адрес VMT для объекта

Т.е. она просто читает это поле:
Цитата

Это 16-битовое поле, называемое полем таблицы виртуальных методов (VMP), используется для запоминания
смещения таблицы виртуальных методов в сегменте данных.

?

Цитата

и как нужно переделать программу (НЕ меняя иерархию объектов),чтобы убрать утечки, и добиться полностью правильной ее работы?

Так поможет?

var
obj_int: ^Tint;
obj_float: ^Tfloat;
any_arr: TArr;
p:pointer;
begin
mark(p);{запоминаем в p границу текущей не занятой памяти}
any_arr.init;
obj_int := new(PTint);
obj_int^.Create;
obj_int^.value := 3;
any_arr.set_index(1, obj_int);
obj_float := new(PTfloat);
obj_float^.create;
obj_float^.value := 3.5;
any_arr.set_index(2, obj_float);
any_arr.count_each(new(PTfloat));
release(p);{освобождаем всю занятую память - от p и до конца кучи}
end.



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


Гость






Нет, так не пойдет... Это не выход... Ты не убираешь утечки, а просто стираешь следы их присутствия... Я имел в виду "не допускать появления утечек"...

P.S. Заметь, я не сказал "Не изменяя объекты", я сказал "Не изменяя иерархию", т.е. не добавляя новых типов перед базовым, и между предком и потомком...
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 26.11.2006 22:04
Сообщение #35


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


Цитата(volvo @ 26.11.2006 17:31) *

Ну, естественно... Какой же тип у NIL-а?

вот я его непонятным и обозвала...
и написала, что он определится, но как...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bokul
сообщение 27.11.2006 2:20
Сообщение #36


Гуру
*****

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

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


Цитата
где именно происходят в этой программе утечки памяти

Утечка происходит тогда, когда мы берем больше с кучи, чем возвращаем, да? Если да, то я не вижу ни одного dispose в проге... Или я что-то путаю?


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


Гость






Цитата
Если да, то я не вижу ни одного dispose в проге
Да... Вот я и не поставил Dispose... Попробуешь сделать это? smile.gif
 К началу страницы 
+ Ответить 
Bokul
сообщение 27.11.2006 2:39
Сообщение #38


Гуру
*****

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

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


Цитата
Да... Вот я и не поставил Dispose...

Это хорошо, а я ищу не знаю что...
Цитата
Попробуешь сделать это?

Ага, теперь ясно в чем задача.
Цитата
any_arr.count_each(new(PTfloat, create ));

Я так понял, что мы остановились на таком вызове этого метода? Сдесь не происходит выделения памяти кроме как для указателя?


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


Гость






Цитата(Bokul @ 27.11.2006 1:39)
Я так понял, что мы остановились на таком вызове этого метода? Сдесь не происходит выделения памяти кроме как для указателя?
smile.gif Как так не происходит? А экземпляр объекта где хранится? Не в указателе же...
 К началу страницы 
+ Ответить 
Bokul
сообщение 27.11.2006 2:51
Сообщение #40


Гуру
*****

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

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


Цитата
Как так не происходит? А экземпляр объекта где хранится? Не в указателе же...

any_arr.count_each(new(PTfloat, create ));

Ну тогда все понятно, мы передаем указатель на объект в процедуру any_arr.count_each (не зная его), он там копируется. Выходит мы получаем два указателя на один объект - один локальный (копия) и второй - который мы не знаем. Мне интересно, что делает Паскаль с этим неизвестным? От этого и зависит, наверное, решение... ИМХО.

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


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

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

 



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