Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как использовать только часть массива? [WinXP]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо