Форум программистов, компьютерный форум CyberForum.ru

прога странно работает=) кому интересно покопать? - C++

Восстановить пароль Регистрация
 
Акелла
Сонный металюга
 Аватар для Акелла
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
10.05.2009, 17:24     прога странно работает=) кому интересно покопать? #1
написал прогу по подсчету crc-16 (сама функция с википедии).. так вот... когда скармливаю файл (текстовыми кормлю) на несоклько килобайт (1 - 50-100 примерно) - вроде корректно работает... как только объем начинает приближатсья к полуметру и выше - косячит - в лучшем случае вылетает... в чем у меня ошибка?
П.С. -наплодил переменных потмоу что когда значения счетчиков доходят до определнного момента -они то ли сдвигают друг друга то ли что....

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
 
/*
  Name  : CRC-16
  Poly  : 0x18005   x^16 + x^15 + x^2 + 1
  Init  : 0x0000
  Revert: true
  XorOut: 0x0000
  Check : 0x4B37 ("123456789")
  MaxLen: 4095 байт (32767 бит)*/
const unsigned short Crc16Table[256] = {
    0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
    0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
    0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
    0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
    0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
    0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
    0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
    0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
    0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
    0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
    0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
    0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
    0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
    0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
    0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
    0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
    0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
    0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
    0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
    0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
    0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
    0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
    0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
    0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
    0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
    0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
    0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
    0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
    0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
    0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
    0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
    0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};
 
unsigned short Crc16(unsigned char * pcBlock, long long len);
 
main()
{
    clrscr();
    long long int i, len=0,len2=0,a=0;
    FILE *secret;
    unsigned char filename[256];
    unsigned char *str = NULL;
    char ch;
    for(i=0;i<256;i++)
    {
        filename[i]=NULL;
    }
    printf("\n\tGood Day! It is CRC-16 Programm\n");
    printf("\n\tEnter name of file: ");
    gets(filename);
    while((secret = fopen(filename, "rt"))== NULL)
    {
        fprintf(stderr, "\tError:Cannot open input file.\n");
        for(i=0;i<256;i++)
        {
            filename[i]=NULL;
        }
        printf("\n\tEnter name of file: ");
        gets(filename);
    }
    i=0;
    while(!feof(secret))
    {
        ch=fgetc(secret);
        i++;
    }
    len=i;
    len2=len;
    rewind(secret);
    str = (unsigned char *) calloc(len, sizeof(char));
 
    for(a=0;a<len;a++)
    {
        str[i]=NULL;
    }
    ch=a=0;
    i=0;
    while(!feof(secret))
    {
         if(a>=len)printf("\n\tError:something wrong with file\n");
         else
         {
        str[a]=fgetc(secret);
        a++;
         }
    }
    rewind(secret);
    printf("\n\tCRC = 0x%X\n", Crc16(str, len-1));
    printf("\n\tPress eny key to exit programm");
 
    fclose(secret);
    free(str);
    getch();
    return(0);
 
}
unsigned short Crc16(unsigned char * pcBlock,  long long len)
{
    unsigned short crc = 0;
 
    while (len>0)
    {
    crc = (crc >> 8) ^ Crc16Table[(crc & 0xFF) ^ *pcBlock++];
        len--;
    }
    
    return crc;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2009, 17:24     прога странно работает=) кому интересно покопать?
Посмотрите здесь:

C++ Почему так странно работает калькулятор
В чем интересно загвоздка???интересно разобраться! C++
C++ Бинарные деревья ! кому интересно , сюда!;)
С++ debian - программа работает странно C++
C++ insert работает как-то странно
C++ Работаю с файлом *.txt. Прога ведет себя странно если последняя строка файла пуста. Почему так?
Шифрование "Лозунговым методом" (кому интересно) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
11.05.2009, 00:55     прога странно работает=) кому интересно покопать? #2
Действительно странно:
[Vourhey@Vhost C]$ ./a.out

Good Day! It is CRC-16 Programm

Enter name of file: ../../Download/Video.mp4
Error:Cannot open input file.

Enter name of file: ../../Download/video.mp4

CRC = 0xB6A

Press eny key to exit programm[Vourhey@Vhost C]$
[Vourhey@Vhost C]$ ./a.out

Good Day! It is CRC-16 Programm

Enter name of file: main.c

CRC = 0x76EC

Segmentation fault
Видео-файл большой, main.c напротив - код твоей проги. Ну в данном случае он на free, наверное, вылетает. Разбираться в коде мне влом, спать хочу, но что, например, это:
str[i]=NULL;
?
Разве, NULL не для указателей?
Вот...а еще хорошо бы, чтобы ты показал тем, кто будет читать, как именно она косячит на больших файлах. Ожидаемый результат, получаемый результат.
Акелла
Сонный металюга
 Аватар для Акелла
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
11.05.2009, 08:55  [ТС]     прога странно работает=) кому интересно покопать? #3
так, косячит она по разному... ну... ожидаемый результат на выходе - значение CRC для этого файла.... на больших она:

1.или выдает неправильное значение ( почему то не доходит до конца файла - принимая в нем какое то место за конец - каждый раз разное - я не знаю чт оможет быть с функцией feof())

2.либо не выдает значение вообще - тут я проходился вотчем -смотрел - прога правильно вычисляет длинну файла, но потом когда по этой длинне она забивает в динамический массив значения, она опять проходит не весь файл (примерно до середины - хз) или в строчке if(a>=len)printf("\n\tError:something wrong with file\n");
переменная а с чего то "улетает" в значениях и пишет эту ошибку.. так или иначе - не наберя всех значений в массив, она не заходит в функцию crc -просто игнорируя ее и зависает...

повторюсь что на маленьких файлах прога работеает адекватно и правильно.

и еще - почему то у нее значения счетчиков бывают вылезают совсем бредовые (как в случае с а).. но я так думаю что из за больших значений там что то в памяти происходит - вот для этого у меня знаний и опыта и не хватает
radiohobbyt
 Аватар для radiohobbyt
192 / 190 / 4
Регистрация: 27.01.2009
Сообщений: 548
11.05.2009, 09:54     прога странно работает=) кому интересно покопать? #4
итак...внимательно смотрим на функцию...и видим
MaxLen: 4095 байт (32767 бит)*/
это говорит о том, что CRC уже может и соврать при ваших сотнях килобайтов. то есть возможно, что единичная ошибка не будет обнаружена...

а по делу...

for(a=0;a<len;a++)
{
str[i]=NULL;
}
обращаешься за пределы массива..ибо i=len... надо str[a]=0;
Акелла
Сонный металюга
 Аватар для Акелла
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
11.05.2009, 10:01  [ТС]     прога странно работает=) кому интересно покопать? #5
опа=)) спалилсо=))) глупая на самом деле ошибка, спс

Добавлено через 4 минуты 27 секунд
а еще ошибки?
radiohobbyt
 Аватар для radiohobbyt
192 / 190 / 4
Регистрация: 27.01.2009
Сообщений: 548
11.05.2009, 10:22     прога странно работает=) кому интересно покопать? #6
printf("\n\tCRC = 0x%X\n", Crc16(str, len-1));
CRC берешь не от всего массива...надо len, а не len-1
ну и хватит...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16937 / 5342 / 328
Регистрация: 30.03.2009
Сообщений: 14,366
Записей в блоге: 26
11.05.2009, 11:39     прога странно работает=) кому интересно покопать? #7
Если запускаешь под виндой, то проблема будет в том, как ты открываешь файл. В fopen ты подаёшь "rt" (кстати, что такое t?). Нужно "rb". Без b последовательность "\r\n" будет чиатться как один символ "\n"

Цикл после calloc, который не понравился Vourhey, вообще не в кассу. Calloc память и так зануляет. Что ты этим циклом хотел сделать?

Добавлено через 6 минут 11 секунд
И вообще зачем память занулять, если ты туда потом файл перепишешь?
Акелла
Сонный металюга
 Аватар для Акелла
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
11.05.2009, 13:40  [ТС]     прога странно работает=) кому интересно покопать? #8
Цитата Сообщение от radiohobbyt Посмотреть сообщение
printf("\n\tCRC = 0x%X\n", Crc16(str, len-1));
CRC берешь не от всего массива...надо len, а не len-1
потому что мне не нужен символ конца строки который туда дописываеться=)

Добавлено через 54 секунды
если поставить просто len - он считает неправильно, проверял
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16937 / 5342 / 328
Регистрация: 30.03.2009
Сообщений: 14,366
Записей в блоге: 26
11.05.2009, 16:21     прога странно работает=) кому интересно покопать? #9
Цитата Сообщение от Акелла Посмотреть сообщение
потому что мне не нужен символ конца строки который туда дописываеться=)

Добавлено через 54 секунды
если поставить просто len - он считает неправильно, проверял
Просто это следствие твоего механизма побайтного чтения. В твоём варианте цикл пробегает на одну итерацию больше, чем число байтов в файле

C
1
2
3
4
5
while(!feof(secret))
{
    ch=fgetc(secret);
    i++;
}
более правильно было бы написать

C
1
2
3
int ch; // <----------------- именно int, а не char
while((ch=fgetc(secret)) != EOF)
  i++;
А вообще, чтобы посмотреть размер файла, используй стандартную функцию stat
radiohobbyt
 Аватар для radiohobbyt
192 / 190 / 4
Регистрация: 27.01.2009
Сообщений: 548
11.05.2009, 16:49     прога странно работает=) кому интересно покопать? #10
Цитата Сообщение от Акелла Посмотреть сообщение
потому что мне не нужен символ конца строки который туда дописываеться=)
не знаю о поставленной задаче...но! зачем нужен CRC? чтобы обнаруживать ошибки! а ошибка может быть везде. в любом месте...но это так...более философская мысль=)

Добавлено через 4 минуты 55 секунд
Цитата Сообщение от Акелла Посмотреть сообщение
потому что мне не нужен символ конца строки который туда дописываеться=)
не знаю о поставленной задаче...но! зачем нужен CRC? чтобы обнаруживать ошибки! а ошибка может быть везде. в любом месте...но это так...более философская мысль=)


все...понял..ошибаюся, но как-то так и не понял как удалить все...
Акелла
Сонный металюга
 Аватар для Акелла
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
11.05.2009, 16:50  [ТС]     прога странно работает=) кому интересно покопать? #11
=)) нет, crc нужен чтобы проверять целостность потока данных..... при отправке получении.. короче препод далв универе лабу - что мне еще остаеться -реализовываем=)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16937 / 5342 / 328
Регистрация: 30.03.2009
Сообщений: 14,366
Записей в блоге: 26
11.05.2009, 17:31     прога странно работает=) кому интересно покопать? #12
Цитата Сообщение от radiohobbyt Посмотреть сообщение
зачем нужен CRC? чтобы обнаруживать ошибки!
Скажем так, изначально контрольные суммы появились для проверки того, что программа без ошибок загружена с магнитной ленты, передана по сети и т.п.

Сейчас есть дополнительное применение - защита дистрибутивов от ручных правок в коде. Т.е. есть у тебя дистрибутив программы, а с ней разработчик помещает контрольную сумму (которую, условно говоря, пишут на листочке). Далее у тебя есть копия этой программы. Ты запускаешь и проверяешь, что контрольная сумма совпадает. Если хакеры своими ручками что-то попытаются вставить в код программы, то контрольная сумма начинает уплывать (т.е. перестаёт совпадать с тем, что публикует разработчик). Правда для целе защиты используют что-то типа md5, где более сложно нахимичить с файлом так, чтобы контрольная сумма совпала
Акелла
Сонный металюга
 Аватар для Акелла
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
11.05.2009, 17:34  [ТС]     прога странно работает=) кому интересно покопать? #13
ну, мне можешь это не объяснять=))) рз я это реализую -значит знаю что и для чего... и не тока в дистрибутивах -архиваторы тоже используют..
вот например если винрар выдает что неожиданный конец архива (скачанного) -значит какт о не так скачал... ибо контр сумма передаеться вместе с архивом
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2009, 17:52     прога странно работает=) кому интересно покопать?
Еще ссылки по теме:

Есть структура, работает, но странно сравнивает( C++
Странно работает класс C++
C++ Кому интересно поломать голову
C++ Кому интересно. Покер
C++ Странно работает перегрузка оператора

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16937 / 5342 / 328
Регистрация: 30.03.2009
Сообщений: 14,366
Записей в блоге: 26
11.05.2009, 17:52     прога странно работает=) кому интересно покопать? #14
Лишний раз объяснить не помешает. Кому-нибудь может оказаться полезным
Yandex
Объявления
11.05.2009, 17:52     прога странно работает=) кому интересно покопать?
Ответ Создать тему
Опции темы

Текущее время: 13:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru