![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| _DeMiUrG_ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
пришел к варианту с функцией CopyMemory
те есть обьявлен DynArray:array of array of single; SetLenght(DynArray,5,5); потом идет считывание из файла BlockRead(F,DynArray,sizeof(DynArray)); далее я пытаюсь присвоить значения функцией CopyMemory(@XX,@DynArray[i,i],4); и в этом месте компилятор ругается "Access violation at address ...." что посоветуйте? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
ошибка еще на BlockRead, хотя и CopyMemory это не то
Добавлено через 59 секунд что такое XX? Добавлено через 6 минут и 54 секунды
чтение примерно так -------------------- Обижено школьников: 8 |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 7 Всего: 38 |
-------------------- ![]() |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
скопировать участок памяти влезающий в машинное слово можно и без вызова функции. Просто присвой.
-------------------- Обижено школьников: 8 |
|||
|
||||
| _DeMiUrG_ |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
правильней написать [i,j] i равно номеру считываемого кадра j номер параметра в этом кадре в начале я считываю заголовок в нем указано количество параметров и кадров
да и заголовок я считываю как одну структуру за 1 раз BlockRead(F,recordtype,sizeof(recordtype)); XX это переменная типа single смысл в том что я читаю значение массива через BlockRead потом мне надо расшифровать те у меня задано какой размер в байтах (или тип) будет у следующего параметра те когда я читаю CopyMemory(@X1,@DynArray[i,о],recordtype.type[j]); recordtype.type[j] может быть 4 тогда тип X1 single или recordtype.type[j] 1 тогда тип X2 byte
как скопировать участок и при этом расшифровать его тип подскажите Это сообщение отредактировал(а) _DeMiUrG_ - 1.11.2007, 21:11 |
||||||
|
|||||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
так бы и говорил. у тебя в первом посте тупо четверка.
так как показано в первом посте ты его не прочитаешь хотябы потому что sizeof(DynArray) всегда 4 Добавлено через 1 минуту и 55 секунд на момент обращения к DynArray[i,о] одномерный DynArray[i] уже поврежден непрвильным чтением Добавлено через 7 минут и 58 секунд какой тип элемента DynArray? покажи описание recordtype. -------------------- Обижено школьников: 8 |
|||
|
||||
| _DeMiUrG_ |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
в первом посте я указал DynArray:array of array of single; SetLenght(DynArray,5,5); ну или более правильно SetLenght(DynArray,recordtype.NumCadr,NumParam); вот код обьявления заголовка: [cod] type trec=record NumCadr,NumParam:integer; ... recordtype.type:array of byte; ... end; var recordtype:trec; [/cod] потом я его считываю BlockRead(F,recordtype,sizeof(recordtype)); Тут все работает как нужно. а далее на основе значений заголовка я начинаю считывать значения DynArray те основоной массив даных состоящий из кадров и парометров см выше |
||||||
|
|||||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
у тебя бОльшие проблемы чем кажется сразу уясни: динамический массив это указатель на блокпамяти хранящий элементы друг за другом двумерный динамический массив это указатель на блок памяти хранящий указатели (друг за другом) на блоки памяти хранящие (друг за другом) элементы Добавлено через 5 минут и 58 секунд так можно читать только такой массив
но не такой записи это тоже касается когда ты пишешь переменнюю типа динамический массив в файл то туда пападают 4 байта хранящие адрес первого элемента массива в памяти на момент записи. При чтении (с большой вероятностью) он уже не имеет никакого смысла. SizeOf(DynArray) всегда 4, потому что в самой переменной нет содержимого массива как тольковей объяснить я не знаю -------------------- Обижено школьников: 8 |
||||
|
|||||
| _DeMiUrG_ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
значит так проясняю ситуацию дальше файл который я считываю формирую не я он уже есть. структура файла мне неизвстна, но есть рабочий код на VB на который я ориенируюсь так вот заголовок у файла считывается правильно. да и когда я считвают элементы массива вот тут CopyMemory(@X1,@DynArray[i,j],recordtype.type[j]); DynArray[i,j] равно в трассировщике что то типа $147561000 <--- что то вроде этого вы можете подсказать как считать этот дин массив? |
|||
|
||||
| Alix |
|
|||
|
L45 ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 4.5.2005 Где: Pskov/Spb Репутация: 8 Всего: 23 |
тебе уже несколько раз сказали, что
-------------------- Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой High tech. Low live. (с) Gardner Dozois |
|||
|
||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Добавлено через 1 минуту и 34 секунды
Добавлено через 2 минуты и 15 секунд покажи -------------------- Обижено школьников: 8 |
||||
|
|||||
| Alix |
|
|||
|
L45 ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 4.5.2005 Где: Pskov/Spb Репутация: 8 Всего: 23 |
разумеется -------------------- Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой High tech. Low live. (с) Gardner Dozois |
|||
|
||||
| _DeMiUrG_ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
Вы мне можете обьяснить DynArray -двумерный массив вы бращаетесь к нему как к одномерному DynArray[i] так и должно быть? |
|||
|
||||
| Alix |
|
|||
|
L45 ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 4.5.2005 Где: Pskov/Spb Репутация: 8 Всего: 23 |
Дык в этом вся соль. Как рассказали выше, ты можешь писать в одномерный и статический и динамический, но вот сразу писать в двумерный динамический - нельзя, так он устроен. И поэтому в этом цикле мы пишем в каждую строку двумерного массива по отдельности, т.к. одна строка - это массив одномерный, то мы можем это позволить. -------------------- Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой High tech. Low live. (с) Gardner Dozois |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |