Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
MetMark
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 199
1

Перевод из QString в double[]

09.07.2019, 11:46. Просмотров 2966. Ответов 27
Метки нет (Все метки)

У меня есть массив и функция которая возвращает строку из QLineEdit. В этот список строк записываются исключительно числа либо целого, либо дробного вида.
C++ (Qt)
1
2
double saveInputData[i] = strtod(NewDialog->Successfull()); 
// создаем массив типа double и присваеваем ему значение которое вернет функция.
Есть много разных способов перевода с QString в double, но постоянно мне выдаются ошибки.
Какую функцию перевода использовать лучше и как правильнее это записать для случая который я привел выше?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2019, 11:46
Ответы с готовыми решениями:

Быстрый перевод double в QString
Простой пример: int main(int argc, char *argv) { for (int i = 0; i < 100000; ++i) { ...

Преобразование double к qstring
Всем привет! Пишу программу, которая получает данные через API, а затем выводит их. Код разбора...

Преобразование double в QString
Здравствуйте! Возникла проблема с преобразованием double в QString. Вот участок кода: QString...

QString Не точно переводит в double
Всем привет, как в double перевести корректно QString data_double = "1.42542"; double...

QString в Double не точная конвертация
Такой вопрос, делаю калькулятор. Введенное строка преобразуется в число формата double, но если...

27
Анна по жизни
270 / 161 / 60
Регистрация: 13.03.2019
Сообщений: 396
09.07.2019, 12:14 2
Что бы это значило?
C++ (Qt)
1
double saveInputData[i]
Этот точно не создаётся массив.

Я думаю, что ругань идёт не из-за преобразования строки в число, а из-за этого безобразия, которое мы видим.

Во-первых, размер массива должен быть точно известен на момент компиляции, при таком объявлении. Если у значения i могут быть варианты, то массив надо выделять через new. И уж точно, если строка содержит несколько чисел, то её надо разбить на подстроки, содержащие по одному числу, а потом уж в цикле заниматься преобразованием и присвоением полученных значений в массив. это в случае, если использовать методы QString. Если пользуешься strtod(), то внимательно изучи пример её использования.
1
MetMark
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 199
09.07.2019, 13:17  [ТС] 3
Цитата Сообщение от Анна по жизни Посмотреть сообщение
Я думаю, что ругань идёт не из-за преобразования строки в число, а из-за этого безобразия, которое мы видим.
Безобразие исправил. Создал нормальный динамический массив
CSS
1
saveInputData[i] = strtod(NewDialog->Successfull(), nullptr); // так не нравится
В качестве первого параметра он ругается на все что угодно (переменные QString, Указатели QString, функции которые возвращают QString), не ругается только на прямой текст
C++ (Qt)
1
saveInputData[i] = strtod("Прямой текст", nullptr); //Так его все устраивает
Не понимаю что не так...
0
Lolobotik
255 / 69 / 30
Регистрация: 10.06.2015
Сообщений: 230
09.07.2019, 13:52 4
Цитата Сообщение от MetMark Посмотреть сообщение
он ругается на все что угодно (переменные QString, Указатели QString, функции которые возвращают QString), не ругается только на прямой текст
C++ (Qt)
1
double      strtod( const char* str, char** str_end );
Вот загадка то... с чего бы так...
0
09.07.2019, 13:52
Анна по жизни
270 / 161 / 60
Регистрация: 13.03.2019
Сообщений: 396
09.07.2019, 14:02 5
Лучший ответ Сообщение было отмечено MetMark как решение

Решение

Цитата Сообщение от MetMark Посмотреть сообщение
В качестве первого параметра он ругается на все что угодно (переменные QString, Указатели QString, функции которые возвращают QString), не ругается только на прямой текст

метод не любит QString, потому что ты не умеешь готовить QString потому что он любит const char*.Для любителей const char* у QString есть метод data().
1
MetMark
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 199
09.07.2019, 15:13  [ТС] 6
Так метод data() использует QChar, а он не подходит для strtod
Честно, не понимаю как из QString в обычный char перевести

Добавлено через 10 минут
Спасите уже наконец глупого.... 4 часа не могу данные из QString в первый элемент массива типа double запихнуть с учетом того, что в QString только числа могут быть...
0
Анна по жизни
270 / 161 / 60
Регистрация: 13.03.2019
Сообщений: 396
09.07.2019, 15:37 7
Цитата Сообщение от MetMark Посмотреть сообщение
ак метод data() использует QChar,
Прадон, не доглядела.

C++ (Qt)
1
2
QString str(" какой-то текст");
const char *s = str.toLocal8Bit().data();
А что тебе мешает преобразовывать методом QString::toDouble()?

C++ (Qt)
1
2
3
4
5
QStringList list = NewDialog->Successfull().split(" "); // куски, разделённые пробелом, будут положены в список
 
// дальше в цикле
bool ok;
saveInputData[i] = list.at(i).toDouble(&ok);
Добавлено через 10 минут
Цитата Сообщение от MetMark Посмотреть сообщение
4 часа не могу данные из QString в первый элемент массива типа double запихнуть
На самом деле запрос в гугл "QString в char*" вывалит кучу ответов. Обычно, я начинаю запрос "qt " дальше суть вопроса. после двух-трёх вариантов вопроса ответ находится. Главное, правильно сформулировать вопрос.

Добавлено через 10 минут
И ещё вопрос до кучи, если результат работы NewDialog перерабатывается в массив чисел, то не проще ли сразу возвращать QList<double>, а преобразование строки в double делать внутри диалога сразу же после ввода?
0
MetMark
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 199
09.07.2019, 17:03  [ТС] 8
Цитата Сообщение от Анна по жизни Посмотреть сообщение
list.at(i).toDouble(&ok);
Не понял откуда вы взяли "list" "at(i)" и зачем ссылка на переменную bool?

Цитата Сообщение от Анна по жизни Посмотреть сообщение
И ещё вопрос до кучи, если результат работы NewDialog перерабатывается в массив чисел, то не проще ли сразу возвращать QList<double>, а преобразование строки в double делать внутри диалога сразу же после ввода?
NewDialog - это мой кастомный QDialog. Там пользователь вводит числа в QLineEdit, а LineEdit возвращает QString.
В итоге я должен из n-го количества QString получить либо массив либо QList из чисел типа double и важно, чтобы они были в том порядке, в котором вводит их пользователь. Массивы я понимаю по моим меркам хорошо, по этому и взялся работать именно с массивом.
Про QList<T> я уже и насмотрелся и начитался, но до сих пор не все понимаю. QList для меня это что-то вроде как изведанное, но страшное (а вдруг что-то не так сделаю). Я много не понимаю к примеру:
1. .count() с помощью него можно перечислить элементы. Но в QList<T> отсчет идет с 0 или с 1? Что будет если просто написать такой вид, что вернет?
2. Как скопировать данные из одного заполненного списка в другой пустой? Я читал где-то, что есть какая-то функция копирования. А если написать просто QList<T *> First = QList<T *> Second (Разумеется Уже в объявленном виде First = Second). Компилятор на такую запись ошибок не выдает.
Так же в Visual Basic был в плане переноса из одного типа в другой простой синтаксис:
Visual Basic
1
Variable = cin(var)
(Точно уже не помню как там, но что-то в таком духе). И тут из любого типа данных можно перевести в integer, а если надо в string, то cstr, а в скобках то, какое значение Variable будет принимать после перевода, можно к примеру еще прибавить в них что-нибудь, или успеть перед изменением типа округлить и т.д.
Тут как-то не могу проследовать логику смены типов. Слава Богу вы хоть мне что-то объясняете простым русским языком, для меня простого смертного. Спасибо вам еще и еще раз...

Цитата Сообщение от Анна по жизни Посмотреть сообщение
list.at(i)
К чему я VB сюды впихнул? Та вот, нельзя почему-то просто из QString в double перевести с помощью "saveInputData[i].toDouble" еще что-то нужно написать, а это еще что-то нужно понять. Эх... наверное за это я и люблю программирование. А низкоуровневый С++ мне нравится, хоть и куча всякого непонятного присутствует для меня...

Воспользовавшись вашим ответом и вашими подсказками написал так:
C++ (Qt)
1
saveInputData[i] = ThisIsText.toDouble();
0
Анна по жизни
270 / 161 / 60
Регистрация: 13.03.2019
Сообщений: 396
09.07.2019, 17:24 9
Цитата Сообщение от MetMark Посмотреть сообщение
важно, чтобы они были в том порядке
QList::append() - добавляет в конец списка. в каком порядке положил, в том и будет лежать. Практически это то же самое, что и vector.
Цитата Сообщение от MetMark Посмотреть сообщение
Но в QList<T> отсчет идет с 0 или с 1?
Как принято в C. Конечно же с 0!

Цитата Сообщение от MetMark Посмотреть сообщение
Как скопировать данные из одного заполненного списка в другой пустой?
QList<int> l1;
l1.append(5);
l1.append(7);
l1.append(10);

QList<int> l2;

l2 = l1;

// l2[0] содержит 5, l2[1] содержит 7, l2[2] содержит 10.


Цитата Сообщение от MetMark Посмотреть сообщение
Та вот, нельзя почему-то просто из QString в double перевести с помощью "saveInputData[i].toDouble" еще что-то нужно написать, а это еще что-то нужно понять.
да без проблем!

double d = list[i].toDouble();

Метод QString::at() эквивалентен оператору [], если речь идёт о получении значения с каким-то индексом. Я больше люблю пользоваться методами, а не операторами, потому что в большом коде, где есть и экземпляры QList и экземпляры классических массивов, сразу видно, что за "зверь" перед тобой. dt.at(n) - значит, dt типа QList, если dt[i], значит, dt - классический массив.

Добавлено через 3 минуты
Зато QList можно вернуть как результат выполнения метода, а классический массив можно вернуть из метода только посредством выделения памяти и возвращением указателя, что чревато - обычно удалять забывают.
0
MetMark
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 199
09.07.2019, 17:31  [ТС] 10
Анна по жизни,
Цитата Сообщение от Анна по жизни Посмотреть сообщение
Зато QList можно вернуть как результат выполнения метода, а классический массив можно вернуть из метода только посредством выделения памяти и возвращением указателя, что чревато - обычно удалять забывают.
Попробую создать QList<double *> variables для чисел. А variables удалять не надо?
Спасибо большое за разъяснение о QList<T>, стало понятнее, спасибо еще раз большое!
0
Анна по жизни
270 / 161 / 60
Регистрация: 13.03.2019
Сообщений: 396
09.07.2019, 17:56 11
Цитата Сообщение от MetMark Посмотреть сообщение
QList<double *> variables
QList<double> variables
Зачем тебе указатели на doble, если тебе нужны сами double?

в .h файле диалога объявляешь член класса variables:

C++ (Qt)
1
QList<double> variables;
.cpp твоего диалога:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
// в слоте который отвечает за получение числа из lineEdit пишешь:
 
bool ok;
double d = lineEdit->text().toDouble(&ok);
if(!*ok) // человек ошибся вовводе и строку нельзя преобразовать
   {
// ругаемся, отправляем снова на ввод
   }
else
   variables.append(d);
Метод Successfull() теперь будет выглядеть так:

C++ (Qt)
1
2
3
4
QList<double> Successfull() const
{
   return variables;
}
в том месте, где тебе надо получить результаты ввода чисел:

C++ (Qt)
1
QList<double> list = NewDialog->Successfull();
всё. теперь ты можешь делать со списком, что угодно, например, в цикле скопировать его значения в классический массив.
Зато тебе гарантировано, что в списке только правильно введённые числа.
0
MetMark
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 199
09.07.2019, 19:09  [ТС] 12
Цитата Сообщение от Анна по жизни Посмотреть сообщение
QList<double> variables;
А так можно было!? Ваааа... Спасибо огромное. Вы мне показали реальные преимущества перед обычными массивами!

Вот эта ошибка заколебала, раз через раз вылазит, когда как...

Добавлено через 53 минуты
ASSERT failure in QList<T>::operator[]: "index out of range", file C:\Qt\Qt5.13.0\5.13.0\mingw73_32\include/QtCore/qlist.h, line 568
20:55:41: Программа неожиданно завершилась.

Еще вот это висит и не пропадает... Что с ним делать, понятия не имею:

:-1: ошибка: Возникло исключение:
Exception at 0x1275f57e, code: 0xc0000602: , flags=0x0.
0
TRam_
зомбяк
1246 / 936 / 278
Регистрация: 14.05.2017
Сообщений: 3,044
09.07.2019, 19:35 13
Цитата Сообщение от MetMark Посмотреть сообщение
Что с ним делать, понятия не имею
Обращаешься к номеру элемента, которого нет в массиве, т.к. массив меньше по размеру.

Добавлено через 6 минут
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
QList<double> variables; // .h файле диалога объявляешь член класса variables
 
 
........
 
variables.clear();
QStringList list = lineEdit->text().split(" ");
for(int i = 0; i < list.size() ; i++)    // можно записать короче, но для новичка думаю понятнее будет так
{
bool ok;
double d = list[i].toDouble(&ok);
if(!*ok)
   {
// ругаемся, отправляем снова на ввод
   }
else
   variables.append(d);
0
MetMark
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 199
09.07.2019, 21:09  [ТС] 14
Ошибку исправил
0
DrOffset
10699 / 5718 / 1406
Регистрация: 30.01.2014
Сообщений: 9,182
11.07.2019, 14:41 15
Цитата Сообщение от Анна по жизни Посмотреть сообщение
C++
1
const char *s = str.toLocal8Bit().data();
Так нельзя делать
toLocal8Bit создаст временный объект QByteArray, которой помрет в конце этого выражения, а указатель s останется указывать на освобожденную память.
0
Анна по жизни
270 / 161 / 60
Регистрация: 13.03.2019
Сообщений: 396
11.07.2019, 16:27 16
Лучший ответ Сообщение было отмечено MetMark как решение

Решение

Цитата Сообщение от DrOffset Посмотреть сообщение
Так нельзя делать
Можно указатель, который возвращается подобным образом валиден, пока существует str. Даже в документации есть такое употребление:

You can also pass string literals to functions that take QStrings as arguments, invoking the QString(const char *) constructor. Similarly, you can pass a QString to a function that takes a const char * argument using the qPrintable() macro which returns the given QString as a const char *. This is equivalent to calling <QString>.toLocal8Bit().constData().
QByteArray очень хитрый класс. Если создать его экземпляр через конструктор, получающий указатель на массив и длину массива, будет сделана копия массива. Но если QByteArray создаётся через функцию QByteArray::fromRawData(const char *data, int size), то никакого копирования не происходит, QByteArray работает с указателем на исходный массив.

Цитата Сообщение от DrOffset Посмотреть сообщение
временный объект QByteArray, которой помрет в конце этого выражения,
не уверена, что помирает он в конце выражения. Впрочем, он нам и не нужен. Это же фантик! Конфета находится в data().

Добавлено через 19 минут
Цитата Сообщение от Анна по жизни Посмотреть сообщение
Можно указатель, который возвращается подобным образом валиден, пока существует str.
То есть
Можно. Указатель, который возвращается подобным образом, валиден, пока существует str.
1
MetMark
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 199
11.07.2019, 16:32  [ТС] 17
Анна по жизни, Такая ситуация. В QLabel очень много текста. Не подскажите с помощью чего луше организовать прокрутку текста? Спасибо за предыдущие советы, сейчас сажусь все воспроизводить
0
Анна по жизни
270 / 161 / 60
Регистрация: 13.03.2019
Сообщений: 396
11.07.2019, 16:39 18
Лучший ответ Сообщение было отмечено MetMark как решение

Решение

MetMark, прокрутка текста есть у QTextBrowser
0
MetMark
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 199
11.07.2019, 16:40  [ТС] 19
Анна по жизни, Спасибо огроменное вам!!!!
0
Анна по жизни
11.07.2019, 16:46     Перевод из QString в double[]
  #20

Не по теме:

Цитата Сообщение от MetMark Посмотреть сообщение
Анна по жизни, Спасибо огроменное вам!!!!
ожно просто нажать первую справа внизу кнопочку.

0
11.07.2019, 16:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2019, 16:46
Привет! Вот еще темы с ответами:

Перевод char* to qstring
Всем доброго времени суток, подскажите как перевести из char* в qstring, именно так. Собственно я...

Перевод из QString в uint16_t
Как перевести?

Перевод lpcstr to qstring
Здравствуйте, я получаю дескриптор проецируемого объекта: LPCTSTR pBuf; pBuf =...


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

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

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