Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
1

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

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

Author24 — интернет-сервис помощи студентам
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_a lgobase.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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.03.2015, 02:30
Ответы с готовыми решениями:

Права доступа при использовании функции copy()
Господа форумчане, возник вопрос... в общемто немного глупый ... Насколько я понимаю, при...

Visual Studio ругается при использовании CImage
Здравствуйте, уважаемые форумчане. Использую CImage для отрисовки изображений след. образом: ...

Почему ругается gcc при использовании inline + setjmp() ?
Добрый день. Решил написать простой карусельный переключатель задач для микроконтроллера. Для...

Почему компилятор ругается на то, что класс не объявлен при использовании оператора если?
......... if (i &lt; 3) { int b, c; cin &gt;&gt; b &gt;&gt; c; date myDate(a,...

17
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
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/refer... y/?kw=copy
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
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
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
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
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
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
27.03.2015, 16:14 7
Цитата Сообщение от hoggy Посмотреть сообщение
не взлетит.
Я исправил на resize(). Так взлетит.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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
27.03.2015, 16:32  [ТС] 9
Цитата Сообщение от hoggy Посмотреть сообщение
эти переменные по итогу должны содержать одинаковые значения
Нет. Сначала из конца s удаляются некоторые символы. Но потом они будут нужны, поэтому мне надо просто запомнить значение s, чтобы потом его сохранить для дальнейшей обработки, изменения и вернуть надо изменённое значение, поэтому такое объявление
Цитата Сообщение от hoggy Посмотреть сообщение
num_part longAriph::getnum(const string& *s)
не подойдёт.
Я использовал tmp.push_back() и у меня изменялось значение s, что мне показалось довольно таки странным.

Цитата Сообщение от hoggy Посмотреть сообщение
вы и так будете видеть в отладчике и s и tmp
Миниатюры
CodeBlocks ругается при использовании функции copy()  
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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
27.03.2015, 17:06  [ТС] 11
Цитата Сообщение от hoggy Посмотреть сообщение
поскольку, s - ссылка на объект, состояние которого нельзя изменять.
Так мне-то как раз и надо будет его изменить в конце, так что, если я не ошибаюсь, мне надо писать так:
C++
1
num_part longAriph::getnum(string& s)
?

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

Цитата Сообщение от hoggy Посмотреть сообщение
здесь есть явная проблема со здравым смыслом.
уберите copy, она избыточна.
Я тогда за те строки забыл немного просто)
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.03.2015, 17:12 12
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
Так мне-то как раз и надо будет его изменить в конце, так что, если я не ошибаюсь, мне надо писать так:
ага.

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

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

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

вот только отладчик в этих условиях начинает показывать всякую фигню.
0
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
27.03.2015, 17:19  [ТС] 13
Цитата Сообщение от hoggy Посмотреть сообщение
есть предположение, что вы дебажете release версию сборки.
Про эту беду я в курсе и дебажу именно в версии для дебага)
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.03.2015, 18:18 14
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
Про эту беду я в курсе и дебажу именно в версии для дебага)
ну что я могу сказать: фиговый у вас отладчик в CodeBlocks
0
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
27.03.2015, 18:21  [ТС] 15
hoggy, качал полный набор с офф сайта вроде как)
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.03.2015, 18:24 16
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
качал полный набор с офф сайта вроде как)
это не важно.
важно понимать: что бы не показывал отладчик, но в точке,
где переменная ещё не существует, значение которое показывает отладчик не имеет смысла.

если вас интересует значение tmp, то рассматривайте его только в тех моментах,
когда она уже реально существует.
прочие моменты - игнорируйте.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
27.03.2015, 18:45 17
Цитата Сообщение от lss Посмотреть сообщение
DrOffset, у string нет такого конструктора.
Согласен, нет. Имелось в виду вот это:
C++
1
std::string tmp(str.size(), 0);
0
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
27.03.2015, 18:48  [ТС] 18
hoggy, ну это я понимаю. Я же писал ещё, что значения были странными и в других частях программы, уже после объявления. Впрочем, это уже не важно. Уже всё отлично)
0
27.03.2015, 18:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2015, 18:48
Помогаю со студенческими работами здесь

функция copy() ругается и не копирует
Может кто сталкивался с такой проблемой? вот ошибка: Warning:...

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

Ошибка при использовании функции
Добрый день Есть ф-ция: function ABM(f, t0, y0, a, b) e = 0.01 .* f(b, y0); h = 4...

ошибка при использовании функции mysql_num_rows()
добрый день всем.. столкнулся со следующей проблемой: Fatal error: Call to undefined function...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru