![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
IUnknown |
![]()
Сообщение
#61
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Знаю, что переменные можно очищать с помощью dispose(); Но переменных в памяти очень много, можно ли каким-либо образом очистить всю память, занимаемую программой? Перед тем, как очищать память, надо знать, как эта память выделяется. Если выделял через GetMem - то освобождать надо через FreeMem, если выделял конструктором какого-то класса - то вызывай его деструктор, и т.д. При правильно структурированной программе таких ошибок возникать не должно. Я не знаю, как там у тебя память выделяется, поэтому советов, "как очищать" давать не буду. Хочешь - показывай программу, посмотрим, что можно поправить...Цитата Почему-то график пустует, хотя ко времени вызова StrinGrid уже заполняется Почему=то мне кажется, что даже если график и заполнится - там может быть полно "мусора". Лучше все-таки сделать так:procedure Tf_main.Grafiki; Цитата Это может быть из-за того, что числа в колонках большие: 5 знаков до запятой и 5 после? Вряд ли. Добавляться к графику точки все равно должны. |
TarasBer |
![]()
Сообщение
#62
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> если выделял конструктором какого-то класса - то вызывай его деструктор
Деструктор, который надо вызывать руками... Ни в одном другом языке такого бреда нету - везде либо ГЦ либо РАИИ, либо вообще понятие деструктора отсутствует. Позор ботланда, вечный костыль дельфи... -------------------- |
IUnknown |
![]()
Сообщение
#63
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну, что есть - то есть... По мне - так лучше я руками соберу там, где это надо, чем GC будет решать за меня, когда и где память освобождать.
Кстати, что в современном Дельфи (2009 и выше) есть возможность написать аналоги С++-ных auto_ptr, тогда будет чуть проще с освобождением памяти... Но это только на новых версиях... |
TarasBer |
![]()
Сообщение
#64
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> По мне - так лучше я руками соберу там, где это надо, чем GC будет решать за меня, когда и где память освобождать.
А ещё лучше нормальный RAII. > Кстати, что в современном Дельфи (2009 и выше) есть возможность написать аналоги С++-ных auto_ptr, тогда будет чуть проще с освобождением памяти... Но это только на новых версиях... Видел я эти аналоги - только не auto_ptr, а shared_ptr. Я и в Д7 умею делать приведение к интерфейсу. Только это, во-первых, обязательно через счётчик ссылок работает (а если мне нужно другое поведение?), а во-вторых, это дико тормозить будет. Проверяли - делали большой массив, загоняли в него 1000 раз по 10 ссылок на один объект, сортировали. В Д7 большую часть времени занимала работа интерфейсов, С++-ники ржали долго. Адский же код с контролируемыми объектами показал себя на нормальном уровне, правда я не знаю, вызовы деструкторов там виртуальные или статические, надеюсь, что компилятор догадался. -------------------- |
IUnknown |
![]()
Сообщение
#65
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата только не auto_ptr, а shared_ptr Если б я хотел сказать shared_ptr, я бы сказал "shared_ptr". Я говорил про auto_ptr. На дженериках. |
RussoTuristo |
![]()
Сообщение
#66
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: ![]() ![]() ![]() |
Извините, код громоздкий, но всё же выложу, не понимаю почему не строятся графики, помогите, пожалуйста, может и про память что-то дельное сказать можно?
Код удален procedure Tf_main.Button1Click(Sender: TObject); - вызывает функции расчета величин Вывод в GridResult осуществляет процедура procedure TzoneMath.ShowOnTable(grid:TStringGrid; room:integer); После неё я использую процедуру Grafiki Т.о. по моей мысли графики должны строится, но почему-то из таблицы считываются нулевые значения... Добавлено через 3 мин. Извините еще раз, а как сделать, чтобы в сообщении код показывался с полосой прокрутки? Сообщение отредактировано: RussoTuristo - 2.05.2011 17:20 |
IUnknown |
![]()
Сообщение
#67
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ты б лучше запаковал весь проект и выложил сюда, а то что ж получается, надо еще восстановить форму, чтоб запустить проект? Только EXE-шник удали, не надо его присоединять, меньше будет архив по размеру.
Цитата а как сделать, чтобы в сообщении код показывался с полосой прокрутки? На этом форуме нет такого функционала. Еще раз: если код длинный - лучше его архивировать и прикладывать к посту... |
RussoTuristo |
![]()
Сообщение
#68
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: ![]() ![]() ![]() |
Код программы прикрепил, удалить то длинное сообщение?
Прикрепленные файлы ![]() |
IUnknown |
![]()
Сообщение
#69
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата удалить то длинное сообщение? Это уже вопрос не ко мне...А в программе у тебя полный бардак, я попробую посмотреть, что можно сделать... У меня она вообще не запустилась - выбросила сообщение "Недостаточно памяти для осуществления операции". Посмотрю, почему. |
RussoTuristo |
![]()
Сообщение
#70
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: ![]() ![]() ![]() |
У меня такое сообщение вылетает, когда я раза 3-4 подряд вызываю функцию расчет, я не очищаю память вообще нигде, что больше всего ест памяти? Изображения, что строятся и где-то хранятся или множественные расчеты величин с 5 знаками после запятой? Можно в принципе сократить до 2-х знаков...
|
IUnknown |
![]()
Сообщение
#71
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Так... Во-первых, Buffer типа TImage, можно убрать, он не используется. Только жрет место. И много жрет, ты резервируешь для него достаточно большой размер памяти (увеличением Width и Height). Итого: процедура Tf_main.BitBtn1Click
А что касается Chart-а - так программа совершенно права. Смотри: ![]() , то есть, условие: Цитата if (GridResult.Cells[1, i]<>'') and (GridRoom.Cells[5, i]<>'') then |
RussoTuristo |
![]()
Сообщение
#72
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо большое, понял в чем ошибка с графиками, 2 дня с ними мучался и не заметил, что название StringGrida во втором условии перепутал, поправил, только вот теперь он ругается: EConvertError "" is not a valid floating point value.
А по поводу памяти можно еще вопросик: bufferы можно убрать, а изображение при многократном вызове расчета каждый раз ведь память занимает? Значит по идее перед каждым новым вызовым его тоже можно почистить? |
-TarasBer- |
![]()
Сообщение
#73
|
Гость ![]() |
Нет. Буферу надо выделять память только один раз.
А в обработчике кнопки надо стирать содержимое буфера. Понимаешь разницу между уничтожением буфера и стиранием его содержимого? |
IUnknown |
![]()
Сообщение
#74
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Значит по идее перед каждым новым вызовым его тоже можно почистить? Нужно, а не можно. Очистить.Цитата поправил, только вот теперь он ругается: EConvertError "" is not a valid floating point value. Значит, не везде поправил:if (GridResult.Cells[1, i]<>'') and (GridResult.Cells[5, i]<>'') then Сообщение отредактировано: IUnknown - 2.05.2011 18:59 |
RussoTuristo |
![]()
Сообщение
#75
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо большое, графики отображаются, сейчас займусь чисткой буфера.
Удивляюсь как вы умудряетесь замечать всё. Вот что значит мастера своего дела! Еще раз спасибо большое за помощь! |
IUnknown |
![]()
Сообщение
#76
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
RussoTuristo, ты не думал никогда над тем, что чем меньше строк в программе - тем лучше? Вот тебе 2 хинта, как можно безо всяких проблем убрать по десятку строк в каждом случае, без изменения функционала программы.
Первый - касается вот этого ужаса (из процедуры TzoneMath.ShowOnTable): Цитата for i:=1 to steps do begin Исправление: (Показать/Скрыть)
Функционал не изменился, все работает абсолютно так же, как и раньше. Второй. Зачем дублировать здесь: Цитата function TzoneMath.fGm(iter,CurrentRoom:integer; woll:TWoll; forroom:integer):extended; Исправление: (Показать/Скрыть)
Да, и еще... Я бы подумал над переносом хотя бы части глобальных переменных в соответствующие классы (в секцию private). Скажем, curroom. Внести ее в TzoneMath, например. Так же, как и iter_buf. Подумай над этим... И "разгрузи" код, путем использования With. Его ж читать невозможно... Сообщение отредактировано: IUnknown - 3.05.2011 11:06 |
RussoTuristo |
![]()
Сообщение
#77
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: ![]() ![]() ![]() |
Дельные замечания, поработаю над исправлением, в будущем пригодится....
И вопросик: Подскажите, пожалуйста, использую для сохранения и загрузки выше указанный код, но после загрузки при попытке Расчета вылетает ошибка: "" is not a valid integer value С чем это может быть связано? Визуально пустых строчек и эдитов нигде нет, ошибка отправляет в строчку: procedure Tf_main.Button1Click(Sender: TObject);//Функция расчета Без сохранения/загрузки всё работает нормально, что-то не так считывается? Сообщение отредактировано: RussoTuristo - 4.05.2011 13:43 |
TarasBer |
![]()
Сообщение
#78
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
edit15...
Хм, что бы это могло быть... Наверное, это пятнадцатый компонент типа TEdit, добавленный на форму, и в нём нет текста. А потому что, блин, нельзя использовать компоненты с именами, даваемыми по умолчанию. -------------------- |
IUnknown |
![]()
Сообщение
#79
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
То, что Дельфи останавливается на строке с edit15.text - ни разу не значит, что ошибка именно в нем. Может быть и раньше по ходу программы.
Цитата что-то не так считывается? Лишние ячейки грида заполняются пробелом. При проверкеЦитата if (GridRoom.Cells[2, i]<>'') and (GridRoom.Cells[3, i]<>'') then Цитата a1:=10*StrToInt(GridRoom.Cells[2, i]); if (Trim(GridRoom.Cells[2, i])<>'') and (Trim(GridRoom.Cells[3, i])<>'') then, тогда пробел не будет пропущен, и во-вторых, при чтении из файла: if TheClassName = 'TGrid' then Сообщение отредактировано: IUnknown - 4.05.2011 14:07 |
RussoTuristo |
![]()
Сообщение
#80
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо, исправил, теперь сохраняется и загружается.
|
![]() ![]() |
![]() |
Текстовая версия | 7.07.2025 20:42 |