Russian Qt Forum
Ноябрь 24, 2024, 06:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Строки в стеке или в куче ?  (Прочитано 26467 раз)
Sahab
Гость
« Ответ #15 : Март 09, 2011, 11:21 »

а если страничка больше указанного размера?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Март 09, 2011, 11:35 »

Только что написал, интерфейс использует массив char bufBig[1024 * 200]
для скачки web-страницы полностью. Она 200К и парсим ее.

Уйти на другой тип ? А смысл ?!! Все равно где хранить.

Пока скачиваю ее полностью в этот массив.
Ну и делайте то же самое но через вектор, который прекрасно приводится к C массиву. А потом дойдут руки до того как узнать размер страницы - и у Вас все уже готово/на руках. А то char bufBig[1024 * 200] напоминает злобного носорога с плохим зрением  Улыбающийся
Записан
Etud
Гость
« Ответ #17 : Март 09, 2011, 12:11 »

а если страничка больше указанного размера?

Почему больше ? 120-140К
Как раз все влазит.

Ну и делайте то же самое но через вектор, который прекрасно приводится к C массиву. А потом дойдут руки до того как узнать размер страницы - и у Вас все уже готово/на руках. А то char bufBig[1024 * 200] напоминает злобного носорога с плохим зрением  Улыбающийся

Размер HTML-страницы я уже знаю из заголовка.

А чем лучше для хранения тип QVector<char> по сравнению с массивом char.
Тем, что я сразу жестко отвел 200К (уже в куче).

Так может динамически его выделять просто.
Размер массива будет выделен в зависимости от размера в заголовке.

Все одно хранить, потом парсить !
« Последнее редактирование: Март 09, 2011, 12:13 от Etud » Записан
twp
Гость
« Ответ #18 : Март 09, 2011, 13:06 »

А чем лучше для хранения тип QVector<char> по сравнению с массивом char.
Тем, что я сразу жестко отвел 200К (уже в куче).
Захаркодить размер массива в программе? Хм, довольно сомнительный аргумент. Такое решение может быть хорошим только для лаборатороки или теста. Оптимальным решением было бы изначально хранить все в QString, но я не уверен возможно ли это сделать в данном контексте.
Записан
Etud
Гость
« Ответ #19 : Март 09, 2011, 13:14 »

Захаркодить размер массива в программе? Хм, довольно сомнительный аргумент. Такое решение может быть хорошим только для лаборатороки или теста.

Предлагаете динамически выделить в зависимости от размера web-страницы ?

Igors уже предлагал QVector<char>, только вот смысла пока не пойму.
И так и так массив в памяти выделять.

Оптимальным решением было бы изначально хранить все в QString, но я не уверен возможно ли это сделать в данном контексте.

Так данные же скачиваются постепенно (web-страница) и складываются в массив char.

Хех !

Вот и решение, убивающее 2-х зайцев:
отказаться от большого массива, складывать сразу все в QString через маленький буффер (1024 байта).
« Последнее редактирование: Март 09, 2011, 13:22 от Etud » Записан
brankovic
Гость
« Ответ #20 : Март 09, 2011, 13:21 »

А чем лучше для хранения тип QVector<char> по сравнению с массивом char.

Вектор просто удобный и безопасный интерфейс к оператору new. Можно написать так:

Код
C++ (Qt)
char *buf = new char [size];
read (fd, buf, size);
...
delete [] buf;
 

а можно так:

Код
C++ (Qt)
std::vector <char> v (size);
read (fd, &v[0], v.size ());
...
 

и даже так:

Код
C++ (Qt)
char buf [size];
read (fd, buf, size);
...
 

Вариант 1 самый громоздкий, плюс надо предусмотреть возможность вылета исключения, не проскочить delete и т.д. Вариант 3 самый быстрый, но неудобный, ненадёжный и нестандартный. А вариант 2 самый простой. Им пользоваться лучше всего, потому что легче всего.
Записан
Etud
Гость
« Ответ #21 : Март 09, 2011, 13:43 »

Эээ, наверное забыл написать, что данные приходят в малый буффер (char buff[1024]).

А потому:
Цитировать
Отказываемя от большого массива, складываем сразу все в QString из маленького буффера (1024 байта).

Только как лучше:

1) Повторно перераспределять память:
 
Код
C++ (Qt)
QString str;
str += QString(buff);

2) Более гибко управлять памятью без перераспределения :

Код
C++ (Qt)
QString str;
int len = 0;
str.reserve(maxLen);
while (...)
{
str[len] = QString(buff);
len = len + 1024;
}
 
str.squeeze();
 

Это набросок просто.

QString нужен, поскольку web-страница в кодировке UTF-8.
« Последнее редактирование: Март 09, 2011, 13:46 от Etud » Записан
brankovic
Гость
« Ответ #22 : Март 09, 2011, 13:57 »

Только как лучше:

1) Повторно перераспределять память:
 
Код
C++ (Qt)
QString str;
str += QString(buff);

2) Более гибко управлять памятью без перераспределения :

лучше 1, поскольку 2 ничего особо не даст (ну может копейки какие) ((интересно, это сработает, если utf8 символ разрежет границей буфера?))
Записан
Etud
Гость
« Ответ #23 : Март 09, 2011, 14:36 »

интересно, это сработает, если utf8 символ разрежет границей буфера?))

Вроде пашет. Русские символы пишет.
Хотя нужен всего title.  Смеющийся

Да, решил вроде узкое место !
Записан
twp
Гость
« Ответ #24 : Март 09, 2011, 14:42 »

а мне больше по душе вариант без распределения, только можно сделать проще, как в примере из асистента:
Код:
result.reserve(maxSize);
while (condition)
    result.append(buf);
result.squeeze();

Цитировать
интересно, это сработает, если utf8 символ разрежет границей буфера?
скорее всего будут проблемы
Записан
Etud
Гость
« Ответ #25 : Март 09, 2011, 14:53 »

а мне больше по душе вариант без распределения.

Да, правильнее.

Цитировать
скорее всего будут проблемы

Вроде 1024 успешно делится на 2 ?!!

Что предлагаете ?
« Последнее редактирование: Март 09, 2011, 15:16 от Etud » Записан
twp
Гость
« Ответ #26 : Март 09, 2011, 15:38 »

делится то оно делится, просто UTF-8 символ может иметь размер от 1 до 4 байт и чтоб программа корректно работала с любым языком все-таки наверно придется накапливать данные как было предложено раннее в QVector<char> или QByteArray, а затем конвертануть (а не просто приравнять) в QString через
Код:
QString QString::fromUtf8 ( const char * str, int size = -1 ) [static]
Записан
fuCtor
Гость
« Ответ #27 : Март 09, 2011, 17:59 »

Просто как вариант: если страница является валидным XML (тобишь XHTML), то можно попробовать использовать для парсинга данных http://doc.qt.nokia.com/4.7/qxmlstreamreader.html.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Март 10, 2011, 11:34 »

Код
C++ (Qt)
char buf [size];
 
Прекрасная, удобная конструкция - но увы, эта радость только на gcc, на Вындоуз "так нельзя"  Плачущий

По теме: связываться с QString, на мой взгляд, здесь не следует - он предназначен для строк и будет париться с кодировкой. Просто вектор, тем более что размер загружаемых данных известен

Код
C++ (Qt)
QVector <char> vec;
vec.resize(pageSize);
char * buf = &vec[0]; // C массив готов
.. // все как сейчас
 
// надо увеличить размер буфера
vec.resize(vec.size() + extra);
buf = &vec[0]; // надо перезарядить адрес массива
 
« Последнее редактирование: Март 10, 2011, 11:51 от Igors » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #29 : Март 10, 2011, 11:42 »

вектор чаров О_о а QByteArray чем не угодил??
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.271 секунд. Запросов: 23.