Текущий архив: 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.51 MB
Время: 0.009 c