Форум программистов, компьютерный форум CyberForum.ru

Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) - C++

Восстановить пароль Регистрация
 
Kortez
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 10
27.02.2013, 02:25     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #1
Всем доброго времени суток. Столкнулся со странной проблемой. И не смог сам разобраться.
При добавлении к строке (string) элемента другой строки (в коде помечено "//ПРОБЛЕМА_1") или символа (char) (//ПРОБЛЕМА_2) компилятор выдаёт сообщения об ошибке (см. спойлер).
При этом, в реализации другого метода, подобная конструкция не создаёт проблем.
C++
1
kodStr.append(slovarFano[j].kod)
kodStr, kod имеют тип string; kod - char.

Для удобства отладки все поля класса fano имеют открытый доступ.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
string fano::dekodirovanie()
{
    string temp;
    bool find = false;
    int findId = -1;
    for(int i = 0; i < kodStr.length(); i++)
    {
    temp.append(kodStr.at(i));              //ПРОБЛЕМА_1
//  cout << temp.at(i) << '\n';
    for(int j = 0; j < top; j++)
    {
//      cout << kodStr.at(i) << '\n';
        if(temp.compare(slovarFano[j].kod) == 0) 
        { find = true; findId = j; break; }
    }
    if(find) 
    {
        dekStr.append(slovarFano[findId].symbol);   //ПРОБЛЕМА_2
        temp.clear();
        find = false; findId = -1;
    }
    }
    
    return dekStr;
}
Компилятор возвещает:
Кликните здесь для просмотра всего текста
kortez@dev:~/cpp$ g++ code1.cpp -o code.a
code1.cpp: В функции-члене «std::string fano::dekodirovanie()»:
code1.cpp:178:26: ошибка: некорректное преобразование из «char» в «const char*» [-fpermissive]
/usr/include/c++/4.6/bits/basic_string.h:997:7: ошибка: при инициализации 1 -го аргумента «std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]» [-fpermissive]
code1.cpp:188:45: ошибка: некорректное преобразование из «char» в «const char*» [-fpermissive]
/usr/include/c++/4.6/bits/basic_string.h:997:7: ошибка: при инициализации 1 -го аргумента «std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]» [-fpermissive]


Добавлено через 52 минуты
P.S. Компилятор: g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

Добавлено через 3 минуты
P.P.S. В начале небольшая опечатка по типам переменных.
kodStr, kod имеют тип string; symbol - char.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2013, 02:25     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj)
Посмотрите здесь:

C++ Проблемы с gets
C++ Проблемы компилятора с++
C++ Проблемы с меню
C++ Проблемы с перегрузкой
C++ Проблемы с циклом for
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.02.2013, 02:39     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #2
Нет такого метода append(), чтобы просто символ добавить. Строку можно. Если символы, то, в частности, указывается сколько. Например, если один нужно добавить:
C++
1
temp.append(1, kodStr.at(i));
Kortez
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 10
27.02.2013, 02:47  [ТС]     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #3
Я смотрел информацию по методу append().
C++
1
string& append (const char* s, size_t n);
Пробовал писать:
C++
1
temp.append(kodStr.at(i), 1);
Но вот проблема
C++
1
2
temp.append(kodStr.at(i), 1);
cout << temp.at(i) << '\n';
говорит о том, что строка пуста на каждой итерации.

А
C++
1
string& append (size_t n, char c);
выводит сообщение об ошибке во время выполнения:
Кликните здесь для просмотра всего текста
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at
Аварийный останов (core dumped)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.02.2013, 02:52     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #4
Цитата Сообщение от Kortez Посмотреть сообщение
Я смотрел информацию по методу append().
string& append (const char* s, size_t n);
Тут строка, из которой берутся символы, а у вас символ. Попробуйте написать, как во втором посте.
Kortez
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 10
27.02.2013, 03:03  [ТС]     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #5
Собственно, я пробовал.
Ошибка при выполнении

