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

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

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

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


Гуру
*****

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

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


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

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


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


Гуру
*****

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

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


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


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


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


Гость






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

Спойлер (Показать/Скрыть)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


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

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

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


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

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

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

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


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


Гость






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

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


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

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

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


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


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


Гость






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

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

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

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


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

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

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


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

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


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


Гость






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

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


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

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

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


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


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


Гость






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


Гость






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

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


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

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

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


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

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

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


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


Гуру
*****

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

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


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

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


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


Гость






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


Гуру
*****

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

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


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

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

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

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


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


Гость






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


Гуру
*****

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

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


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

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

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

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


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

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

 





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