Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CopyMemory, CopyMemory 
:(
    Опции темы
_DeMiUrG_
Дата 1.11.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 ...."
что посоветуйте?
PM MAIL   Вверх
bems
Дата 1.11.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



ошибка еще на BlockRead, хотя и CopyMemory это не то

Добавлено через 59 секунд
что такое XX?

Добавлено через 6 минут и 54 секунды
Код

for i:=0 to high(DynArray) do
 BlockRead(F,pbyte(DynArray[i])^,length(DynArray[i])*sizeof(DynArray[i,0]));

чтение примерно так


--------------------
Обижено школьников: 8
PM MAIL   Вверх
aktuba
Дата 1.11.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



Цитата(_DeMiUrG_ @  1.11.2007,  20:02 Найти цитируемый пост)
CopyMemory(@XX,@DynArray[i,i],4);

А чему равно i?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
bems
Дата 1.11.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(_DeMiUrG_ @  1.11.2007,  19:02 Найти цитируемый пост)
CopyMemory(@XX,@DynArray[i,i],4);
скопировать участок памяти влезающий в машинное слово можно и без вызова функции. Просто присвой.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
_DeMiUrG_
Дата 1.11.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



Цитата
А чему равно i?



правильней написать [i,j]
i равно номеру считываемого кадра
j номер параметра в этом кадре

в начале я считываю заголовок
в нем указано количество параметров и кадров

Цитата
ошибка еще на BlockRead, хотя и CopyMemory это не то

Добавлено через 59 секунд
что такое XX?

Добавлено через 6 минут и 54 секунды
Выделить всёкод Pascal/Delphi
1:
2:
    
for i:=0 to high(DynArray) do
 BlockRead(F,pbyte(DynArray[i])^,length(DynArray[i])*sizeof(DynArray[i,0]));

чтение примерно так


да и заголовок я считываю как одну структуру за 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
PM MAIL   Вверх
bems
Дата 1.11.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(_DeMiUrG_ @  1.11.2007,  21:09 Найти цитируемый пост)
CopyMemory(@X1,@DynArray[i,о],recordtype.type[j]);
так бы и говорил. у тебя в первом посте тупо четверка.



Цитата(_DeMiUrG_ @  1.11.2007,  21:09 Найти цитируемый пост)
смысл в том что я читаю значение массива
через BlockRead
так как показано в первом посте ты его не прочитаешь хотябы потому что sizeof(DynArray) всегда 4

Добавлено через 1 минуту и 55 секунд
на момент обращения к DynArray[i,о] одномерный DynArray[i] уже поврежден непрвильным чтением

Добавлено через 7 минут и 58 секунд
какой тип элемента DynArray? покажи описание recordtype.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
_DeMiUrG_
Дата 1.11.2007, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



Цитата
смысл в том что я читаю значение массива
через BlockReadтак как показано в первом посте ты его не прочитаешь хотябы потому что sizeof(DynArray) всегда 4


Цитата
на момент обращения к DynArray[i,о] одномерный DynArray[i] уже поврежден непрвильным чтением


Цитата
какой тип элемента DynArray? покажи описание recordtype.


в первом посте я указал
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 те основоной массив даных состоящий
из кадров и парометров см выше
PM MAIL   Вверх
bems
Дата 1.11.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(_DeMiUrG_ @  1.11.2007,  22:11 Найти цитируемый пост)
в первом посте я указал
DynArray:array of array of single;
SetLenght(DynArray,5,5);
я это видел. этот код не приводит к тому что переменная DynArray хранит 25 элементов друг за другом.
у тебя бОльшие проблемы чем кажется сразу

уясни:

динамический массив это указатель на блокпамяти хранящий элементы друг за другом

двумерный динамический массив это указатель на блок памяти хранящий указатели (друг за другом) на блоки памяти хранящие (друг за другом) элементы

Добавлено через 5 минут и 58 секунд
Цитата(_DeMiUrG_ @  1.11.2007,  19:02 Найти цитируемый пост)
BlockRead(F,DynArray,sizeof(DynArray));
так можно читать только такой массив
Код

StatArray:array [0..4] of array [0..4] of ...

но не такой
Цитата(_DeMiUrG_ @  1.11.2007,  22:11 Найти цитируемый пост)
DynArray:array of array of single;
SetLenght(DynArray,5,5);

записи это тоже касается
когда ты пишешь переменнюю типа динамический массив в файл то туда пападают 4 байта хранящие адрес первого элемента массива в памяти на момент записи. При чтении (с большой вероятностью) он уже не имеет никакого смысла.

SizeOf(DynArray) всегда 4, потому что в самой переменной нет содержимого массива


как тольковей объяснить я не знаю


--------------------
Обижено школьников: 8
PM MAIL   Вверх
_DeMiUrG_
Дата 2.11.2007, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



Цитата
записи это тоже касается
когда ты пишешь переменнюю типа динамический массив в файл то туда пападают 4 байта хранящие адрес первого элемента массива в памяти на момент записи. При чтении (с большой вероятностью) он уже не имеет никакого смысла.


значит так проясняю ситуацию дальше smile
файл который я считываю формирую не я он уже есть.
структура файла мне неизвстна, но есть рабочий код на VB
на который я ориенируюсь
так вот заголовок у файла считывается правильно.

да и когда я считвают элементы массива 
вот тут CopyMemory(@X1,@DynArray[i,j],recordtype.type[j]);

DynArray[i,j] равно в  трассировщике 
что то типа $147561000 <--- что то вроде этого

вы можете подсказать как считать этот дин массив?


PM MAIL   Вверх
Alix
Дата 2.11.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



тебе уже несколько раз сказали, что 
  • массив - это последовательность байтов [el1 el2 .. elN]
  • двумерный массив NxM - [el11 .. el1M el21 .. el2M .. .. elN1 .. elNM]
  • динамический массив A -    [A : pointer] --> [el1 .. elN]
  • динамический двумерный массив A : [A : pointer]  --->  [A1 : pointer, A2 : pointer, ..., AN : pointer] а каждый Ai --> [eli1 .. eliM]
когда ты считываешь в одномерный динамический массив, то все будет хорошо, т.к. он почти тоже самое что и одномерный "статический", а если в двумерный динамический - то это ошибка, т.к. они устроены по разному. Теперь понятно?


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
bems
Дата 2.11.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Alix @  2.11.2007,  12:36 Найти цитируемый пост)
когда ты считываешь в одномерный динамический массив, то все будет хорошо, т.к. он почти тоже самое что и одномерный "статический", 
это если помнить что @DynArray<>@DynArray[0] и для считывания пользоваться правой частью

Добавлено через 1 минуту и 34 секунды
Цитата(_DeMiUrG_ @  2.11.2007,  06:25 Найти цитируемый пост)
вы можете подсказать как считать этот дин массив?


Цитата(bems @  1.11.2007,  19:14 Найти цитируемый пост)
Добавлено через 6 минут и 54 секунды
for i:=0 to high(DynArray) do
 BlockRead(F,pbyte(DynArray[i])^,length(DynArray[i])*sizeof(DynArray[i,0]));
чтение примерно так 


Добавлено через 2 минуты и 15 секунд
Цитата(_DeMiUrG_ @  2.11.2007,  06:25 Найти цитируемый пост)
но есть рабочий код на VB
на который я ориенируюсь
покажи



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alix
Дата 2.11.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Цитата(bems @  2.11.2007,  17:59 Найти цитируемый пост)
это если помнить что @DynArray<>@DynArray[0] и для считывания пользоваться правой частью

разумеется


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
_DeMiUrG_
Дата 6.11.2007, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



Цитата(bems @  1.11.2007,  19:14 Найти цитируемый пост)
Добавлено через 6 минут и 54 секунды
for i:=0 to high(DynArray) do
 BlockRead(F,pbyte(DynArray[i])^,length(DynArray[i])*sizeof(DynArray[i,0]));
чтение примерно так 


Вы мне можете обьяснить DynArray -двумерный массив
вы бращаетесь к нему как к одномерному DynArray[i] так и должно быть?
PM MAIL   Вверх
Alix
Дата 6.11.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Цитата(_DeMiUrG_ @  6.11.2007,  06:49 Найти цитируемый пост)
Вы мне можете обьяснить DynArray -двумерный массив
вы бращаетесь к нему как к одномерному DynArray[i] так и должно быть? 

Дык в этом вся соль. Как рассказали выше, ты можешь писать в одномерный и статический и динамический, но вот сразу писать в двумерный динамический - нельзя, так он устроен. И поэтому в этом цикле мы пишем в каждую строку двумерного массива по отдельности, т.к. одна строка - это массив одномерный, то мы можем это позволить.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
bems
Дата 6.11.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(_DeMiUrG_ @  6.11.2007,  06:49 Найти цитируемый пост)
вы бращаетесь к нему как к одномерному DynArray[i] так и должно быть? 
с другой точки зрения это одномерный массив одномерных массивов



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1239 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.