Кликните здесь для просмотра всего текста
Закодированная фраза: 101110100
1 1073741820 1
0 1073741820 2
1 1073741820 4
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at
Аварийный останов (core dumped)


C++
1
2
    temp.append(1, kodStr.at(i));               //ПРОБЛЕМА!!!
    cout << temp.at(i) << '\t' << temp.max_size() << '\t' << temp.capacity() << '\n';
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.02.2013, 03:25     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #6
Тут, что-то другое. Выход за пределы строки. Среда какая? Уже увидел. Еcли просто:
C++
1
temp.append(1, kodStr[i]);
Добавлено через 12 минут
Такой код у вас без проблем работает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
    string str = "bbb";
    string str2 ;
    for (int i = 0; i < str.length(); i++)
        str2.append(1, str.at(i));
    cout << str2 << endl;
 
    return 0;
}
Kortez
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 10
27.02.2013, 03:27  [ТС]     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #7
Компилятор: g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
KUbuntu 12.04 под VirtualBox
Предположение:
Кликните здесь для просмотра всего текста
Если судить по выводу информации о заполнении строки temp и соотнесении со строкой, которая декодируется, можно сделать вывод, что проблема возникает в момент записи символа в районе 19 строки из кода в первом посте.


Сейчас пробовал менять at(i) на []. Результат получился очень интересный. Моё предположение оказалось ложным.

Результат:
Метод работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
string fano::dekodirovanie()
{
    string temp;
    bool find = false;
    int findId = -1;
    for(int i = 0; i < kodStr.length(); i++)
    {
    temp.append(1, kodStr.at(i));               //ПРОБЛЕМА!!!
    cout << temp[i] << '\t' << temp.max_size() << '\t' << temp.capacity() << '\n';
    for(int j = 0; j < top; j++)
    {
//      cout << kodStr.at(i) << '\n';
        if(temp.compare(slovarFano[j].kod) == 0) 
        { find = true; findId = j; break; }
    }
    if(find) 
    {
        dekStr.append(1, slovarFano[findId].symbol);    //ПРОБЛЕМА!!!
        temp.clear();
        find = false; findId = -1;
    }
    //cout << dekStr.at(i) << '\t' << dekStr.max_size() << '\t' << dekStr.capacity() << '\n';
    }
    
    return dekStr;
}
При выполнении вылетает с той же ошибкой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
string fano::dekodirovanie()
{
    string temp;
    bool find = false;
    int findId = -1;
    for(int i = 0; i < kodStr.length(); i++)
    {
    temp.append(1, kodStr.at(i));               //ПРОБЛЕМА!!!
    cout << temp.at(i) << '\t' << temp.max_size() << '\t' << temp.capacity() << '\n';     //проблема в этой строке
    for(int j = 0; j < top; j++)
    {
//      cout << kodStr.at(i) << '\n';
        if(temp.compare(slovarFano[j].kod) == 0) 
        { find = true; findId = j; break; }
    }
    if(find) 
    {
        dekStr.append(1, slovarFano[findId].symbol);    //ПРОБЛЕМА!!!
        temp.clear();
        find = false; findId = -1;
    }
    //cout << dekStr.at(i) << '\t' << dekStr.max_size() << '\t' << dekStr.capacity() << '\n';
    }
    
    return dekStr;
}
Спасибо за помощь! =)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.02.2013, 03:32     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #8
Ничего не понял... Работает или нет?
Kortez
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 10
27.02.2013, 03:38  [ТС]     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #9
Да, всё успешно работает.
В 10 строке кода производится вывод информации, что бы следить за содержимым строки temp.
Так работает:
C++
1
2
temp.append(1, kodStr.at(i));
cout << temp[i] << '\t' << temp.max_size() << '\t' << temp.capacity() << '\n';
А так нет:
C++
1
2
temp.append(1, kodStr.at(i));
cout << temp.at(i) << '\t' << temp.max_size() << '\t' << temp.capacity() << '\n';
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.02.2013, 03:49     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #10
Странно... У меня, что так, что так работает... На двух компиляторах... Особенности реализаций под Linux? Ради интереса, вот такое попробуйте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main()
{
    string str = "bbb";
    string str2 ;
    for (int i = 0; i < str.length(); i++)
    {
        str2.append(1, str.at(i));
        cout << str2.at(i) << endl;
    }
 
    cout << str2 << endl;
 
    return 0;
}
Kortez
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 10
27.02.2013, 03:58  [ТС]     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #11
Ещё более странно, что до этого я пробовал три метода добавления символа к строке (включая те, которые добавляют строку а не символ ), проблемный блок (cout << ...; ) был закомментирован, но ошибка имела место быть.
Мистика

