Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2011, 18:59   #1
Jony217
Пользователь
 
Регистрация: 09.02.2011
Сообщений: 55
По умолчанию Не могу найти ошибку в программе на С++

Доброго времени суток.
Код:
#include <list>
#include <iostream>
#include <string>

int main()
{
   list<string> s(10,0);
   for(list<string>::iterator i=s.begin();i!=s.end();++i)
      std::cin >> *i;
   for(list<string>::iterator i=s.begin(), l=s.end();i!=l;++i,--l)
   {
	  string s2=*i;
	  *i=*l;
	  *l=s2;}
   for(list<string>::iterator i=s.begin();i!=s.end();++i)
      std::cout << *i << std::endl;
   system ("PAUSE");
}
жалуется на 7, 8, 10, 12, 14 и 15 строки.
Заранее спасибо.

Последний раз редактировалось ACE Valery; 30.12.2011 в 19:03.
Jony217 вне форума Ответить с цитированием
Старый 28.12.2011, 19:05   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
int main()
{

using namespace std; //СПРОСИ СЕБЯ, ЧТО ДЕЛАЕТ ЭТА СТРОКА?

list<string> s(10,0);    //СПРОСИ СЕБЯ, ГДЕ ЖИВУТ СТАНДАРТНЫЕ КЛАССЫ И ОБЪЕКТЫ?

for(list<string>::iterator i=s.begin();i!=s.end();++i)

std::cin >> *i; //СПРОСИ СЕБЯ, ЧТО ОЗНАЧАЕТ ТАИНСТВЕННОЕ std:: ?


for(list<string>::iterator i=s.begin(), l=s.end();i!=l;++i,--l)
{
string s2=*i;
*i=*l;
*l=s2;}
for(list<string>::iterator i=s.begin();i!=s.end();++i)
std::cout << *i << std::endl;       
system ("PAUSE");
}

Последний раз редактировалось _Bers; 28.12.2011 в 19:13.
_Bers вне форума Ответить с цитированием
Старый 28.12.2011, 19:18   #3
Jony217
Пользователь
 
Регистрация: 09.02.2011
Сообщений: 55
По умолчанию

1)У меня в коде строки "using namespace std;" нет, и зачем Вы используете впоследствии используете "std"?
2)После того, как я написал "using namespace std;" и убрал "std" из кода, при компиляции открывается файл заголовка "stl_list.h" и в нем указывают ошибку, в чем дело?
Jony217 вне форума Ответить с цитированием
Старый 28.12.2011, 19:26   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Jony217 Посмотреть сообщение
1)У меня в коде строки "using namespace std;" нет, и зачем Вы используете впоследствии используете "std"?
2)После того, как я написал "using namespace std;" и убрал "std" из кода, при компиляции открывается файл заголовка "stl_list.h" и в нем указывают ошибку, в чем дело?
1. Вопрос не в том, есть оно у вас в коде, или нет.
Вопрос в том, зачем это нужно?

Что означает запись вида "using namespace std" ?
Что означает запись вида "std::" ?

Где и почему их следует применять?

2. Впервые слышу о файле "stl_list.h"
В стандартной библиотеке такого файла нет (у меня по крайней мере).

3. Если компилятор выдал ошибку - показывайте полностью весь текст ошибки. Телепаты в отпуске.
_Bers вне форума Ответить с цитированием
Старый 28.12.2011, 19:33   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

вот смотри, что я сделал (это твой подправленный код):

Код:
#include <list>
#include <iostream>
#include <string>

int main()
{
    using namespace std;

    //list<string> s(10,0);  // : error C2440: приведение типов: невозможно преобразовать 'int' в 'std::string'
    list<string> s(10,"");
    for(list<string>::iterator i=s.begin();i!=s.end();++i)
        std::cin >> *i;
    for(list<string>::iterator i=s.begin(), l=s.end();i!=l;++i,--l)
    {
        string s2=*i;
        *i=*l;
        *l=s2;}
    for(list<string>::iterator i=s.begin();i!=s.end();++i)
        std::cout << *i << std::endl;
    
}
Я не вникал точно, что он у тебя делает. Но в таком вот виде он скомпилировался. Там с клавиатуры что-то вводить надо.
А тебе нужно понять - что было не так? Почему раньше он не хотел компилироваться?

Да, кстати.. ввел последнюю строчку склавиатуры и поймал крэш. Предположительно - не_валидный итератор листовый.
Сейчас выясню точно, из-за чего крэшеццо...



Вот смотри, вот в этой строчке:

Код:
 for(list<string>::iterator i=s.begin(), l=s.end();    i!=l;++i,--l)
    {
        string s2=*i;  //создали новый стринг запихав в него значение стринга на который смотрит i
        *i=*l;         //вот здесь ошибка. Крэш в рантайме: Expression: list iterator not deferencable

                         //Объясняю почему:
                         //теперь значение на которое смотрит i нужно заменить значением на которое смотрит l
                         
                        //но в самом начале цикла l смотрит куда??? l=s.end(); На не_валидный_элемент
                        //попытка присвоить *i значение несуществующего элемента и приводит к крышу

        *l=s2;
    }
