any_arr.count_each(new(PTfloat));
А можно брать TypeOf типа? У него же нет VMT... Или есть?
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Задачи на знание ООП, (только для Турбо-Паскаля 7.0) |
Bokul |
Сообщение
#21
|
Гуру Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: 11 |
Супер, спасибо!!!
any_arr.count_each(new(PTfloat)); А можно брать TypeOf типа? У него же нет VMT... Или есть? -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
Сообщение
#22
|
Гость |
Цитата А можно брать TypeOf типа? У него же нет VMT... Смотрим в документацию:Цитата(TP Help) TypeOf (function) Значит, можно А почему? У типа действительно нет VMT... У него вообще ничего нет, главное, чтобы VMT могла быть у экземпляра этого типа...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. |
Bokul |
Сообщение
#23
|
Гуру Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: 11 |
Спойлер (Показать/Скрыть)
Сообщение отредактировано: Bokul - -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
Сообщение
#24
|
Гость |
Bokul Не будет того, что ты написал:
Спойлер (Показать/Скрыть)
|
мисс_граффити |
Сообщение
#25
|
просто человек Группа: Пользователи Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
Цитата У него вообще ничего нет, главное, чтобы VMT могла быть у экземпляра этого типа... Значит, я слегка увлеклась и obj_int^.Create; на компиляцию не повлияют. что с ними, что без них... volvo, я же уточнила, что код будет только компилироваться. Это, конечно, для корректной работы необходимо, но не достаточно. По поводу корректной работы. Спойлер (Показать/Скрыть)
-------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
volvo |
Сообщение
#26
|
Гость |
мисс_граффити Да ты что? Не будет и этого Два предположения из твоих трех - ошибочны...
Если бы все было так просто, неужели же я стал бы задавать этот вопрос? |
мисс_граффити |
Сообщение
#27
|
просто человек Группа: Пользователи Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
Расскажешь, как на самом деле?
-------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
volvo |
Сообщение
#28
|
Гость |
Цитата Расскажешь, как на самом деле? Рассказываю... (здесь описание всех ошибок, которые я намеренно внес в программу, и объяснение, почему ошибочно то или иное предположение, высказанное ранее, так что, если кто-то хочет подумать самостоятельно - не открывайте текст, и заодно подумайте об ответе на... )Спойлер (Показать/Скрыть)
... очередной вопрос: где именно (желательно показать конкретные строки кода, и рассказать, почему именно тут) происходят в этой программе утечки памяти, и как нужно переделать программу (НЕ меняя иерархию объектов), чтобы убрать утечки, и добиться полностью правильной ее работы? О том, что это за структура: Это что-то напоминающее кортеж языка Python, только с изменяемыми элементами... |
мисс_граффити |
Сообщение
#29
|
просто человек Группа: Пользователи Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
Цитата Чем же непонятное? Указатель описан, как указатель на базовый класс, значит, в любом случае, в массиве будут указатели на экземпляры одного из типов в цепочке наследования... Спойлер (Показать/Скрыть)
-------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
volvo |
Сообщение
#30
|
Гость |
Цитата Почему так? А что, собственно, вызывает сомнения? Три объекта в иерархии, три адреса VMT... То, что есть четвертое значение? Так сделай 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) так? или я что-то совсем неправильно понимаю? -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
volvo |
Сообщение
#32
|
Гость |
Ну, естественно... Какой же тип у NIL-а? Вообще-то, обращение по nil^ приводит к тому, что в С++ называется UB (Undefined Behavior)... НЕЛЬЗЯ этого делать... Поэтому, какой бы результат ты не получила - он будет некорректным, если значение указателя эквивалентно NIL
|
Bokul |
Сообщение
#33
|
Гуру Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: 11 |
Спасибо за ссылку.
Цитата Дело все в том, что TypeOf возвращает адрес VMT для объекта Т.е. она просто читает это поле: Цитата Это 16-битовое поле, называемое полем таблицы виртуальных методов (VMP), используется для запоминания смещения таблицы виртуальных методов в сегменте данных. ? Цитата и как нужно переделать программу (НЕ меняя иерархию объектов),чтобы убрать утечки, и добиться полностью правильной ее работы? Так поможет?
-------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
Сообщение
#34
|
Гость |
Нет, так не пойдет... Это не выход... Ты не убираешь утечки, а просто стираешь следы их присутствия... Я имел в виду "не допускать появления утечек"...
P.S. Заметь, я не сказал "Не изменяя объекты", я сказал "Не изменяя иерархию", т.е. не добавляя новых типов перед базовым, и между предком и потомком... |
мисс_граффити |
Сообщение
#35
|
просто человек Группа: Пользователи Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
Ну, естественно... Какой же тип у NIL-а? вот я его непонятным и обозвала... и написала, что он определится, но как... -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Bokul |
Сообщение
#36
|
Гуру Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: 11 |
Цитата где именно происходят в этой программе утечки памяти Утечка происходит тогда, когда мы берем больше с кучи, чем возвращаем, да? Если да, то я не вижу ни одного dispose в проге... Или я что-то путаю? -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
Сообщение
#37
|
Гость |
Цитата Если да, то я не вижу ни одного dispose в проге Да... Вот я и не поставил Dispose... Попробуешь сделать это? |
Bokul |
Сообщение
#38
|
Гуру Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: 11 |
Цитата Да... Вот я и не поставил Dispose... Это хорошо, а я ищу не знаю что... Цитата Попробуешь сделать это? Ага, теперь ясно в чем задача. Цитата any_arr.count_each(new(PTfloat, create )); Я так понял, что мы остановились на таком вызове этого метода? Сдесь не происходит выделения памяти кроме как для указателя? -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
Сообщение
#39
|
Гость |
Цитата(Bokul @ 27.11.2006 1:39) Я так понял, что мы остановились на таком вызове этого метода? Сдесь не происходит выделения памяти кроме как для указателя? Как так не происходит? А экземпляр объекта где хранится? Не в указателе же... |
Bokul |
Сообщение
#40
|
Гуру Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: 11 |
Цитата Как так не происходит? А экземпляр объекта где хранится? Не в указателе же... any_arr.count_each(new(PTfloat, create )); Ну тогда все понятно, мы передаем указатель на объект в процедуру any_arr.count_each (не зная его), он там копируется. Выходит мы получаем два указателя на один объект - один локальный (копия) и второй - который мы не знаем. Мне интересно, что делает Паскаль с этим неизвестным? От этого и зависит, наверное, решение... ИМХО. Сообщение отредактировано: Bokul - -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
Текстовая версия | 22.12.2024 9:30 |