Попробовал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
    string str = "bbb";
    string str2 ;
    for (int i = 0; i < str.length(); i++)
        str2.append(1, str.at(i));
    cout << str2 << endl;
 
    return 0;
}
Добавлено через 4 минуты
Кликните здесь для просмотра всего текста
kortez@dev:~/cpp$ g++ testStr.cpp -o testStr.a
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: выполнение ld завершилось с кодом возврата 1
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.02.2013, 04:02     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #12
Цитата Сообщение от Kortez Посмотреть сообщение
Ещё более странно, что до этого я пробовал три метода добавления символа к строке (включая те, которые добавляют строку а не символ ), проблемный блок (cout << ...; ) был закомментирован, но ошибка имела место быть.
Мистика
С этим как раз понятно. Тогда другая ошибка была. Компилятор писал не выход за пределы, а: "ошибка: некорректное преобразование из «char» в «const char*» [-fpermissive]" Попробуйте код из моего предпоследнего поста. Если тоже будет такую ошибку выдавать, то это значит компилятор такой.

Добавлено через 2 минуты
Цитата Сообщение от Kortez Посмотреть сообщение
Попробовал
Это что за ошибка? main() не такая?
Kortez
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 10
27.02.2013, 04:06  [ТС]     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #13
Кликните здесь для просмотра всего текста
kortez@dev:~/cpp$ g++ testStr.cpp -o testStr.a
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: выполнение ld завершилось с кодом возврата 1


Если тоже будет ошибку выдавать, то это значит компилятор такой.
Наверно стоит с этим разобраться, но я затрудняюсь составить правильный запрос...

Добавлено через 3 минуты
Извиняюсь, проглядел, что в коде не было
C++
1
#include <string>
Добавил и всё скомпилировалось и выполнилось.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.02.2013, 04:08     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #14
У вас среда какая-то или просто компилятор?

Добавлено через 1 минуту
Цитата Сообщение от Kortez Посмотреть сообщение
Извиняюсь, проглядел, что в коде не было
Это моя вина. Скопировал из Code Blocks, а тот без этого обходится(в отличие от студии).
Kortez
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 10
27.02.2013, 04:08  [ТС]     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #15
Текстовый редактор и компилятор.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.02.2013, 04:12     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #16
Цитата Сообщение от Kortez Посмотреть сообщение
Попробовал
Это не тот код. Вот этот надо (10 пост):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string str = "bbb";
    string str2 ;
    for (int i = 0; i < str.length(); i++)
    {
        str2.append(1, str.at(i));
        cout << str2.at(i) << endl;
    }
 
    cout << str2 << endl;
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2013, 04:16     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj)
Еще ссылки по теме:

Проблемы с контейнером C++
Проблемы с C++ C++
C++ Проблемы с VS 2012

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

Или воспользуйтесь поиском по форуму:
Kortez
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 10
27.02.2013, 04:16  [ТС]     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj) #17
Да, всё скомпилировалось и выполнилось без ошибок.
Ещё раз спасибо за помощь )
Yandex
Объявления
27.02.2013, 04:16     Проблемы с stringObj.append(stringObj.at(i) и stringObj.append(classObj[i].charObj)
Ответ Создать тему
Опции темы

Текущее время: 22:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru