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

Невразумительная точка останова при выводе double - C++

Восстановить пароль Регистрация
 
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 00:43     Невразумительная точка останова при выводе double #1
Возникла небольшая проблемка в коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void main()
{
    int* mass;
    mass=(int*)malloc(sizeof(int));
    I_List lst;
    double first_time=clock();
    for(int i=0;i<100000;i++)
        lst.lastadd(10);    
    double second_time=clock();
    double list_time=(second_time-first_time)/100000;
    first_time=clock();
    for(int i=0;i<100000;i++)
    {
        mass[i]=10;
        if (sizeof(mass)/sizeof(int)==i) realloc(mass,(i+20)*sizeof(int));
    }
    second_time=clock();
    double array_time=(second_time-first_time)/100000;
    cout<<"Time of adding list elem in end = "<<list_time<<" ms \n";
    cout<<"Time of adding vector elem in end = "<<array_time<<endl;
system("pause");
delete mass;
}
именно при выводе переменной list_time срабатывает точка останова, которая указывает на файл mlock.c вооот на этот отрывок кода:
C++
1
2
3
4
5
6
7
8
9
void __cdecl _unlock (
        int locknum
        )
{
        /*
         * leave the critical section.
         */
        LeaveCriticalSection( _locktable[locknum].lock );
}
Помогите, пожалуйста, ибо бубен не справился
З.Ы. I_List - это односвязный список, с которым проблем уж точно никаких, так как юзал оного раньше
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2014, 00:43     Невразумительная точка останова при выводе double
Посмотрите здесь:

точка останова C++
Точка останова с восклицательным знаком C++
C++ Точка останова
C++ При удалении указателя срабатывает точка останова
C++ Точка останова(повреждение кучи)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
28.03.2014, 00:54     Невразумительная точка останова при выводе double #2
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
double first_time=clock();
clock_t clock(void)
http://www.c-cpp.ru/content/clock
есть разница?
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:03  [ТС]     Невразумительная точка останова при выводе double #3
Цитата Сообщение от ValeryS Посмотреть сообщение
clock_t clock(void)
http://www.c-cpp.ru/content/clock
есть разница?
разница то есть, только вот считает оный дабл оно вполне послушно, тоесть clock_t успешно неявно приводится к double и проблем не возникает. Проблема появляется при выводе в консоль(если вы неправильно поняли мой пост, то извините). И да, после предложенных вами изменений точка останова осталась все той же
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
28.03.2014, 01:14     Невразумительная точка останова при выводе double #4
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
разница то есть, только вот считает оный дабл оно вполне послушно, тоесть clock_t успешно неявно приводится к double
сколько значащих разрядов у double и сколько у clock_t ?
значит не послушно он приводится раз исключения вываливаются
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:17  [ТС]     Невразумительная точка останова при выводе double #5
Цитата Сообщение от ValeryS Посмотреть сообщение
сколько значащих разрядов у double и сколько у clock_t ?
ну допустим вместо дабла написать инт.
Цитата Сообщение от ValeryS Посмотреть сообщение
значит не послушно он приводится раз исключения вываливаются
ну не в этом ведь проблема. Поменял все на clock_t и в выводе поделил значение на 1000. Все то же исключение, так что, думаю, вы ошибаетесь
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
28.03.2014, 01:21     Невразумительная точка останова при выводе double #6
нашел я где исключения валятся
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
mass=(int*)malloc(sizeof(int));
сколько памяти выделяется?
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
for(int i=0;i<100000;i++)
* * {
* * * * mass[i]=10;
а сколько записываешь?
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
sizeof(mass)/sizeof(int)==i
если ты думаешь что этим ты измеряешь размер массива то ошибаешься
здесь размер указателя (4 байта) делишь на размер int ( 4 байта) в результате всегда 1
так что
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
realloc(mass,(i+20)*sizeof(int)
сработает один раз на второй итерации и выделит памяти 84 байта
размер динамических массивов так не меряется

Добавлено через 2 минуты
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
ну допустим вместо дабла написать инт.
clock_t 64 бита т.е long long а не int
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:24  [ТС]     Невразумительная точка останова при выводе double #7
Цитата Сообщение от ValeryS Посмотреть сообщение
сработает один раз на второй итерации и выделит памяти 84 байта
размер динамических массивов так не меряется
нет. каждые двадцать шагов код добавляет 80 байт и здесь исключения точно нет. Я перед тем, как сюда обратиться, уверено проследил работу своего кода.

Добавлено через 1 минуту
Но если вам это не нравится, пожалуйста, напишите, как это сделать правильно
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
28.03.2014, 01:31     Невразумительная точка останова при выводе double #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
покажи результат
sizeof(mass)/sizeof(int)
можешь сделать так
C++
1
int t=sizeof(mass)/sizeof(int);
да и если все так
то память ты выделяешь под один int
а на второй итерации ты пишешь уже вне памяти
mass[i]=10; mass[1]=10; а память еще не перераспределил
и как ты узнал что память увеличивается на 80 байт?

Добавлено через 3 минуты
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
Но если вам это не нравится, пожалуйста, напишите, как это сделать правильно
примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int leg=1;// размер массива
 int* mass;
  mass=(int*)malloc(leg*sizeof(int));
.........................................................
 for(int i=0;i<100000;i++)
    {
        mass[i]=10;
        if (leg-1==i) 
           {
           leg+=20;
           realloc(mass,leg*sizeof(int));
           }
    }
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:36  [ТС]     Невразумительная точка останова при выводе double #9
я извинюсь за свою неграмотность. Действительно, оно выделяло доп.память в размере 80 байт каждую итерацию. но и вы были неправы. Проблема именно в cout. Закоментил cout - ы, и все работает... Еще раз извините, что спорил, не разобравшись
З.Ы. 80 потому, что i+1 - это колличество елементов массива, а i*sizeof(int) - размер использованной в массиве памяти. тогда остается лишь 20* sizeof(int)

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
примерно так
блин, спасибо! как я сам до этого не додумался...
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
28.03.2014, 01:42     Невразумительная точка останова при выводе double #10
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
Действительно, оно выделяло доп.память в размере 80 байт каждую итерацию.
да как оно могло выделять каждую итерацию
у тебя что
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
if (sizeof(mass)/sizeof(int)==i)
условие на каждой итерации срабатывает?
и еще раз как ты узнал что размер памяти увеличивается?

Добавлено через 4 минуты
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
Еще раз извините, что спорил, не разобравшись
ну это нормально
учти что динамическая память, тонкая штучка, при неправильном использовании выстрелить может в любой момент
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.03.2014, 01:42     Невразумительная точка останова при выводе double #11
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
Действительно, оно выделяло доп.память в размере 80 байт каждую итерацию
Ничего оно не выделяло. sizeof(mass)/sizeof(int) всегда постоянен (наприме, равен 1), значит заход в тело if(), для увеличения памяти, будет только один раз.
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
28.03.2014, 01:42     Невразумительная точка останова при выводе double #12
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
Закоментил cout - ы, и все работает...
а теперь раскоментируй
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:43  [ТС]     Невразумительная точка останова при выводе double #13
Цитата Сообщение от ValeryS Посмотреть сообщение
условие на каждой итерации срабатывает?
и еще раз как ты узнал что размер памяти увеличивается?
если честно, я не проверял... просто как ламер, подумал логически, что если переполнения не выдает, значит, все работает... стыдно, правда... Но все-же, разве это повлияло на поток вывода?
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
28.03.2014, 01:45     Невразумительная точка останова при выводе double #14
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
Но все-же, разве это повлияло на поток вывода?
запись в невыделеную память это UB неопределенное поведение,
говорят и винчестер может форматнуть
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2014, 01:52     Невразумительная точка останова при выводе double
Еще ссылки по теме:

Не работает (?) точка останова C++
Срабатывание точки останова при попытке очистки памяти C++
Подскажете пожалуйста, почему при запуске консоли нет останова? C++

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

Или воспользуйтесь поиском по форуму:
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:52  [ТС]     Невразумительная точка останова при выводе double #15
Цитата Сообщение от ValeryS Посмотреть сообщение
запись в невыделеную память это UB неопределенное поведение,
говорят и винчестер может форматнуть
Огромнейшее вам спасибо! Наконец таки разобрался. Вот за что я люблю сайберфорум, так это за то, что здесь даже когда осознаешь себя в качестве полнейшего куска говна, то все-равно тебе приятно^^
Yandex
Объявления
28.03.2014, 01:52     Невразумительная точка останова при выводе double
Ответ Создать тему
Опции темы

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