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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
#1

очень интересный баг - C++

30.07.2009, 17:42. Просмотров 1715. Ответов 14
Метки нет (Все метки)

Если кто-нибудь догадается в чем ошибка, то скажите. Ошибку я уже исправил, но не знаю, почему не работает этот код:
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
#include <iostream>
#include <conio.h>
 
int CompareFaceStat(char mass[100], char mass1[100]) {
    int count=0;
    for(int i=0;i<100;i++)
    {
        if(mass[i]>>6==mass1[i]>>6) count++;
        if(mass[i] << 2 >> 6==mass1[i] << 2 >> 6) count++;
        if(mass[i] << 4 >> 6==mass1[i] << 4 >> 6) count++;
        if(mass[i] << 6 >> 6==mass1[i] << 6 >> 6) count++;
    }
    return count;
}
 
 
int MultiCompareFaceStat(char RecordDB[2004], char mass[100])
{
    int count1=0;
    char mass1[100];
    int compareOld=0;
    int compareNew=0;
    count1|=((int)RecordDB[0])<<24;
    count1|=((int)RecordDB[1])<<16;
    count1|=((int)RecordDB[2])<<8;
    count1|=((int)RecordDB[3]);
    for(int i=0;i<count1;i++)
    {
        strncat(mass1,(RecordDB+i*100+4),100);
        compareNew=CompareFaceStat(mass,mass1);
        if(compareOld<compareNew) compareOld=compareNew;
    }
    return compareOld;
}
void wmain()
{
    char mass1[2004];
    char mass[100];
    mass1[0]=0;
    mass1[1]=0;
    mass1[2]=0;
    mass1[3]=20;
    for(int i=4;i<2004;i++)
    {
        mass1[i]=19;
    }
    for(int i=0;i<100;i++)
        mass[i]=14;
    std::cout<<sizeof(char)<<std::endl;
    getch();
    int c=MultiCompareFaceStat(mass1,mass);
    std::cout<<c<<std::endl<<mass1[0]<<mass1[1]<<mass1[2]<<mass[3]<<std::endl;
 
    getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2009, 17:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос очень интересный баг (C++):

Баг asio? или баг TCP стека? - C++
всем привет. повстречался с очень странным багом. и не могу определить кто бажит, asio, или TCP-стек. на стороне клиента,...

Интересный пример оптимизации - C++
Привет! Копаясь в OpenJDK наткнулся на довольно интересный подход (оптимизацию). Решил поделиться, кому-то может быть полезно в плане...

Я по по воду хакерства.В последнее время это меня очень сильно заинтересовало может посоветуете чего нибудь(книги,программы и тд ) буду очень благодар - C++
Прошу прощения , но я не нашел подходящей темы и решил написать сюда т.к. единственное что я знаю это С++ и то плоховато)) вы наверное...

Непонятный баг - C++
Пишу программу на Си++ с использованием Qt и FMOD. Вот место, где глючит (тут только куски кода, не весь): void...

