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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
#1

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

28.03.2014, 00:43. Просмотров 353. Ответов 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
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 - это односвязный список, с которым проблем уж точно никаких, так как юзал оного раньше
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2014, 00:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Невразумительная точка останова при выводе double (C++):

При удалении указателя срабатывает точка останова - C++
В принципе, в заголовке все есть... Добавлю лишь, что я всего лишь маленький ламер, камнями не кидать в случае чего... Тыкните мне носом,...

точка останова - C++
Доброго времени суток! Если не сложно, объясните в чем ошибка. #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; ...

Точка останова - C++
Здравствуйте все! Не пойму в чём проблема. Вот так всё работает: void main() { char *c = new char ; delete c; }

Не работает (?) точка останова - C++
Ставлю ее перед return, а окно все равно мигом закрывается. Как быть?

Точка останова с восклицательным знаком - C++
В проекте есть несколько точек останова с красным (незакрашенным) кружком и восклицательным знаком. Если навести на такую точку курсор...

Точка останова(повреждение кучи) - C++
Прошу помочь, смотрел по форуму похожие темы - ответа не нашел void Base::Read() { char* name=new char;//переменная для имени ...

14
ValeryS
Модератор
6673 / 5082 / 474
Регистрация: 14.02.2011
Сообщений: 17,048
28.03.2014, 00:54 #2
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
double first_time=clock();
clock_t clock(void)
http://www.c-cpp.ru/content/clock
есть разница?
0
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:03  [ТС] #3
Цитата Сообщение от ValeryS Посмотреть сообщение
clock_t clock(void)
http://www.c-cpp.ru/content/clock
есть разница?
разница то есть, только вот считает оный дабл оно вполне послушно, тоесть clock_t успешно неявно приводится к double и проблем не возникает. Проблема появляется при выводе в консоль(если вы неправильно поняли мой пост, то извините). И да, после предложенных вами изменений точка останова осталась все той же
0
ValeryS
Модератор
6673 / 5082 / 474
Регистрация: 14.02.2011
Сообщений: 17,048
28.03.2014, 01:14 #4
Цитата Сообщение от Kostik_Dodik Посмотреть сообщение
разница то есть, только вот считает оный дабл оно вполне послушно, тоесть clock_t успешно неявно приводится к double
сколько значащих разрядов у double и сколько у clock_t ?
значит не послушно он приводится раз исключения вываливаются
0
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:17  [ТС] #5
Цитата Сообщение от ValeryS Посмотреть сообщение
сколько значащих разрядов у double и сколько у clock_t ?
ну допустим вместо дабла написать инт.
Цитата Сообщение от ValeryS Посмотреть сообщение
значит не послушно он приводится раз исключения вываливаются
ну не в этом ведь проблема. Поменял все на clock_t и в выводе поделил значение на 1000. Все то же исключение, так что, думаю, вы ошибаетесь
0
ValeryS
Модератор
6673 / 5082 / 474
Регистрация: 14.02.2011
Сообщений: 17,048
28.03.2014, 01:21 #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
0
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:24  [ТС] #7
Цитата Сообщение от ValeryS Посмотреть сообщение
сработает один раз на второй итерации и выделит памяти 84 байта
размер динамических массивов так не меряется
нет. каждые двадцать шагов код добавляет 80 байт и здесь исключения точно нет. Я перед тем, как сюда обратиться, уверено проследил работу своего кода.

Добавлено через 1 минуту
Но если вам это не нравится, пожалуйста, напишите, как это сделать правильно
0
ValeryS
Модератор
6673 / 5082 / 474
Регистрация: 14.02.2011
Сообщений: 17,048
28.03.2014, 01:31 #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));
           }
    }
0
Kostik_Dodik
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 53
28.03.2014, 01:36  [ТС] #9
я извинюсь за свою неграмотность. Действительно, оно выделяло доп.память в размере 80 байт каждую итерацию. но и вы были неправы. Проблема именно в cout. Закоментил cout - ы, и все работает... Еще раз извините, что спорил, не разобравшись
З.Ы. 80 потому, что i+1 - это колличество елементов массива, а i*sizeof(int) - размер использованной в массиве памяти. тогда остается лишь 20* sizeof(int)

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

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

C++ delete[] точка останова/повреждение кучи - C++
Добрый день. Подскажите, пожалуйста. Вот код функции: void interpol(point* a, int n, int k, point* y, int inter) //a-original ...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Почему перестает работать программа при замене double на long double? - C++
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел программу в интернете, запустил - все работает, но когда решил...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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