![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как использовать только часть массива? [WinXP]
Kolan © (2006-06-05 13:33:00)Здравствуйте,
Проблема такая: У меня есть ф-ция для подсчета кс:
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
Сергей М. (2006-06-06 12:40:00) [1]
> 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 stackframe. Be careful not to overflow the stack by passing large arrays.
StriderMan (2006-06-06 12:37:00) [2]
> MBo
Ок. спасибо, буду учитывать.
MBo (2006-06-06 12:36:00) [3]>StriderMan © (06.06.06 12:25) [23]
Фактический передаваемый массив может и не с нуля нумероваться, но в процедуре он будет индексироваться с нуля.
Сергей М. (2006-06-06 12:31:00) [4]И то и другое.
Просто прими как факт.
StriderMan (2006-06-06 12:25:00) [5]Почитал. понял.
Хочу уточнить единственный момент:
They are always zero-based.
Это соглашениеили обязательное условие нормального функционирования процедуры с таким параметром?
Сергей М. (2006-06-06 12:16:00) [6]
> StriderMan © (06.06.06 12:13) [20]
Справка же есть ... не поленись почитать ..
см. "Open array parameters"
MBo (2006-06-06 12:16:00) [7]>StriderMan © (06.06.06 12:13) [20]
Open array parameters в справке
StriderMan (2006-06-06 12:13:00) [8]
> а именно открытый
Прошу прощения за невежество, но что значит "открытый"?
Сергей М. (2006-06-06 11:59:00) [9]
> StriderMan © (06.06.06 11:50) [18]
> чем длиннее контрольная сумма тем меньше вероятность случайного
> совпадения контрольных сумм для РАЗЛИЧНЫХ массивов.
Это не имеет отношения к вопросу.
Автор выбрал для хранения КС байт, значит везде, где у него в коде идет речь о КС, должен фигурировать байт.
> в смысле динамический?
Не динамический, а именно открытый. Это следует из декларации параметра Arr.
StriderMan (2006-06-06 11:50:00) [10]
> А зачем ? Байт - значит байт, слово - значит слово. К чему
> путаницу вносить ?
чем длиннее контрольная сумма тем меньше вероятность случайного совпадения контрольных сумм для РАЗЛИЧНЫХ массивов.
> Открытый всегда индексируется с нуля.
в смысле динамический? Так ведь процедура не знает что он динамический. Вобщем дело конечно за разработчиком, но ИМХО этот подход универсален. Всегда его использую.
Кстати этот подход очень удобен, в случае если массив индексирован перечислением
Сергей М. (2006-06-06 10:05:00) [11]
> StriderMan © (05.06.06 18:37) [13]
> почему бы и нет?
А зачем ? Байт - значит байт, слово - значит слово. К чему путаницу вносить ?
> мало ли с чего индексируется массив
Открытый всегда индексируется с нуля.
Kolan (2006-06-05 22:06:00) [12]
> Непонятны мне Ваши мытарства. Алгоритм формирования КС известен!
> !! Пусть ф-ция принимает весь массив...проверяет кс,по некоторому
> алгоритму и сверяет тут же.
Былобы всё так просто... :).
Тот несчастный массив сначала 3 объекта обрабатывают потом еще 2 выделяют из него части, считают и проверяют свои КС и еще с пяток переменных...
Все путем, работает. Благодарю за помошь и участие.
Просто флейм пошел уже....
Все выяснилось вKolan © (05.06.06 13:52) [7].
GanibalLector (2006-06-05 22:00:00) [13]2 Kolan ©
Непонятны мне Ваши мытарства. Алгоритм формирования КС известен!!! Пусть ф-ция принимает весь массив...проверяет кс,по некоторому алгоритму и сверяет тут же.
Черевато только заведением одной переменной, которую и нужно будет сравнивать с Arr[Length(Arr)-1].
Kolan (2006-06-05 21:18:00) [14]
> Сергей М. © (05.06.06 17:15) [12]
>
> проблема надумана
Нет. Просто есть 2 КС одна Byte другая Word. Скопировал не то случайно........
Все, все тема исчерпани, Всех благодарю.
StriderMan (2006-06-05 18:37:00) [15]
> Word; //почему Word, если КС представлена байтом ?
почему бы и нет?
> for i := 0 to Length(Arr) - 2 do
лучше так
for i := low(Arr) to high(Arr) - 1 do
мало ли с чего индексируется массив
Сергей М. (2006-06-05 17:15:00) [16]
> 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) - 2do
..
end;
Джо (2006-06-05 15:57:00) [17]А
Sliceне может? Сорри не читал тут все велосипеды...
Kolan (2006-06-05 15:49:00) [18]
> всегда нужно отбросить
Нет это не всегда так. Когда я счтиаю кс чтобы добавить и отослать массив, то при таком раскладе кс будет считаться неверно...
Благодарю проблема решена.
StriderMan (2006-06-05 15:37:00) [19]рекомендую в функции
EvalUserDataControlSumm
использовать такую конструкцию (если заранее известно что послений элемент массива всегда нужно отбросить). Навернякак ведь с массивом выполняется какой-то цикл
function EvalUserDataControlSumm(const AArr: array of Byte): Byte;
var
i: integer;
...
begin
for i := low(AArr) to high(AArr) - 1do
begin
//Здесь код вычисления контрольной суммы
end;
end;
MBo (2006-06-05 13:52:00) [20]Slice