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

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

Войти
Регистрация
Восстановить пароль
 
 
Мизантроп_Лол
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
Завершенные тесты: 1
#1

CodeBlocks ругается при использовании функции copy() - C++

27.03.2015, 02:30. Просмотров 362. Ответов 17
Метки нет (Все метки)

CodeBlocks почему-то ругается когда я использую функцию copy() в следующем контексте:
C++
1
2
3
4
5
6
num_part longAriph::getnum(string s)
{
...
    string tmp;
    copy(s.begin(), s.end(), tmp);
...
Без этой функции - всё нормально. При её использовании - закидывает меня в stl_algolbase.h и ругается на вот это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  template<bool _IsMove, typename _II, typename _OI>
    inline _OI
    __copy_move_a(_II __first, _II __last, _OI __result)
    {
      typedef typename iterator_traits<_II>::value_type _ValueTypeI;
      typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
      typedef typename iterator_traits<_II>::iterator_category _Category;
      const bool __simple = (__is_trivial(_ValueTypeI)
                         && __is_pointer<_II>::__value
                         && __is_pointer<_OI>::__value
                 && __are_same<_ValueTypeI, _ValueTypeO>::__value);
 
      return std::__copy_move<_IsMove, __simple,
                          _Category>::__copy_m(__first, __last, __result);
    }
Конкретнее, на 6-й и 11-й строках выдаёт:
e:\programs\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_algobase.h|376|error: no type named 'value_type' in 'struct std::iterator_traits<std::basic_string<char> >'|

И вообще ругается, когда я в дебаггере проверяю переменную s и не показывает её значение. Говорит мол, программа получила сигнал SIGSEGV, Segmentation fault. И (во время какой-то из попыток) оно показало значения переменных s и tmp. Они оказались одинаковы, хотя я пробовал не инициализировать tmp, или инициализировать её при создании:
C++
1
string tmp("123")
всё равно она становилась равной переменной s.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2015, 02:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос CodeBlocks ругается при использовании функции copy() (C++):

Почему Visual Studio 2015 ругается на функцию s.copy ? - C++
Уважаемые товарищи, помогите разобраться в чём проблема? Мне нужно просто из переменной типа string скопировать данные в информационное...

Ошибка при использовании дружественной функции - C++
Доброго времени суток! Не могу понять, в строках 17 и 20 пишет, что член hate, объявленный в строке 8 недоступен Подскажите, в чем...

Ошибка при использовании функции-члена - C++
Доброго времени суток! При использовании функции-члена print() с объектом класса bin_image , созданом конструктором по умолчанию...

Ошибки при использовании встроенной функции - C++
В классе имеется функция которая очень часто вызывается и поэтому было решено сделать ее встроенной, что бы ускорить работу программы. Но...

Ошибка при использовании vector в заголовке функции - C++
/home/motoroller/qtProjects/laba1/main.cpp:8: ошибка: 'std::vector' is not a type bool extract_class_head(string str, std::vector...

Ошибка времени выполнения при использовании функции scanf_s - C++
Есть код создания библиотеки книг, это его часть. Если потребуется могу скинуть весь код, но он без комментариев void...

17
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
27.03.2015, 03:24 #2
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
CodeBlocks почему-то ругается когда я использую функцию copy() в следующем контексте:
А так?
C++
1
2
3
4
5
6
num_part longAriph::getnum(string s)
{
...
    string tmp;
    copy(s.begin(), s.end(), tmp.begin());
...
http://www.cplusplus.com/reference/algorithm/copy/?kw=copy
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
27.03.2015, 14:04 #3
Цитата Сообщение от lss Посмотреть сообщение
А так?
А так, он наверняка поймет тебя буквально и получит крэш.
Тут нужно сказать, что память для строки в tmp уже должна быть (быть достаточного размера), чтобы это работало.
C++
1
2
string tmp(s.size());
copy(s.begin(), s.end(), tmp.begin());
____
Или, можно, например, использовать std::back_inserter
C++
1
2
3
4
5
num_part longAriph::getnum(string s)
{
...
    string tmp;
    copy(s.begin(), s.end(), std::back_inserter(tmp));
Но это не очень эффективно.
Автор, почему нельзя написать так?
C++
1
string tmp(s.begin(), s.end());
или даже так?
C++
1
string tmp = s;
0
Мизантроп_Лол
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
Завершенные тесты: 1
27.03.2015, 15:01  [ТС] #4
Цитата Сообщение от DrOffset Посмотреть сообщение
или даже так?
К сожалению, как минимум потому что во время отладки, когда я хочу проверить значение s или tmp, то либо компилятор выбивает ошибку, либо говорит мол, эти переменные одинаковы (и при изменении одной из них, изменяется значение в другой), как было написано в первом сообщении.

Добавлено через 4 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Тут нужно сказать, что память для строки в tmp уже должна быть (быть достаточного размера), чтобы это работало.
Код C++1
2
string tmp(s.size());
copy(s.begin(), s.end(), tmp.begin());
Так вылетает следующее:
|error: invalid conversion from 'std::basic_string<char>::size_type {aka unsigned int}' to 'const char*' [-fpermissive]|
e:\programs\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|487|error: initializing argument 1 of 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' [-fpermissive]|
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
27.03.2015, 16:10 #5
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
Так вылетает следующее:
C++
1
2
3
string tmp;
tmp.resize(s.size());
copy(s.begin(), s.end(), tmp.begin());
Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
string tmp(s.size());
DrOffset, у string нет такого конструктора.
0
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
27.03.2015, 16:10 #6
Цитата Сообщение от lss Посмотреть сообщение
string tmp;
tmp.reserve(s.size());
copy(s.begin(), s.end(), tmp.begin());
не взлетит.


C++
1
2
3
string tmp;
tmp.reserve(s.size());
copy(s.begin(), s.end(), std::back_inserter(tmp));
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
27.03.2015, 16:14 #7
Цитата Сообщение от hoggy Посмотреть сообщение
не взлетит.
Я исправил на resize(). Так взлетит.
0
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
27.03.2015, 16:17 #8
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
К сожалению, как минимум потому что во время отладки, когда я хочу проверить значение s или tmp, то либо компилятор выбивает ошибку, либо говорит мол, эти переменные одинаковы (и при изменении одной из них, изменяется значение в другой), как было написано в первом сообщении.
1.
вы и так будете видеть в отладчике и s и tmp
и судя по вашему юзкейсу эти переменные по итогу должны содержать одинаковые значения.

2.
при изменении одной, другая не измениться

Это легко проверить, вы можете записать вот так:

C++
1
2
3
4
5
6
7
8
num_part longAriph::getnum(const string&  s)
{
...
    string tmp = s;
 
    tmp += "trololo"; // s остается без изменений
 
...
другое дело, что для такого юз-кейса вообще достаточно сделать просто:

C++
1
2
3
4
num_part longAriph::getnum(string tmp) //<--- копия оригинального аргумента
{
    ...
}
что касается сегментфолла:

C++
1
2
3
4
//так делать нельзя
string tmp;
 
copy(s.begin(), s.end(), tmp); //<--- upsss
tmp пустая. вы туда пытается символы копировать.
не добавлять, а копировать поверх старых


Добавлено через 12 секунд
Цитата Сообщение от lss Посмотреть сообщение
Я исправил на resize(). Так взлетит.
не эффективно.
0
Мизантроп_Лол
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
Завершенные тесты: 1
27.03.2015, 16:32  [ТС] #9
Цитата Сообщение от hoggy Посмотреть сообщение
эти переменные по итогу должны содержать одинаковые значения
Нет. Сначала из конца s удаляются некоторые символы. Но потом они будут нужны, поэтому мне надо просто запомнить значение s, чтобы потом его сохранить для дальнейшей обработки, изменения и вернуть надо изменённое значение, поэтому такое объявление
Цитата Сообщение от hoggy Посмотреть сообщение
num_part longAriph::getnum(const string& *s)
не подойдёт.
Я использовал tmp.push_back() и у меня изменялось значение s, что мне показалось довольно таки странным.

Цитата Сообщение от hoggy Посмотреть сообщение
вы и так будете видеть в отладчике и s и tmp
0
Миниатюры
CodeBlocks ругается при использовании функции copy()  
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
27.03.2015, 16:44 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
Нет. Сначала из конца s удаляются некоторые символы. Но потом они будут нужны, поэтому мне надо просто запомнить значение s, чтобы потом его сохранить для дальнейшей обработки, изменения и вернуть надо изменённое значение, поэтому такое объявление
тогда принимайте по ссылке, а не по значению:
C++
1
num_part longAriph::getnum(const string& s)
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
не подойдёт.
Я использовал tmp.push_back() и у меня изменялось значение s, что мне показалось довольно таки странным.
в случае:
C++
1
num_part longAriph::getnum(const string& s)
это не возможно.

поскольку, s - ссылка на объект, состояние которого нельзя изменять.
и компилятор проследит за этим.

все эти ваши copy вам не нужны.

------------------------------------------

мне не понятно, зачем вы показали мне картинку отладчика

но судя по картинке, у вас там сейчас:

C++
1
2
string tmp = s;
copy(s.begin(), s.end(), tmp);
здесь есть явная проблема со здравым смыслом.
уберите copy, она избыточна.
1
Мизантроп_Лол
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
Завершенные тесты: 1
27.03.2015, 17:06  [ТС] #11
Цитата Сообщение от hoggy Посмотреть сообщение
поскольку, s - ссылка на объект, состояние которого нельзя изменять.
Так мне-то как раз и надо будет его изменить в конце, так что, если я не ошибаюсь, мне надо писать так:
C++
1
num_part longAriph::getnum(string& s)
?

Цитата Сообщение от hoggy Посмотреть сообщение
мне не понятно, зачем вы показали мне картинку отладчика
Показывало значения tmp и s равными ещё до объявления tmp. А раньше показывало так же и после объявления и даже после инициализации. Сейчас, после того как исправил вышеуказанную строку - всё отлично работает, спасибо)

Цитата Сообщение от hoggy Посмотреть сообщение
здесь есть явная проблема со здравым смыслом.
уберите copy, она избыточна.
Я тогда за те строки забыл немного просто)
0
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
27.03.2015, 17:12 #12
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
Так мне-то как раз и надо будет его изменить в конце, так что, если я не ошибаюсь, мне надо писать так:
ага.

Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
Показывало значения tmp и s равными ещё до объявления tmp.
вы сами понимаете насколько бредово это звучит?
до объявления tmp, она ещё вообще не существует.
--------------------------------------------------

есть предположение, что вы дебажете release версию сборки.

в режиме оптимизаций компилятор может менять код, как небо и земля.
общая логика, разумеется сохраняется.

вот только отладчик в этих условиях начинает показывать всякую фигню.
0
Мизантроп_Лол
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
Завершенные тесты: 1
27.03.2015, 17:19  [ТС] #13
Цитата Сообщение от hoggy Посмотреть сообщение
есть предположение, что вы дебажете release версию сборки.
Про эту беду я в курсе и дебажу именно в версии для дебага)
0
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
27.03.2015, 18:18 #14
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
Про эту беду я в курсе и дебажу именно в версии для дебага)
ну что я могу сказать: фиговый у вас отладчик в CodeBlocks
0
Мизантроп_Лол
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
Завершенные тесты: 1
27.03.2015, 18:21  [ТС] #15
hoggy, качал полный набор с офф сайта вроде как)
0
27.03.2015, 18:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2015, 18:21
Привет! Вот еще темы с ответами:

возникает ошибка при использовании массива, как параметр функции - C++
Добрый вечер. Помогите разобраться, пожалуйста. Задача: Проверьте, верно ли, что количество строк матрицы А(n*n), в которой все числа...

Почему при использовании функции scanf программа выдаёт ошибку? - C++
При использовании команды scanf программа выдаёт ошибку. Printf работает нормально. В чем может быть проблема? Среда разработки - Dev c++...

Оптимизирует ли компилятор код при использовании функции, возвращающей константу? - C++
Объясните мне компиляторы С++ оптимизируют такой код?. Да и вообще компиляторы оптимизуруют это? Я просто думал, что сохраняется адрес...

Почему портится поток cin при использовании функции getline - C++
char a; cin.getline(a,5); cin.clear(); При вводе свыше 5 символов после функции getline надо вызывать функцию clear() иначе...


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

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

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