Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > cout и LeaveCriticalSection


Автор: T0ohtik 8.5.2008, 22:12
Привет! Я пытаюсь реализовать Список на С++. Столкнулся с такой проблемой. После того как я добавил в список 4 элемента, я пытаюсь вывести их на экран и тут программа вываливается. В режиме отладки элементы в массив занеслись корректно.
В выводе ничего хитрого нет:
Код

    LIST *temp = list; 
    do
    {
        int nValue = temp ->nValue;
        cout<<nValue<<"\n";
        temp = temp->listNextElement;
    }
    while(temp);

вывалиавется на строке cout<<nValue<<"\n";. Причем не зависимо от того выводить из перемееной или статически заданого значения.
Ну и самое для меня не понятное - это то, что сбой происходит в файле mlock.h в функции LeaveCriticalSection. В следствии чего это может происходить?

Автор: NiJazz 8.5.2008, 22:20
Не проще ль использовать std::list?

Автор: Rififi 8.5.2008, 22:25
cout без причины не валится. скорее всего программа уже порушена до начала do/while

Автор: T0ohtik 8.5.2008, 22:26
Проще то прощеsmile Но я хочу сам написать...

Как найти это место. Я просто даже и не знаю где и скать. Массив вроде заполняется правильно. Та и строк там буквально 10 - 15

Автор: Lazin 8.5.2008, 22:27
LeaveCriticalSection тут не причем, это winapi функция, использующаяся в многопоточных программах
*применяет телепатичесские способности*
скорее всего у тебя происходит разименование непроинициализированного или нулевого указателя

Автор: T0ohtik 8.5.2008, 22:38
Вот выкладываю проект. Посмотрите пожалуйста.

Автор: T0ohtik 9.5.2008, 17:56
Я так подозреваю, что ошибка кроется в выделении памяти при методе Push
Код

    struct LIST
    {
        LIST(): nValue(0),listNextElement(0)
        {}
        int nValue;
        LIST *listNextElement;
    };
            LIST *list = new LIST;
            list = new(list) LIST[nCountElements];            


Можно ли так изменять размеры массива? Как можно реализовать аналог Cи функции realloc, кроме как memcpy?

Автор: vinter 10.5.2008, 00:20
 LIST *list = new(list) LIST[nCountElements];  ;

Автор: T0ohtik 10.5.2008, 10:29
Не я думаю мне надо что-то примерное такое. В list у меня хранится массив структур. При добавлении еще одной, мы выделяем размер на 1 элемент больше предыдущего, и этот выделенный кусок памяти инициализируем уже существующим list. 
Цитата(vinter @  10.5.2008,  00:20 Найти цитируемый пост)
LIST *list = new(list) LIST[nCountElements] ;

а таким образом мы просто выделим новый кусок памяти и затрем им старый. Я ж говорю надо что-то типа realloc только на. С++

Автор: vinter 10.5.2008, 12:21
Цитата(T0ohtik @  10.5.2008,  11:29 Найти цитируемый пост)
а таким образом мы просто выделим новый кусок памяти и затрем им старый

ниче старого мы не затрем. Твой способ по твоему нормальный? а если следом за list идут какие то данные? ты об этом подумал?
либо сразу резервируй большое количество памяти, либо при нехватки памяти выделяй новый блок в другом месте.
И вообще че то я твоего кода не понял, списко должен быть один. А в нем много элементов, причем они могут находится в совершенно разных местах памяти и соединяются только указателями.

Автор: T0ohtik 10.5.2008, 17:40
Ну если бы мой код был нормальный, я, наверное сюда не писал быsmile Ну плюс моего способа - это то, что все-таки порядок не меняется и инициализация проходит нормально, а минус то, что скорее всего мой способ валит кучу.
А по какому принципу организован std::list, я думаю, новая память выделяется по мере добавления, а не сразу большим куском и адрес следующего элемента указывается в специальной переменной (т.е. элементы списка и так связаны указателями)?

Автор: vinter 10.5.2008, 18:09
Цитата(T0ohtik @  10.5.2008,  18:40 Найти цитируемый пост)
А по какому принципу организован std::list

отдельный элемент - отдельная область памяти
Цитата(T0ohtik @  10.5.2008,  18:40 Найти цитируемый пост)
новая память выделяется по мере добавления, а не сразу большим куском

ты по моему путаешь списки с векторами, это у вектора элементы должны лежать в памяти последовательно, в списке - нет.

Автор: T0ohtik 10.5.2008, 18:40
Списки с векторами я не перепутал, я перепутал логику работы оператора new. Свою ошибку осознал. Про реализацию списка я читал. 
Код

list * newlist = new list;
newlist->data = d;
newlist->next = first;
first = newlist;

Вот, что-то типа того. У меня возни вопрос, а как получит доступ к произвольному члену. Например, в списке 1000 элементов, а надо добраться до 500 элемента, не будешь же писать цикл на 500 повторов. И как будет выглядеть деструктор для такого списка?

Автор: vinter 10.5.2008, 19:34
Цитата(T0ohtik @  10.5.2008,  19:40 Найти цитируемый пост)
Например, в списке 1000 элементов, а надо добраться до 500 элемента, не будешь же писать цикл на 500 повторов

именно так и будешь, итераторы stl::ist как раз двуноправленные.

Автор: T0ohtik 10.5.2008, 19:54
А как же будет выглядеть деструктор? delete []list, здесь же не подходит. Тоже в цикле удалять?

Автор: vinter 10.5.2008, 20:01
Цитата(T0ohtik @  10.5.2008,  20:54 Найти цитируемый пост)
 Тоже в цикле удалять?

судя по всему да, другого выхода я тут не вижу.

Автор: T0ohtik 10.5.2008, 20:30
Хорошо, Спасибо. И последний вопрос. А как реализовать realloc. Только в копирование в цикле или memcpy или есть более красивый способ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)