Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Динамические массивы, 6 версия   Найти похожие ветки 

 
RomeoGolf   (2004-03-14 19:27) [0]

Проблема в следующем: файл с неизвестной заранее длиной переписываю в динамический массив. За пределы массива не выхожу. Массив перед новой записью освобождаю. Потом с массивом надо работать, в частности, пересылать через LPT-порт в железо (это 16-разр. слова). Короче, иногда при открытии пункта меню, любого, выдается ошибка, стандартная, "... выполнила недопустимую... будет закрыта... обратитесь к разработчику", а иногда еще и "чтение по адресу FFFFFFFFF", но это реже. Отловить не могу. Но если использую массив статический максимальной длины, и ненужные элементы не использую - все работает без ошибок. Может, кто знает, в чем фишка? Буду весьма благодарен за любой совет...


 
Petr V. Abramov ©   (2004-03-14 19:42) [1]

> Может, кто знает, в чем фишка?
 Я знаю - да в чем угодно. "При открытии пункта меню" может делаться много всего нужного и ненужного. Вы найдите строку ( например, при помощи отладчика), на которой предлагают к Вам (к разработчику) обратиться  и, скорее всего, вопрос сам собой рассосется.


 
Dimaxx ©   (2004-03-14 23:37) [2]

Динамическому массиву надо сперва задать длину через SetLength, а потом грузить в него.


 
evvcom   (2004-03-15 08:21) [3]


> За пределы массива не выхожу.

А как Вы это определили?


 
Defunct ©   (2004-03-15 08:36) [4]

RomeoGolf   (14.03.04 19:27)  
Покажите как вы загружаете данные в массив.


 
Alex Konshin ©   (2004-03-15 08:45) [5]

И еще: динамический массив чего?


 
Erik ©   (2004-03-15 10:15) [6]

И неплохо бы компилировать с RangeCheck. Можно и обрабочик ошибок в программу добавить.


 
Anatoly Podgoretsky ©   (2004-03-15 10:17) [7]

Очень сомнительно, что не выходишь


 
RomeoGolf   (2004-03-15 17:16) [8]


> И еще: динамический массив чего?

Говорю же- 16-разрядные слова, то бишь, типа word.

,
> Покажите как вы загружаете данные в массив.

Исходника под рукой нет, на другой машине, но смысл такой - раз длины файла не знаю даже приблизительно, считываю слово, увеличиваю длину массива на 1 и записываю слово в конец, SetLength"ом. Опять же, когда массив выходит за границу - ошибка сразу, четкая и уловимая, а у меня плавающая, то есть, то нету.


> И неплохо бы компилировать с RangeCheck. Можно и обрабочик
> ошибок в программу добавить.

С этим делом, как и с отладчиком, у меня проблемы, не секу пока что. А за пределы точно не выхожу, проверял размер массива, размер файла и собственно данных как при трассировке, так и выдавал при прогоне в Edit.


 
Anatoly Podgoretsky ©   (2004-03-15 17:22) [9]

Это все слова, ничем не подтвержденные


 
RomeoGolf   (2004-03-15 17:33) [10]

Ладно, спасибо за участие, буду разбираться с отладчиком и RangeCheck"ом. Похоже, тему можно закрывать.


 
PVOzerski ©   (2004-03-15 17:38) [11]

Несколько наводящих вопросов (если покажутся идиотскими, прошу прощения: по не продемонстрированному коду ни о стиле, ни об уровне программиста судить нельзя). Итак:
1) учтено ли, что динамические массивы начинаются с нулевого элемента и заканчиваются элементом № длина массива минус один?
2) Учтено ли, что переменная-динамический массив - лишь указатель на начальный элемент, и ее адрес не совпадает с адресом начального элемента?


 
Defunct ©   (2004-03-15 17:41) [12]

RomeoGolf   (15.03.04 17:16) [8]

Сделайте вот что..

Type TGWordArray = Array[0.. $3FFFFFFF] of Word; // Макс 1 Gig индексации

PGW : ^TGWordArray;

..
GetMem(PGW, FileSize(F));   // Выделяете столько памяти, сколько требуется
BlockRead(F, PGW^, FileSize(F); // Загружайте весь файл сразу
..


Или еще проще через TMemoryStream или TFileStream.


 
RomeoGolf   (2004-03-15 18:09) [13]

То PVOzerski  - безусловно учтено, при нарушении этих правил ошибки, опять же, улавливаемые и не плавающие.

То Defunct  - спасибо, примерно к этому решению подходил, но надеялся обойтись средствами Дельфи для работы с массивами, без указателей напрямую.


 
Romkin ©   (2004-03-15 18:16) [14]

Кстати, а как это, размер файла не известен?!


 
RomeoGolf   (2004-03-15 18:28) [15]

А это программа, которую надо переписать во Flash, для микропроцессора, а она сейчас короткая, потом побольше станет, а тестовая - вообще во всю Flash"ку


 
PVOzerski ©   (2004-03-15 18:28) [16]

"Плавающие" ошибки при нарушении 2-го правила возникают запросто, из-за того, что при выделении блоков памяти происходит фактическое выравнивание на 4 байта. Я сам на этом нажигался :^)


 
PVOzerski ©   (2004-03-15 18:32) [17]

Не 2-го, а 1-го, прошу прощения. Дык 3 кусочка кода посмотреть можно: выделение памяти под массив, чтение из файла в массив, высвобождение памяти (если есть)?


 
RomeoGolf   (2004-03-15 18:33) [18]

То PVOzerski - большое спасибо, проверю лишний раз, может, действительно чего-то не учел и в этом все дело.



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
1-1079080296
Yakudza
2004-03-12 11:31
2004.04.04
Как запретить Paste в TEdit ?


9-1063796535
z1r[0]
2003-09-17 15:02
2004.04.04
из 3d-max в .x


3-1078839844
Ross
2004-03-09 16:44
2004.04.04
Как добраться до значения Footer колонки в DBGrideh


14-1078603282
Piter
2004-03-06 23:01
2004.04.04
Новый клиент для форума


14-1078911908
MBo
2004-03-10 12:45
2004.04.04
Новосибирцам