Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизДинамические массивы, 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c