Отправлен: 15.02.2005, 21:27
Вопрос задал: Pupkin Vasiliy Ivanovich (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: AxMAD
Здравствуйте, Pupkin Vasiliy Ivanovich!
Ну если вы имеете в веду CRC32 то:
высчитываете CRCPOLY=0xEDB88320
строите таблицу или берёте готовую:
void crc32_create_table(void)
{
int i, j;
unsigned long t;
for (i = 0; i < 256; i++)
{
t = i;
for (j = 8; j > 0; j--)
{
if (t & 1)
t = (t >> 1) ^ CRCPOLY;
else
t >>= 1;
}
crc_table[i] = t;
}
}
А потом реализуете:
void crc32_calc(unsigned char *sz, unsigned long len, unsigned long *crc32)
{
unsigned long crc = *crc32;
unsigned char *t = sz;
while (len >= 8)
{
DO8(t);
len -= 8;
}
while (len--)
DO1(t);
*crc32 = crc;
}
// ------------------------------------------------------------
// calculate CRC32 of the string
//
unsigned long crc32_str(char *sz)
{
unsigned long crc = 0xFFFFFFFF;
crc32_calc((unsigned char *) sz, strlen(sz), &crc);
return ~crc;
}
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 16.02.2005, 09:16
Отвечает: vitya
Здравствуйте, Pupkin Vasiliy Ivanovich!
CRC32 любая другая односторонняя хэш функция
Ответ отправил: vitya (статус: Профессор)
Отправлен: 16.02.2005, 09:58
Отвечает: Voituk Alexander
Здравствуйте, Pupkin Vasiliy Ivanovich!
Смотря с какой целью ты хочешь это делать. Если просто проверить целостность блока данных при пересылке, например, то вполне подойдет обычная сумма всех данных. Для более крутой проверки можно к сумме добавлять перенос. Ну а если хочеться совсем круто проверить, то вообще для этого есть алгоритм MD5. Поищи в инете, там полно описания.
Ответ отправил: Voituk Alexander (статус: 2-ой класс)
Отправлен: 16.02.2005, 11:29
Вопрос № 17094
День добрый!!!!
не могу передать потоку параметр int
работает когда я объвляю его LPVOID - но это исключает дальнейшую работу с ним - а он у меня размерность массива, и в цикле не может выполнить проверку условий <, дальше хуже
ссылки указатели тоже перепробовала, сам передавать массив как параметр - а он у меня 2мерный, динамический - тогда ошибка и отказывается брать 3 или 6 парамертр в createthread...
например error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned int (void *)' to 'unsigned long (__stdcall *)(void *)'
ПОМОГИТЕ!!!!
Отправлен: 16.02.2005, 18:15
Вопрос задала: anca (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: AxMAD
Здравствуйте, anca!
Насколько я понял ваш вопрос вам следует создать глобальный массив и передавать в ветвь только указатель на него!
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 16.02.2005, 18:32
Отвечает: vitya
Здравствуйте, anca!
1. Спокойно
2. Опишите функцию потока, как WINAPI
2.1. return type должен быть DWORD
3. Чтобы передать int надо, при вызове написать (LPVOID)myint, внутри сделать int i = (int) pParam;
Ответ отправил: vitya (статус: Профессор)
Отправлен: 16.02.2005, 18:33
Отвечает: Voituk Alexander
Здравствуйте, anca!
Да очень просто. Насколько я понял ты хочешь передать 4 параметр, который у тебя int, в функцию CreateThread, где это параметр объявлен как LPVOID, т.е. указатель на void.
Ну и что. С++ прекрасно преобразует типы. При вызове функции нужно только явно преобразовать твой int в LPVOID - CreateThread(1 пар, 2 пар, 3 пар, (LPVOID)Твой_парам,...);
А потом его при работе преобразуешь так же в int:
int Xaxa = (int)Тот_параметр; и работай на здоровье.
Ответ отправил: Voituk Alexander (статус: 2-ой класс)
Отправлен: 17.02.2005, 12:40
Вопрос № 17095
Ув эксперты,есть вопрос.Как можно объявить динамический массив указателей?
Нужно считать файл строка за строкой и каждую строку присвоить элементу массива.
Заранее благодарен за ответ.
Отправлен: 16.02.2005, 18:28
Вопрос задал: Ling (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: vitya
Здравствуйте, Ling!
Решение находится в приложении. В стиле C++.
Приложение:
Ответ отправил: vitya (статус: Профессор)
Отправлен: 16.02.2005, 18:36
Отвечает: DiGiT
Здравствуйте, Ling!
vector<string> ? Читайте подробно доку по STL. Контейнер vector.
Это в принципе решение для с++, для С придется думать свои структуры данных.
Ответ отправил: DiGiT (статус: 6-ой класс)
Отправлен: 17.02.2005, 02:18
Отвечает: Voituk Alexander
Здравствуйте, Ling!
Да очень просто.
char **ch = new (char *)[128]; //Выделили память на 128 указателей на char
//теперь заполняем их
for(int i= 0;i < 128;i++)
{
char *buf = new char[LenStr]; //Выделяем память под строку файла
File->Read(buf,LenStr); //Читаем строку из файла
ch[i] = buf; //Запоминаем строку
}
//теперь в конце это все дело удаляем
for(int i = 0;i < 128;i++)
delete[] ch[i];
delete[] ch;
Ответ отправил: Voituk Alexander (статус: 2-ой класс)
Отправлен: 17.02.2005, 12:21