/ps l=s.end() // здесь end() указывает не на последний элемент контейнера, а на элемент стоящий за последним элементом контейнера.
То есть, он указывает на уже не существующий элемент.

Последний раз редактировалось _Bers; 28.12.2011 в 20:06.
_Bers вне форума Ответить с цитированием
Старый 28.12.2011, 20:23   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Вот так все компилируется, и ничего не крэшеться.

Код:
int main()
{
    using namespace std;
    
    //закомментировал косяк
    //list<string> s(10,0);  // : error C2440: приведение типов: невозможно преобразовать 'int' в 'std::string'
    
    //исправленный вариант:
    list<string> s(3,""); //первичная инициализация контейнера пустотой
    
    //что бы не вводить в ручную с клавиатуру каждый раз, я решил изменить процедуру ввода исходных данных
   //но ничего не мешает вернуть все, как было
    {
        list<string>::iterator i=s.begin(); 
        *i="111"; ++i;    *i="222"; ++i;    *i="333"; ++i;
    }
    
    //Что бы не лепить непонятную кучу в шапке цикла, я вынес объявления счетчиков цикла наружу, и записал их в отдельные  ПОНЯТНЫЕ предложения
    //Код сразу стал более очевиден, и более понятен.
    list<string>::iterator i=s.begin();    
    list<string>::iterator l= s.end(); --l; //теперь l смотрит на последний элемент, а не на "несуществующий"
    
    //А дальше, все как обычно:
    for( ; i!=l;  ++i,--l) {  string s2=*i;  *i=*l;  *l=s2;  }
    
    for(list<string>::iterator i=s.begin();i!=s.end();++i){ cout << *i << endl; }
}

Последний раз редактировалось _Bers; 28.12.2011 в 20:30.
_Bers вне форума Ответить с цитированием
Старый 28.12.2011, 21:28   #7
Speakon
Пользователь
 
Аватар для Speakon
 
Регистрация: 19.11.2011
Сообщений: 17
По умолчанию

Цитата:
using namespace std; //СПРОСИ СЕБЯ, ЧТО ДЕЛАЕТ ЭТА СТРОКА?
_Bers, не путайте человека, нет абсолютно никакой разницы писать std:: ... или using namespace std.
Более того иногда именно из-за написания using namespace std, вместо std:: возникают проблемы в работе программы.
Speakon вне форума Ответить с цитированием
Старый 28.12.2011, 21:42   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Speakon Посмотреть сообщение
_Bers, не путайте человека, нет абсолютно никакой разницы писать std:: ... или using namespace std.
Более того иногда именно из-за написания using namespace std, вместо std:: возникают проблемы в работе программы.
1. Реально - разница есть.

2. Все ошибки я нашел и исправил. Прочитать о них можно выше.

3. Есть разница, как писать, вот так:

Код:
list<string> s(3,"");
или вот так:
Код:
std::list<std::string> s(3,"");
Или может быть вы не понимаете смысла того, что это за волшебные буковки такие "std::" , и тупо, как мартышки зазубрили, что они ставятся перед cout и endl ?

Последний раз редактировалось _Bers; 28.12.2011 в 21:45.
_Bers вне форума Ответить с цитированием
Старый 28.12.2011, 21:48   #9
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
2. Впервые слышу о файле "stl_list.h"
В стандартной библиотеке такого файла нет (у меня по крайней мере).
Думаю что в стандартной библиотеке GNU AVR GCC он есть. Скорее всего програма для МК AVR32 или ARM.
KemanSR вне форума Ответить с цитированием
Старый 28.12.2011, 21:53   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от KemanSR Посмотреть сообщение
Думаю что в стандартной библиотеке GNU AVR GCC он есть. Скорее всего програма для МК AVR32 или ARM.
Да хоть для чего. Это не суть важно.

Важно только одно: код написанный по стандарту должен делать то, что от него ожидается согласно стандарту.

У парня было три ошибки:
1 .Он пытался заюзать стандартные контейнеры никак не указав пространство имен.
2. Он некорректно инициализировал массив стрингов, пытаясь скормить конструктору стринга тип int вместо char или char*

3. Ошибка в рантайме - попытка доступа к несуществующему элементу контейнера.

Да блин, я все это выше написал, и довольно таки подробно.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку в программе Doomsday Помощь студентам 1 14.11.2011 18:53
Ошибку не могу найти в программе Веселина Паскаль, Turbo Pascal, PascalABC.NET 7 26.05.2011 20:44
Не могу найти ошибку в программе. Елеша Помощь студентам 0 06.05.2011 23:45
Не могу найти ошибку в программе Dawystrik Общие вопросы Delphi 9 19.03.2009 21:19