Устал искать баг - C++
Проблемма проста - нужно удалить из вещественной матрицы строку и столбец, верней ряд строк и столбцов (условие - нулевой элемент на...

Баг в MinGW при использовании fread - C++
Ну собственно вот простой тестовый код который выполняется некорректно: #include &lt;cstdio&gt; using namespace std; const int N =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 17:53 #2
Цитата Сообщение от Poleno Посмотреть сообщение
. Ошибку я уже исправил, но не знаю, почему не работает этот код:
а почему он должен работать?
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
30.07.2009, 18:06  [ТС] #3
Код должен работать. Ошибка вылетает при выполнении. Указатель на mass в функции MultiCompareFaceStat становится плохим после выполнения функции копирования строки. Но почему так происходит я даже не представляю.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 18:19 #4
Цитата Сообщение от Poleno Посмотреть сообщение
Указатель на mass в функции MultiCompareFaceStat становится плохим после выполнения функции копирования строки
что значит "плохим"? ясное дело, что в указатель копируется "кака".

Добавлено через 9 минут 18 секунд
Цитата Сообщение от Poleno Посмотреть сообщение
char mass1[2004];
char mass[100];
очень плохие имена. вы легко можете спутать mass1 и mass.
назовите их barby и ken
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
30.07.2009, 19:21  [ТС] #5
И еще. Небольшая просьба. Я сам опытный разработчик на C++. Не первый год им занимаюсь. Поэтому не надо учить меня, как и что делать. Если вам не так сложно, или просто интересно(как и мне) то посмотрите, что здесь неправильно. Потому что сам код выглядит абсолютно нормальным и без ошибок. А почему-то не работает. Я его уже у себя в офисе показывал - все раскрывают глаза и не понимают, что не так.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 22:01 #6
Цитата Сообщение от Poleno Посмотреть сообщение
Я сам опытный разработчик на C++. Не первый год им занимаюсь. Поэтому не надо учить меня, как и что делать.
без комментариев. опытный разработчик...
по коду не скажешь...
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
30.07.2009, 22:03  [ТС] #7
А можешь просто написать в чем ошибка - т.е. ответить на мой изначальный вопрос? Флудить все умеют. Если скажешь правильный ответ от меня большая благодарность. Правда, не денежная.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
30.07.2009, 22:13 #8
я сейчас сериал смотрю. не могу отвлекаться. если завтра будет свободное время - посмотрю ваш чудо-код.
***
кстати, что он должен делать?
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
30.07.2009, 22:40  [ТС] #9
Да, это правильно. Но не знаешь, случаем, почему после выполнения этой операции strncat(mass1,(RecordDB+i*100+4),100); массив mass начинает ссылаться на совершенно другую область памяти (в информации при отладке пишет bad pointer - плохой указатель). Насколько я понимаю, в этой строке массива mass нет вообще, а тем не менее, адрес его меняется после выполнения этой строки. Я просто в недоумении.

Добавлено через 22 минуты 1 секунду
Этот код должен считать количество совпадений пар битов. Т.е. для дыух чисел 10 10 00 10 и 10 10 01 10 это будет три. Там он ищет количество совпадений в 20 записях по 100 байт каждая.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
31.07.2009, 00:00 #10
Цитата Сообщение от Poleno Посмотреть сообщение
Указатель на mass в функции MultiCompareFaceStat становится плохим после выполнения функции копирования строки. Но почему так происходит я даже не представляю.
Где "опытный разработчик на C++" видит функцию копирования строки??? Я - не вижу. Даже под микроскопом.
А диагноз простой: в функции MultiCompareFaceStat ты элементарно сразу же вылезаешь за границу автоматического массива mass1 и тупо портишь стек. Все. И это вскрывается сразу же - вероятно, уже при второй попытке записи. Ровным счетом ничего интересного в этой ошибке нет.
Интереса для можешь посмотреть это все в отладчике.
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
31.07.2009, 00:07 #11
Цитата Сообщение от Poleno Посмотреть сообщение
Я сам опытный разработчик на C++. Не первый год им занимаюсь. Поэтому не надо учить меня, как и что делать.


Открой для себя дебугер, и "очень интересные баги" станут очень понятными.
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
31.07.2009, 00:19 #12
так ты ж его сам же и потер. надо не i*100+4 а i*100+3 в стрнкате писать.
ты на байт за границу mass1 вылез, а сразу за ним у тебя mass идет
p.s. этот код брутален и бессердечен. Ты бы хоть коменты к нему добавил.
Poleno
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 6
31.07.2009, 09:55  [ТС] #13
На единицу не выходит. Функция берет из массива 100 байт - т.е. от 0 до 99 байт включительно. Здесь все нормально.

Добавлено через 1 минуту 5 секунд
Это мой первый пост. Поэтому в следующих будут комменты.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
31.07.2009, 10:20 #14
Да не имеет значения, сколько точно она там берет - на единицу больше или меньше.....
Просто дай ответы на два вопроса:
1. Что именно делает функция strncat ? (можно заглянуть в MSDN)
2. Что именно содержится в автоматическом массиве mass1 перед началом выполнения первой итерации цикла for ? (можно использовать отладчик)
Patch
05.08.2009, 16:26     очень интересный баг
  #15

Не по теме:

блин...
и у них целый офис "опытных разработчиков"!
интересно, что они разрабатывают?
мне уже страшно...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2009, 16:26
Привет! Вот еще темы с ответами:

Помогите выловить баг, сил моих больше нету((( - C++
Программа глючит при добавлении больших структурированных каталогов, раньше думал, что ошибка выделения памяти, оказалось нет...Очень надо...

Баг или так задумано? Фишка с кодировкой файлов компиляции - C++
Visual C++ 2013 Express. От изменения кодировки созданных .cpp файлов будет зависеть то как выводятся русские буквы. Никогда раньше не...

Безумно очень очень нуждаюсь в вашем содействии! - C++ Builder
Завтра экзамен!!начинается пол 10!если есть еще такие ,которые могут помочь в написании программ!не знаю какая попадется,поэтому ,если...

Интересный баг - Windows XP
У меня в системе наблюдается интересный баг - Винт Samsung 120 Gb Sata1 система - Xp Professional sp2 2002 (установлена уже около...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.08.2009, 16:26
Ответ Создать тему
Опции темы

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