Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cout и LeaveCriticalSection 
:(
    Опции темы
T0ohtik
Дата 8.5.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



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

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

вывалиавется на строке cout<<nValue<<"\n";. Причем не зависимо от того выводить из перемееной или статически заданого значения.
Ну и самое для меня не понятное - это то, что сбой происходит в файле mlock.h в функции LeaveCriticalSection. В следствии чего это может происходить?
PM MAIL   Вверх
NiJazz
Дата 8.5.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Не проще ль использовать std::list?
PM MAIL   Вверх
Rififi
Дата 8.5.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



cout без причины не валится. скорее всего программа уже порушена до начала do/while
PM MAIL   Вверх
T0ohtik
Дата 8.5.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Проще то прощеsmile Но я хочу сам написать...

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

Это сообщение отредактировал(а) T0ohtik - 8.5.2008, 22:27
PM MAIL   Вверх
Lazin
Дата 8.5.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



LeaveCriticalSection тут не причем, это winapi функция, использующаяся в многопоточных программах
*применяет телепатичесские способности*
скорее всего у тебя происходит разименование непроинициализированного или нулевого указателя
PM MAIL Skype GTalk   Вверх
T0ohtik
Дата 8.5.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Вот выкладываю проект. Посмотрите пожалуйста.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  List.rar 7,50 Kb
PM MAIL   Вверх
T0ohtik
Дата 9.5.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



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

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


Можно ли так изменять размеры массива? Как можно реализовать аналог Cи функции realloc, кроме как memcpy?
PM MAIL   Вверх
vinter
Дата 10.5.2008, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



 LIST *list = new(list) LIST[nCountElements];  ;



--------------------
Мой блог
PM MAIL WWW   Вверх
T0ohtik
Дата 10.5.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



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

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

PM MAIL   Вверх
vinter
Дата 10.5.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
T0ohtik
Дата 10.5.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



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

PM MAIL   Вверх
vinter
Дата 10.5.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
T0ohtik
Дата 10.5.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



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

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

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

PM MAIL   Вверх
vinter
Дата 10.5.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
T0ohtik
Дата 10.5.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



А как же будет выглядеть деструктор? delete []list, здесь же не подходит. Тоже в цикле удалять?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1095 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.