Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.16;
Скачать: CL | DM;

Вниз

Как использовать только часть массива?   Найти похожие ветки 

 
Kolan ©   (2006-06-05 13:33) [0]

Здравствуйте,
 Проблема такая: У меня есть ф-ция для подсчета кс:
function TCustomProtocolManager.EvalUserDataControlSumm(
 Arr: array of Byte): Word;

Как видно ей надо передать массив байт.

Далее..
Я получаю массив байт последний из которых - кс. Прмер:
1 2 3 4 5 6 7 8 90 - пусть 90 - кс.
Чтобы проверить правильность кс мне нужно сравнить кс из полученного массива срасчетной. Те в ф-цию EvalUserDataControlSumm нужно передать массив БЕЗ песледнего элемента.

Как это сделать?

Есть вариант завести временный массив туда перекопиролвать всё кроме песледнего, я считаю это долго и ненужно.

Пробовал использовать Copy:

TheoryDataControlSumm := EvalUserDataControlSumm(Copy(UserData,
   Low(UserData), Length(UserData)-2));


Но:
[Pascal Error] KFreGrafDeviceSpecialProtocolManagers.pas(166): E2008 Incompatible types


 
tesseract ©   (2006-06-05 13:40) [1]

TempArr:Array of byte;

SetLength(TempArray,high(UserData)-1);
System.move(UserData,TempArray,high(UserData)-1);


Должно работать , но не проверял.


 
Kolan ©   (2006-06-05 13:41) [2]


> tesseract ©   (05.06.06 13:40) [1]

Без временного не обойтись?


 
Kolan ©   (2006-06-05 13:43) [3]

Как-то тип привести, чтобы он понял что это массив.


 
tesseract ©   (2006-06-05 13:44) [4]


> Без временного не обойтись?


А в чём проблема? Можно проще SetLenght(UserData,high(UserData)) - обрежеться последний символ.


 
Kolan ©   (2006-06-05 13:46) [5]

Нет портить массив нельзя.


 
Kolan ©   (2006-06-05 13:47) [6]


> А в чём проблема?

Проблемы то нет, лишняя переменная, может без нё можно..


 
Kolan ©   (2006-06-05 13:52) [7]

Всё, извеняюсь понял.
Массив UserData был передан в процедуру вот так:
procedure TKFreGrafReceiveProtocolManager.ProcessPackageData({..}
 UserData: array of Byte);


Поэтому Copy незнала, что он динамический и не могла сработать...

Благодарю за обсуждение.


 
MBo ©   (2006-06-05 13:52) [8]

Slice


 
StriderMan ©   (2006-06-05 15:37) [9]

рекомендую в функции
EvalUserDataControlSumm

использовать такую конструкцию (если заранее известно что послений элемент массива всегда нужно отбросить). Навернякак ведь с массивом выполняется какой-то цикл

function EvalUserDataControlSumm(const AArr: array of Byte): Byte;
var
 i: integer;
...
begin
for i := low(AArr) to high(AArr) - 1 do
 begin
    //Здесь код вычисления контрольной суммы
 end;
end;


 
Kolan ©   (2006-06-05 15:49) [10]


> всегда нужно отбросить


Нет это не всегда так. Когда я счтиаю кс чтобы добавить и отослать массив, то при таком раскладе кс будет считаться неверно...

Благодарю проблема решена.


 
Джо ©   (2006-06-05 15:57) [11]

А Slice не может? Сорри не читал тут все велосипеды...


 
Сергей М. ©   (2006-06-05 17:15) [12]


> Kolan ©   (05.06.06 13:33)


Судя по

> Я получаю массив байт последний из которых - кс. Прмер:
> 1 2 3 4 5 6 7 8 90 - пусть 90 - кс.


проблема надумана

При расчете КС переданного массива следует просто не учитывать последний байт:

function TCustomProtocolManager.EvalUserDataControlSumm(
Arr: array of Byte): Word; //почему Word, если КС представлена байтом ?
begin
 for i := 0 to Length(Arr) - 2 do
   ..
end;


 
StriderMan ©   (2006-06-05 18:37) [13]


> Word; //почему Word, если КС представлена байтом ?

почему бы и нет?

> for i := 0 to Length(Arr) - 2 do

лучше так
for i := low(Arr) to high(Arr) - 1 do
мало ли с чего индексируется массив


 
Kolan ©   (2006-06-05 21:18) [14]


> Сергей М. ©   (05.06.06 17:15) [12]
>
> проблема надумана

Нет. Просто есть 2 КС одна Byte другая Word. Скопировал не то случайно........
Все, все тема исчерпани, Всех благодарю.


 
GanibalLector ©   (2006-06-05 22:00) [15]

