![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Пользователь
Регистрация: 13.05.2008
Сообщений: 12
|
![]()
Я ведь написал что весь модуль не вместился в лимит 5000 знаков,оставил только те части где могла быть ошибка, и приложил архив с исходником.
Да и собственно говоря тип Chelovek вроде как к стандартным не относится, по этому то что он описан - можно было и догадаться =) |
![]() |
![]() |
#12 | ||
Форумчанин
Регистрация: 04.04.2009
Сообщений: 438
|
![]() Цитата:
При входе в процедуру Generate есть строка: setlength(ochered,36000); далее по тексту встречается такая конструкция: setlength(Ochered,t); Это разве я писал? При каждом следующем нажатии на кнопку SetLength вызывается снова и снова. А теперь объясните себе зачем здесь применяется процедура SetLength и что она делает. Может тогда поймете, что ирония ваша была не уместна Цитата:
Если же вам действительно нужен "результирующий" массив и все же очень хочется, чтобы ошибка не появлялась, то SetLength надо вызвать один раз (36000 - константа) и не в этой процедуре. Как только вы это сделаете, от надоевшей вам ошибки и следа не останется (придут другие ![]() Последний раз редактировалось Скандербег; 26.04.2009 в 07:52. |
||
![]() |
![]() |
#13 | ||||
Пользователь
Регистрация: 13.05.2008
Сообщений: 12
|
![]() Цитата:
setlength(ochered,36000)< точнее даже будет не 36000 а допустим переменная time, time -это килличество "секунд" рабочего дня которого я моделирую,Я предполагаю самый худший вариант что каждую секунду кто-то приходит, Конечно это слишком избыточное предположение но всёже я решил сделать так. Далее у меня идёт цикл который рассчитывает реальное время прихода людей и другие вещи, связанные с моделированием. переменная t после выполнения данного цикла будет содержать количество людей которые успели прийти за рабочий день time. Код:
и использую length(Ochered) уже как собственно количество людей. конечно, я бы мог сделать в цикле setlength(ochered,Length(ochered)+1 ) вместо накапливания t но на мой взгляд этот варриант хуже, и на сколько я помню, он так-же вылетает. так что, собственно ,если вы мне предлагаете сделать Цитата:
Цитата:
Цитата:
Ради прикола, напишите программу, наховите её hello, World обязательно. И пусть она вам продемонстрирует уличную магию =) procedure VrotMneNogi; var a:array of integer; x:integer; begin for x:=1 to 999 do begin setlength(a,RandomRange(1,999999)); end; end; Не обижайтесь , но вы не правы, и кстати говоря, зря вы сомневаетесь что я понимаю что делаю =) Последний раз редактировалось Андрей Куб; 26.04.2009 в 23:59. |
||||
![]() |
![]() |
#14 | ||||||
Форумчанин
Регистрация: 07.04.2009
Сообщений: 117
|
![]()
Эх, а ведь когда-то я сам был таким
![]() Цитата:
![]() Цитата:
Цитата:
Цитата:
Цитата:
То что ты здесь выложил, если не изменяет память называется "приступом гениальности" (это когда стандартную задачу решают через известное место). У меня своих сорсов целая пачка, и все ждут отладки и тестирования, а потом снова отладки и т.д. Словом, если тебе не пригодились мои советы (а их, обычно, не любят - любят тока готовые решения) - мог бы и сам промолчать, я здесь больше вообще постить не собирался. PS: SetLength выделяет/освобождает память по дин. массивы (ты бы исчо $EFFFFFFF элементов задал). Кстати, если ты думаешь, что max памяти под образ = вся память системы (не считая ОСь, включая подкачку), то ты сильно ошибаешся ![]() Цитата:
Copyright © qpokyc (qpy[the dog]bk.ru), 2008-2009 г.
|
||||||
![]() |
![]() |
#15 | ||
Форумчанин
Регистрация: 04.04.2009
Сообщений: 438
|
![]() Цитата:
Тонкость работы процедуры SetLength в том, что при повторном распределении памяти под один и тот же массив используется уже ДРУГОЙ блок. И никакой гарантии, что ячейки памяти, которые использовались в прежнем массиве будут использованы в новом блоке нет. К тому же, при выделении другого блока Delphi НЕ КОПИРУЕТ в него данные из прежнего. Поэтому когда вы предполагаете, что отсекаете ненужные ячейки ("я отсекаю ненужные пустые ячейки"), а Delphi благородно переместит данные из одного блока в другой, то в этом то и есть непонимания процесса. Да, при выполнении вашей программы может происходить "удачное" повторное распределение блока, который будет практически совпадать с прежним, но как только произойдет "не удачное", с точки зрения программы, распределение, то в этом случае и может появится ошибка, т.к. конструкция, например, ochered[t] будет обращаться к несуществующей области памяти. Оттого и ошибка блуждающая. Я могу понять доводы размещения в памяти 720 000 элементов Integer (хотя всецело присоединяюсь к qpokyc в части его высказывания: "ты бы исчо $EFFFFFFF элементов задал") - это не профессионально, но допустимо. Но я никак не могу понять, почему вы не хотите проверить мои слова на практике. В программе я сделал так: - закомментировал в процедуре Generate все вызовы SetLength(ochered, ), затем создал массив один раз: Код:
После этого несколько раз перезапуская программу нажимал кнопку по 10-30 раз - ошибки не было ни разу. Использовать length(Ochered) - это хорошо, но уж если массив создан с избыточностью, то не надо его перераспределять, а можно применять переменные (t, time1, к примеру) для определения количества значащих элементов в каждый момент времени или как-нибудь по-другому, варинатов тоже тьма. Цитата:
---- Без обиды, но не могу не поддержать qpokyc в части "правильности" оформления текста программы. Ну, поймите вы, такой текст как у вас будет малочтабельным и для вас самого через пару месяцев. Не говоря уж об элементаром уважении к тем, кто этот текст пытается разобрать. В нормально оформленном коде и разбираться приятно - чувствуется единомышленник. Такого при прочих равных условиях уже не хочется посылать куда подальше. Конечно, это лишь совет и вы, естественно, вольны следовать ему или плюнуть на него. |
||
![]() |
![]() |
#16 | ||
Пользователь
Регистрация: 13.05.2008
Сообщений: 12
|
![]()
Скандербег, спасибо большое, помогло.
Я дествительно не правильно понимал работу дин. массива. еще раз сенкс. Цитата:
А вообще, если бы в тебе было стока же знаний скока пафоса наверное ты бы был хорошим спецом) А не человеком который чёто где-то слышал но знать толком не знает, по этому отделывается фразами "мне лень" "меня стошнило" и тд... Единственное в чем я с тобой согласен это в том что Цитата:
|
||
![]() |
![]() |
#17 | |
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
![]()
Возможно я влезаю не по теме, но очень уж хочется решить этот вопрос раз и навсегда.
Цитата:
Так что же всё-таки правильно: может происходить потеря данных при усечении/расширении массива или нет? |
|
![]() |
![]() |
#18 |
Форумчанин
Регистрация: 16.12.2006
Сообщений: 859
|
![]() Код:
а вот если сначала на один уменьшить, а потом обратно прибавить - нельзя быть таким увереным про восстановление данных. |
![]() |
![]() |
#19 | |
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
![]() Цитата:
Вот об этом и речь. Точнее - вопрос. Если убавить на один элемент (или несколько), а потом добавить на столько же, то никаких вопросов - массив останется там же (если конечно между удалением/увеличением не будет других операций по распределению памяти кучи). А вот если увеличивать на значительную величину, да еще вперемешку с другими операциями? Массив ведь не может быть "рваным". Если для его переразмещения не хватит памяти на прежнем месте, то менеджер кучи выделит новый кусок - но всегда ли будут скопированы в новое место старые данные? Последний раз редактировалось Jeni; 28.04.2009 в 02:18. |
|
![]() |
![]() |
#20 | ||
Форумчанин
Регистрация: 07.04.2009
Сообщений: 117
|
![]() Цитата:
Как SetLength работает с обычной строкой понятно каждому: 1) Нулевой елемент := длинна строки 2) Память НЕ перераспределяется И исходник сей процедуры тому подтверждение: Код:
Судя по заголовку и коменту, эта процедура работает с нуль-терминированной строкой (по идее, может работать с любым дин. массивом, по крайней мере - ничего другого в этом духе я в модуле не нашел) Код:
![]() ![]() С моей точки зрения, здесь довольно четко написано..., что, в случае со строкой, исходный массив КОПИРУЕТСЯ в новый блок памяти (в случае если есть "что" и "куда" копировать). Но можно было не тратить время на изучение ассемблерной вставки, а просто выполнить копирование своими руками(чтоб точно знать)! Как это уже советовал сделать Скандербег, и как это делают адекватные программисты. (про оптимальность кода - ни слова! Я веду речь об надежности...) Цитата:
ЗЫ: ув. Андрей Куб, в сторону ваших замечаний, по поводу моих "где-то слышал" (где я такое говорил?): 1) Я это не "где-то слышал", я это читал в спец. литературе, а потом использовал на практике. 2) Я решаю задачи: a) платно - ДА; b) на энтузиазме - иногда ДА с) на халяву - НЕТ! По поводу вашего кода - вам уже сделали замечание об "элементарном уважении", а ваш оргумент по поводу того - полнейший бред. И все, окончим на этом спор "ниачем". ЗЗЫ: Если у вас динамический массив - это очередь из людей, а человек - это некая сущность с определенными статическим числом признаков, то непонятным становится как минимум то, что: 1) Почему это все хранится в памяти, а не на диске (предохранитель придут викрутят - и потеряете вы всю статистику за день! К тому же - память не резиновая, хоть и не в каменном веке живем! К тому же так легче - дин. массивы не пригодятся вообще!) 2) Почему "человек" - это массив, а не структура (очевидно, желаете запутать код и растолковать всем, что вы намного лучше все придумали - это я и называю "приступом гениальности") Вот вам и решение ![]() ИМХО тему пора закрывать - пусть учит матчасть на досуге...
Copyright © qpokyc (qpy[the dog]bk.ru), 2008-2009 г.
Последний раз редактировалось qpokyc; 28.04.2009 в 07:56. |
||
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Не могу понять почему вылетает 3 процедурка, помогите | Taisja | Помощь студентам | 2 | 04.06.2008 21:28 |
прога пишет ошибку при открытии файла (почему?) | nicky777 | Общие вопросы Delphi | 2 | 14.03.2008 17:56 |
Есть готовая прога но запароленная, не могу запустить! | Алёна | Общие вопросы Delphi | 4 | 29.10.2007 10:41 |