Модераторы: 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   Вверх
_DeMiUrG_
Дата 7.11.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообщем вот код на VB массив одномерный всетаки

Код

ReDim DigitByteArray(0 To TrfHeader.cadrl - 1)
  
  ReDim Graph1.DigitX(0 To MaxGraphParam1, 0 To TrfHeader.cadrn)
  ReDim Graph1.DigitY(0 To MaxGraphParam1, 0 To TrfHeader.cadrn)
  
  If Mid(FilePath, Len(FilePath), 1) = "\" Then
     Open FilePath & FileName For Binary As #1
  Else
     Open FilePath & "\" & FileName For Binary As #1
  End If
  
  flag = 0
  DataOff = 1 + 512 * (CLng(TrfHeader.func) + 1)
  
  K = 0
  M = 0
  
  Do While (1)
 
     K = M
     If K >= TrfHeader.cadrn - 1 Then
        K = TrfHeader.cadrn - 1
        flag = 1
     End If
     KadrOff = DataOff + K * CLng(TrfHeader.cadrl)
     Seek #1, KadrOff
     Get #1, , DigitByteArray
     
     For I = -1 To Text2.count - 1
        If I = -1 Then
          J = 1
        Else
          J = val(Text2(I).Text)
        End If
        Select Case User_Func(J).tag
          Case 1, 2
            Call CopyMemory(UserByte.Digit, DigitByteArray(User_Func(J).ofs), User_Func(J).tag)
            UserSingle.Digit = User_Func(J).ak + User_Func(J).vk * UserByte.Digit
          Case 4
            Call CopyMemory(UserSingle.Digit, DigitByteArray(User_Func(J).ofs), User_Func(J).tag)
          Case Else
            Call CopyMemory(UserVariant.Digit, DigitByteArray(User_Func(J).ofs), User_Func(J).tag)
            UserSingle.Digit = User_Func(J).ak + User_Func(J).vk * UserVariant.Digit
        End Select
        
        If I = -1 Then        
          FileTime = UserSingle.Digit
          If M = 0 Then UserMinTime = UserSingle.Digit
          If M = TrfHeader.cadrn - 1 Then UserMaxTime = UserSingle.Digit
        Else
          Graph1.DigitX(I, M) = FileTime - UserMinTime
          Graph1.DigitY(I, M) = UserSingle.Digit
        End If
        
     Next I
     M = M + 1
     If M > constMaxPoint Then
        M = constMaxPoint
        Exit Do
     End If
     If flag = 1 Then Exit Do
  Loop
  Close #1


я переделал вот а такой код 
но вот именно с CopyMemory траблы

Код

  SetLength(DigitByteArray,TrfHeader.cadrl);
  SetLength(Graph1.DigitX,MaxGraphParam1,TrfHeader.cadrn);
  SetLength(Graph1.DigitY,MaxGraphParam1,TrfHeader.cadrn);

  flag:= 0;
  DataOff:= 1 + 512 * (TrfHeader.func + 1);

  K:= 0;
  M:= 0;

assignFile( F,frmMain.OpenDialog1.FileName);
FileMode := 0;
reset( F );

Application.ProcessMessages;
  while not EOF(F) do
  begin
     K:= M;
     If (K >= TrfHeader.cadrn - 1) Then
     begin
        K:=TrfHeader.cadrn - 1;
        flag:=1;
     End;
     KadrOff:= DataOff + K * TrfHeader.cadrl;
     Seek(f,KadrOff);

  blockRead(F,DigitByteArray,sizeof(DigitByteArray));

 //   for i:=0 to high(DigitByteArray) do
// BlockRead(F,pbyte(DigitByteArray[i])^,sizeof(DigitByteArray[i]) );

Application.ProcessMessages;
     For I:= -1 To 13 do                 
      begin

       If (I=-1) Then J:=1  Else
       case I of
       0: J:=17; 1: J:=18; 2:J:=47;  3:J:=46;  4:J:=22;
       5:J:=23;  6:J:=61;  7:J:=62;  8:J:=12;  9:J:=19;
       10:J:=20; 11:J:=32; 12:J:=78; 13:J:=79; 14:J:=73;
        end;

     case User_Func[J].tag of
          1,2:
           begin
           CopyMemory(@UserByte.Digit, @DigitByteArray[User_Func[J].ofs], User_Func[J].tag);
           UserSingle.Digit:=User_Func[J].ak + User_Func[J].vk * UserByte.Digit;
           end;
          4:
          begin
           CopyMemory(@UserSingle.Digit,@DigitByteArray[User_Func[J].ofs],User_Func[J].tag);
          end;
          Else
          begin
            CopyMemory(@UserVariant.Digit, @DigitByteArray[User_Func[J].ofs], User_Func[J].tag);
            UserSingle.Digit:=User_Func[J].ak + User_Func[J].vk * UserVariant.Digit;
          end;  
        End;// Select

     
        If (I = -1) Then
        begin
          FileTime:= UserSingle.Digit;
          If (M = 0) Then UserMinTime:= UserSingle.Digit;
          If (M = TrfHeader.cadrn - 1) Then UserMaxTime:= UserSingle.Digit;
        end
        Else
        begin
          Graph1.DigitX[I, M]:= FileTime - UserMinTime;
          Graph1.DigitY[I, M]:= UserSingle.Digit;
        End;
     end; ///NEXT I

     M:= M + 1;
     If (M > constMaxPoint) Then
     begin
        M:=constMaxPoint;
        Exit;
     End;
     If (flag = 1) Then goto 1;// Do

 frmMain.Label1.Caption:=inttoStr(K + 1);
  end;//do Loop
1:
  closeFile( F ); //Close #1



PM MAIL   Вверх
bems
Дата 10.11.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(_DeMiUrG_ @  7.11.2007,  19:28 Найти цитируемый пост)
blockRead(F,DigitByteArray,sizeof(DigitByteArray));

 //   for i:=0 to high(DigitByteArray) do
// BlockRead(F,pbyte(DigitByteArray[i])^,sizeof(DigitByteArray[i]) );

замени на 
Код

BlockRead(F,DigitByteArray[0],SizeOf(DigitByteArray[0])*length(DigitByteArray));


Цитата(_DeMiUrG_ @  7.11.2007,  19:28 Найти цитируемый пост)
но вот именно с CopyMemory траблы

там их просто становиться заметно
После неправильного чтения массива выражение 
Код

@DigitByteArray[User_Func[J].ofs]
возвращает "мусорный" адрес, а CopyMemory в этой строке
Цитата(_DeMiUrG_ @  7.11.2007,  19:28 Найти цитируемый пост)
CopyMemory(@UserSingle.Digit,@DigitByteArray[User_Func[J].ofs],User_Func[J].tag);
вполне чесно пытается скопировать данные оттуда, куда ее не пускают. Поэтому ты замечаешь ошибку только в этой строке


Это сообщение отредактировал(а) bems - 10.11.2007, 18:03


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


Новичок



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

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



код на делфи работает но цифры считываются не те что на VB

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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