2 Kolan ©
Непонятны мне Ваши мытарства. Алгоритм формирования КС известен!!! Пусть ф-ция принимает весь массив...проверяет кс,по некоторому алгоритму и сверяет тут же.

Черевато только заведением одной переменной, которую и нужно будет сравнивать с Arr[Length(Arr)-1].


 
Kolan ©   (2006-06-05 22:06) [16]


> Непонятны мне Ваши мытарства. Алгоритм формирования КС известен!
> !! Пусть ф-ция принимает весь массив...проверяет кс,по некоторому
> алгоритму и сверяет тут же.

Былобы всё так просто... :).
Тот несчастный массив сначала 3 объекта обрабатывают потом еще 2 выделяют из него части, считают и проверяют свои КС и еще с пяток переменных...

Все путем, работает. Благодарю за помошь и участие.
Просто флейм пошел уже....
Все выяснилось в Kolan ©   (05.06.06 13:52) [7].


 
Сергей М. ©   (2006-06-06 10:05) [17]


> StriderMan ©   (05.06.06 18:37) [13]
> почему бы и нет?


А зачем ? Байт - значит байт, слово - значит слово. К чему путаницу вносить ?


> мало ли с чего индексируется массив


Открытый всегда индексируется с нуля.


 
StriderMan ©   (2006-06-06 11:50) [18]


> А зачем ? Байт - значит байт, слово - значит слово. К чему
> путаницу вносить ?

чем длиннее контрольная сумма тем меньше вероятность случайного совпадения контрольных сумм для РАЗЛИЧНЫХ массивов.

> Открытый всегда индексируется с нуля.

в смысле динамический? Так ведь процедура не знает что он динамический. Вобщем дело конечно за разработчиком, но ИМХО этот подход универсален. Всегда его использую.

Кстати этот подход очень удобен, в случае если массив индексирован перечислением


 
Сергей М. ©   (2006-06-06 11:59) [19]


> StriderMan ©   (06.06.06 11:50) [18]



> чем длиннее контрольная сумма тем меньше вероятность случайного
> совпадения контрольных сумм для РАЗЛИЧНЫХ массивов.


Это не имеет отношения к вопросу.
Автор выбрал для хранения КС байт, значит везде, где у него в коде идет речь о КС, должен фигурировать байт.


> в смысле динамический?


Не динамический, а именно открытый. Это следует из декларации параметра Arr.


 
StriderMan ©   (2006-06-06 12:13) [20]


> а именно открытый

Прошу прощения за невежество, но что значит "открытый"?


 
MBo ©   (2006-06-06 12:16) [21]

>StriderMan ©   (06.06.06 12:13) [20]
Open array parameters в справке


 
Сергей М. ©   (2006-06-06 12:16) [22]


> StriderMan ©   (06.06.06 12:13) [20]


Справка же есть ... не поленись почитать  ..

см. "Open array parameters"


 
StriderMan ©   (2006-06-06 12:25) [23]

Почитал. понял.
Хочу уточнить единственный момент:

They are always zero-based.

Это соглашение или обязательное условие нормального функционирования  процедуры с таким параметром?


 
Сергей М. ©   (2006-06-06 12:31) [24]

И то и другое.

Просто прими как факт.


 
MBo ©   (2006-06-06 12:36) [25]

>StriderMan ©   (06.06.06 12:25) [23]
Фактический передаваемый массив может и не с нуля нумероваться, но в процедуре он будет индексироваться с нуля.


 
StriderMan ©   (2006-06-06 12:37) [26]


> MBo

Ок. спасибо, буду учитывать.


 
Сергей М. ©   (2006-06-06 12:40) [27]


> Kolan


Кстати, с открытым массивом в кач-ве параметра ты можешь наступить на грабли.

Цитата из справки :

When you pass an array as an open array value parameter, the compiler creates a local copy of the array within the routine"s stack frame. Be careful not to overflow the stack by passing large arrays.



Страницы: 1 вся ветка

Текущий архив: 2006.07.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.035 c
2-1151493908
shart
2006-06-28 15:25
2006.07.16
Как послать сообщение клиенту (Indy 9, Tcp)


2-1151409152
dest81
2006-06-27 15:52
2006.07.16
Тонкий клиент


3-1147422894
Patrick
2006-05-12 12:34
2006.07.16
Добавление в таблицу из XML-документа


15-1150144664
Константинов
2006-06-13 00:37
2006.07.16
Как отстоять право на чистый воздух?


2-1151489711
0bsid
2006-06-28 14:15
2006.07.16
фокус ввода