Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2016, 19:15   #1
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию Надо передать в функцию массив байт, как массив dword-ов.

У меня есть массив с байтами. И функция, которая работает с массивом DWORD-ов. По сути это один и тот-же массив. Но вместо того, чтобы передать массив напрямую в функцию Calk, мне приходится его преобразовывать в массив DWord-ов. В принципе код не очень большой. Но как-то это некрасиво. Да и память лишнюю расходуем. Интересует, можно-ли сделать приведение одного типа массива в другой, какой-то функцией. Ведь в памяти процесса массивы все равно получаются одинаковые.

Код:
Function Convert(var MB: Array Of Byte; var MD: Array Of DWord):Boolean;
begin
  for i:=0 to (SizeOf(MB)shr 2) do
    MD[i]:= (MB[i*4+3]shl 24) or (MB[i*4+2])shl 16) or (MB[i*4+1]shl 8)or MB[i*4];
end;

Function Calk(var MD: Array Of DWord):Boolean;
begin
  // Тут уже обрабатываем массив DWord-ов.
end;


var 
  MassB : Array Of Byte;
  MassD : Array Of DWord;
begin
  A:= Convert(MassB, MassD);
  ............................
  B:= Calk(MassD);
end;

Последний раз редактировалось Kuzya69; 27.07.2016 в 19:23.
Kuzya69 вне форума Ответить с цитированием
Старый 27.07.2016, 19:35   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Интересует, можно-ли сделать приведение одного типа массива в другой, какой-то функцией.
не уверен, но мне кажется, что не получится. динамический массив - это указатель на специальную структуру, там и размер хранится и количество элементов и прочая служебная информация, очевидно, что для разных массивов она разная.


Цитата:
Но вместо того, чтобы передать массив напрямую в функцию Calk
а нельзя переписать Calk так, чтобы она работала с массивом byte, читая по два байта (ну, так, как Вы написали в вашем Convert)?


p.s. почему-то не увидел в вашем примере SetLength() для обоих массивов.
Вы этот код опустили для упрощения?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.07.2016, 19:48   #3
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
не уверен, но мне кажется, что не получится...
Жаль, что нет таких функций. По сути можно конечно и без математических операций преобразовать, напрямую считав из памяти процесса массив байт, как массив dwor-ов. Но опять-же получим два одинаковых массива в памяти, а вдруг их размер будет ОООООчень большим.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а нельзя переписать Calk...?
Можно, уже вставил функцию вычитывающую из массива байт dword-ы. В принципе работает. Интересует вопрос именно с приведением типов. Все-таки быстродействие повысится, без выполнения лишних операций.


Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
...Вы этот код опустили для упрощения?
Да я много чего опустил, чтоб не засорять вопрос ненужными операторами.

PS
Тут посетила мысль, а что если присвоить указатель на массив байт, указателю на массив dword-ов? Прокатит такое?

Последний раз редактировалось Kuzya69; 27.07.2016 в 19:53.
Kuzya69 вне форума Ответить с цитированием
Старый 27.07.2016, 20:05   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
а что если присвоить указатель на массив байт, указателю на массив dword-ов? Прокатит такое?
если бы был статический массив и указатель на него, то да, прокатило бы.
А указатель на динамический массив указывает не на данные, а на управляющую структуру. Если не ошибаюсь, то в книге Стив Тейксейра, Ксавье Пачеко есть описание этой структуры.

Цитата:
В принципе работает. Интересует вопрос именно с приведением типов. Все-таки быстродействие повысится, без выполнения лишних операций.
работает и это главное!
Не думаю, что быстродействие сильно повысится - по сути там у Вас всего одна/две команды преобразования байт в DWORD.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.07.2016, 21:28   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Есть директива absolute, есть указатели.

Код:
// Указательные массивы
type
 TAByte=array [0..65536] of Byte;
 PAByte=^TAByte;
 TAShortInt=array [0..65536] of ShortInt;
 PAShortInt=^TAShortInt;

 TAWord=array [0..65536] of Word;
 PAWord=^TAWord;
 TASmallint=array [0..65536] of Smallint;
 PASmallint=^TASmallint;
 TADWord=array [0..65536] of DWord;
 PADWord=^TADWord;
 TAInt=array [0..65536] of Integer;
 PAInt=^TAInt;

Function Calk(const N:Integer; var MD: PADWord; b:Integer):Boolean;
var i:Integer;
begin
  // Тут уже обрабатываем массив DWord-ов.
 // Используем автоматическое разиминовывание. Т.е "^" можно неписать
if (MD<> nil) then
 for i:= 0 To N-1 do MD[i]:=MD[i]*b;
end;

var 
  MassB : Array Of Byte;
  MassD : PADWord;
begin
  MassD:=PADWord(@MassB[0]);
  ............................
  B:= Calk(length(MassB) div 4, MassD,10);
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 27.07.2016, 22:23   #6
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Есть директива absolute, есть указатели.
Дык у меня динамические массивы, а у вас статические. К динамическим ваши утверждения подходят?
Kuzya69 вне форума Ответить с цитированием
Старый 27.07.2016, 22:35   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Дык у меня динамические массивы, а у вас статические. К динамическим ваши утверждения подходят?
Тут не статические массивы, а указательные. Размер массива не влияет и выход за приделы диапазона не проверяется. И применяю я его к динамическим массивам.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 30.07.2016, 01:27   #8
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

"Чего-то не выходит каменный цветок, Данила-мастер."
Это из анекдота.
Я написал такое:
Код:
type 
  TADWord = Array Of Byte;
  PADWord = ^TADWord;
Function Decoder(var MD:PADword; Size:Dword):Boolean;
var i:= Integer;
begin
  Result:= False;
  for i:=0 to (Size-1) do MD[i]:= MD[i] .........;
  .......
  Result:= True;
end;
Еще не писАл код, который будет юзать эту функцию.
Но компиллятор уже ругается на MD[i]
"[DCC Error] MyLib.dll(): E2016 Array type required"
Что я упустил?

Если описать так:
TADWord=array [0..65536] of DWord;
То компиллятор молчит. Так как все-таки втащить в прогу динамический массив?
Kuzya69 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как методу передать массив байт vovken1997 Общие вопросы C/C++ 6 08.07.2013 20:57
Дан массив из 9 байт расматривая его как массив 72 бит подсчитать число нулей в этом массиве. noob asm Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 16.04.2012 19:04
как можно передать массив по ссылке в функцию в java? videolord Общие вопросы по Java, Java SE, Kotlin 1 03.11.2011 18:21
Как передать Динамический массив в функцию? RainCat Помощь студентам 4 13.04.2011 11:25
Как конвертировать массив символов в массив байт davinci C++ Builder 6 30.10.2010 18:09