Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU
(Тестовый режим)

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 45
от 21.02.2005, 18:30

Администратор:Калашников О.А.
В номере:Вопросов: 3, Ответов: 9


Вопрос № 17058
Здравствуйте, ув. эксперты.
Скажите, пожалуйста, какой-нибудь алгоритм подсчета контрольной суммы блока данных.
Отправлен: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, Россия, Москва. Идея, дизайн, программирование: Калашников О.А.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться

В избранное