Изменения функции RQ_GetINTLIS
- rrrFer_
- Не в сети
- Junior Member
Меньше
Больше
- Сообщений: 38
- Спасибо получено: 0
13 года 4 мес. назад #1
от rrrFer_
rrrFer_ создал тему: Изменения функции RQ_GetINTLIS
Вобщем надо было использовать эту замечательную функцию...
Не знаю как она написана на delhpi, но на С++ очень ужасно.
Начиная от того, что она возвращает не INTLIST( т.к. размер списка возвращает отдельно, а не в первом элементе), заканчивая тем, что выбирая размер списка руководствуется не только тем что находится в первом элементе, но и размером всего пакета. Если в пакете после списка что-то было - то оно будет помещено в список.
В последнее верится с трудом, но посмотрите:
Вобщем исправил, и вот новый вариант:Более подробное описание тут: pro-blog.16mb.com/archives/280
Не знаю как она написана на delhpi, но на С++ очень ужасно.
Начиная от того, что она возвращает не INTLIST( т.к. размер списка возвращает отдельно, а не в первом элементе), заканчивая тем, что выбирая размер списка руководствуется не только тем что находится в первом элементе, но и размером всего пакета. Если в пакете после списка что-то было - то оно будет помещено в список.
В последнее верится с трудом, но посмотрите:
i = (iLen-*iPos)/4;
if (i>=iLLen) iLLen = i;
Вобщем исправил, и вот новый вариант:
DWORD RQ_GetINTLIST(BYTE * bArr, DWORD * iPos, DWORD iLen, int ** pList) {
INT iLLen;
if ( ( *iPos + 4 ) > iLen )
return 1;
memcpy( &iLLen, &bArr[ *iPos ], 4 );
*iPos += 4;
*pList = new int[ iLLen + 1];
memcpy( &pList[ 0 ][ 1 ], &bArr[ *iPos ], iLLen * 4 );
pList[ 0 ][ 0 ] = iLLen;
return 0;
}
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
Меньше
Больше
- Сообщений: 1995
- Спасибо получено: 35
13 года 4 мес. назад #2
от Rapid D
Rapid D ответил в теме RE: Изменения функции RQ_GetINTLIS
Трудно читать, не понимая, что такое iLen и iPos.и тем более, что такое iLLen
Возвращает она:
char(PM_DATA)+_intlist(cl.toIntArray)
И первым идёт именно длина массива:
function _intlist(a:array of integer):string;
begin result:=_int(length(a))+_int(a) end;
Что и как возвращается плагинам - вы можете смотреть в открытых исходниках.
Возвращает она:
char(PM_DATA)+_intlist(cl.toIntArray)
И первым идёт именно длина массива:
function _intlist(a:array of integer):string;
begin result:=_int(length(a))+_int(a) end;
Что и как возвращается плагинам - вы можете смотреть в открытых исходниках.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- rrrFer_
- Не в сети
- Junior Member
Меньше
Больше
- Сообщений: 38
- Спасибо получено: 0
13 года 4 мес. назад #3
от rrrFer_
rrrFer_ ответил в теме RE: Изменения функции RQ_GetINTLIS
Rapid D
Вы видимо о другой функции говорите? - я о той, которую вызывает плагин чтобы выделить INTLIST из байтового пакета, который пришел от клиента.
Изначально в miniSDK 4 версии для С++ она была описана так:
А _intlist, которую вы описали принимает массив целых чисел...это из исходников клиента? (я их не смотрел, т.к. Delphi мной удачно забыто )
iPos - позиция, начиная с которой надо выделить INTLIST
Вы видимо о другой функции говорите? - я о той, которую вызывает плагин чтобы выделить INTLIST из байтового пакета, который пришел от клиента.
Изначально в miniSDK 4 версии для С++ она была описана так:
DWORD RQ_GetINTLIST(BYTE * bArr, DWORD * iPos, DWORD iLen, DWORD * iListLen, int ** pList) {
DWORD iLLen,i;
if ((*iPos+4)>iLen) return 1;
memcpy(&iLLen,bArr+*iPos,4);
*iPos+=4;
i = (iLen-*iPos)/4;
if (i>=iLLen) iLLen = i;
*pList = (int*)(bArr+*iPos);
*iPos += iLLen*4;
*iListLen = iLLen;
return 0;
}
А _intlist, которую вы описали принимает массив целых чисел...это из исходников клиента? (я их не смотрел, т.к. Delphi мной удачно забыто )
iLen - длина байтового пакетаТрудно читать, не понимая, что такое iLen и iPos.
iPos - позиция, начиная с которой надо выделить INTLIST
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- rrrFer_
- Не в сети
- Junior Member
Меньше
Больше
- Сообщений: 38
- Спасибо получено: 0
13 года 4 мес. назад #4
от rrrFer_
rrrFer_ ответил в теме RE: Изменения функции RQ_GetINTLIS
еще раз исправил, решил, что удобнее, все таки возвращать размер массива отдельно:
DWORD RQ_GetINTLIST( BYTE * bArr, DWORD * iPos, DWORD iLen, int &iLLen, int ** pList ) {
if ( ( *iPos + INT_SIZE ) > iLen )
return 1;
memcpy( &iLLen, &bArr[ *iPos ], 4 );
*iPos += INT_SIZE;
*pList = new int[ iLLen ];
memcpy( &pList[ 0 ][ 0 ], &bArr[ *iPos ], iLLen * INT_SIZE );
*iPos += iLLen * INT_SIZE;
return 0;
}
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Модераторы: bass, vazooza, Delphuk, dek, Rapid D
Время создания страницы: 0.255 секунд