Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
8 / 8 / 3
Регистрация: 20.10.2015
Сообщений: 50

Буффер из std::string c_str()

29.02.2016, 14:28. Показов 2269. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
такое дело: Проект на Qt5 и С++11.
Есть форма с полем ввода. Введённое содержимое должно обработаться отдельным потоком и удаляться.

bool simbolread используется для синхронизации с потоком
chitalka_buffer определена как const char *

Вот код обработки поля ввода:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void MainWindow::on_plainTextEdit_textChanged()
{
    if (!ui->plainTextEdit->document()->isEmpty() && !simbolread) {
        chitalka_buffer=ui->plainTextEdit->toPlainText().toStdString().c_str();
        chitalka_buffsize=ui->plainTextEdit->toPlainText().toStdString().size();
 
        simbolread=true;
 
        while (simbolread) //делаем очистку когда буффер обработан
            {QThread::msleep(15);} 
        ui->plainTextEdit->clear();
    }
}
поток...
вызывает функцию searchBuffTemplate(chitalka_buffer);

C++ (Qt)
1
2
3
4
5
6
7
8
void searchBuffTemplate(const char *data) //data - начало буффера обработки
{
    short i=0;
    while (i<=chitalka_buffsize) { 
        qDebug() << data[i];
        i++;
    }
}
Так вот, откомпилированная программа иногда выводит чушь какую-то, а при отладке chitalka_buffer* ссылается вообще на какую-то галиматью.

Что я делаю неправильно, вернее чего я не понимаю, что у меня получается такая ошибка?
дело в const? Можно ли здесь получить доступ к массиву символов std::string? судя по документации можно, но у меня не получается.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.02.2016, 14:28
Ответы с готовыми решениями:

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

string, c_str
функция string.c_str() возвращает const char*, что бы не изменяли строку напрямую. Но! Если явно преобразовать указатель к char*, то строка...

6
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
29.02.2016, 14:37
Переменная simbolread как объявлена? Как volatile? В сторону std::condition_variable не смотрели? Зачем нужен второй поток, если основной всё равно блокируется?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
29.02.2016, 14:49
сначала toPlainText даст временный объект типа QString, потом
toStdString() вернет временный объект, у которого мы вызовем c_str() и сохраним указатель на эти данные.
Потом этот временный объект будет уничтожен и chitalka_buffer останется с невалидными данными.
2
8 / 8 / 3
Регистрация: 20.10.2015
Сообщений: 50
29.02.2016, 14:54  [ТС]
Нет, это простая bool переменная видимая основному и вторичному потоку.
Второй поток нужен по архитектуре приложения. Второй поток не тормозится и обрабатывает кроме данных из основного потока ещё из других источников (их пока нет, но будут).
Я пока тестирую, поэтому торможу основной поток для наглядности, чтобы второй мог успеть провести гарантированно обработку данных.
Про std::condition_variable знаю и как-то использовал в деле, но тут этого не надо.

Добавлено через 58 секунд
Croessmah, ты Гений
Буду исправляться (придётся копировать, как бы не хотелось)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
29.02.2016, 14:57

Не по теме:

Цитата Сообщение от pdn_mail Посмотреть сообщение
ты Гений
я тока учусь :)



Добавлено через 2 минуты
Цитата Сообщение от pdn_mail Посмотреть сообщение
(придётся копировать, как бы не хотелось)
Компилятор может оптимизировать, и при
C++
1
std::string str = ui->plainTextEdit->toPlainText().toStdString();
устранить копирование.
Если C++11, то в случае, если не удастся избавиться от копирования,
постарается произвести перемещение.
Ну и можно сделать так:
C++
1
2
const std::string &str = ui->plainTextEdit->toPlainText().toStdString();
chitalka_buffer = str.c_str();
2
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
29.02.2016, 15:11
Croessmah, получается, что время жизни объекта ограничивается выражением, где он был создан, но только в том случае, если на этот объект нет явных ссылок?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
29.02.2016, 15:21
Цитата Сообщение от Usaga Посмотреть сообщение
получается, что время жизни объекта ограничивается выражением, где он был создан
Временные объекты живут до завершения full-expression:
12.2
3. ...
Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created.
...
Цитата Сообщение от Usaga Посмотреть сообщение
но только в том случае, если на этот объект нет явных ссылок?
Не совсем так. Время жизни временного объекта может быть изменено в двух случаях:
12.2
4. There are two contexts in which temporaries are destroyed at a different point than the end of the full-expression. The first context is when a default constructor is called to initialize an element of an array. If the constructor has one or more default arguments, the destruction of every temporary created in a default argument is sequenced before the construction of the next array element, if any.

5. The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object of a subobject to which the reference is bound persists for the lifetime of the reference except:

— A temporary bound to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits.

— A temporary bound to a reference parameter in a function call (5.2.2) persists until the completion of the full-expression containing the call.

— The lifetime of a temporary bound to the returned value in a function return statement (6.6.3) is not extended; the temporary is destroyed at the end of the full-expression in the return statement.

— A temporary bound to a reference in a new-initializer (5.3.4) persists until the completion of the full-expression containing the new-initializer.
[ Example:
C++
1
2
3
struct S { int mi; const std::pair<int,int>& mp; };
S a { 1, {2,3} };
S* p = new S{ 1, {2,3} };// Creates dangling reference
— end example ]
[ Note: This may introduce a dangling reference, and implementations are encouraged to issue a warning in such a case. — end note]

...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.02.2016, 15:21
Помогаю со студенческими работами здесь

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Безопасность передачи string.c_str() в качестве параметра
Есть некоторая функция которая принимает в себя си-строку, модифицирует ее (в т.ч. может увеличить количество данных). Безопасно ли...

Реализация класса MyString. Стандартная библиотека, std::string, std::vector
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...

Передача функции указатель на элемент std::vector<std::string>
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в качестве параметра указатель на...

Операция std::cout для Объекта типа std::string
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru