Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
15-1150365896
DillerXX
2006-06-15 14:04
2006.07.16
У вас работает ICQ?


2-1151153327
K_Lock
2006-06-24 16:48
2006.07.16
QuickReport


15-1150266173
Layner
2006-06-14 10:22
2006.07.16
Бесплатные статистические компоненты, есть ли такие?


3-1147620877
nopox
2006-05-14 19:34
2006.07.16
Error creating cursor handle-Уважаемые, подскажите,


15-1150688558
Kerk
2006-06-19 07:42
2006.07.16
Что такое FireBird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский