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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QValueList... можно ли так делать?  (Прочитано 5358 раз)
Kosh
Гость
« : Декабрь 27, 2006, 17:16 »

Мне надо хранить список массивов char[256].  Я использовала QValueList
Код:

QValueList<char*> codes;
...
char c[256];
...
c[i]=...;
codes.append(c);


только гложет сомнение, не является ли в этом случае codes списком указателей.
Может надо так?
Код:

QValueList <char*> codes;
char *c;
codes.append(c);
codes[codes.count()-1] = new char [256]
codes[codes.count()-1][i] = ...;


Подскажите, какой вариант правильный.
Записан
Alexandr Az
Гость
« Ответ #1 : Декабрь 27, 2006, 17:35 »

В любом случае у Вас будет список указателей, т.к. вы определили шаблон с char*. Если бы можно было бы записать QValueList<char[256]>, то у Вас хранились бы реальные значения. char - не класс, а тип С, посему у него не может быть конструктора копирования. А что страшного что указатели? (кроме того что нужно следить за освобождением ресурсов). Можете использовать QStringList для хранения строк (если у вас конечно строки) и преобразовывать его к char когда нужно...

Хотя если честно я не понимаю как он аппенд делает тогда.......
Записан
Kosh
Гость
« Ответ #2 : Декабрь 27, 2006, 18:09 »

Втом-то и дело, что это не строки. Вобщем, скорей всего это второй вариант.  Хотя пробовала так
Код:

QValueList<char*> codes;
...
char c[256];
codes.append(c);
stream.readRawBytes(codes(codes.count()-1), 256);

никакого удара по памяти не состоялось. Вот это меня удивляет и пугает. А вдруг, они наворотили,так что создаётся список массивов?
А, всё равно буду второй вариант использовать... Все равно скоро Новый год!!! ) и голова уже не варит, а пальцы цепляются за соседние клавиши.
Записан
Dendy
Гость
« Ответ #3 : Декабрь 27, 2006, 18:59 »

Указатель, он и в Африке указатель. Никто кроме Вас не знает, откуда вьІ будете его инициализировать, вьІделять в куче кусок памяти или требуется набор ссьІлок на уже вьІделенную память, например, для скорости обращения.

В любом из случаев Ваша задача идентична такой:

Код:
QValueList<QByteArray> codes;


Нужно вьІделить память, делаете так:
Код:
codes << QByteArray( 256, 0 );


Нужно проинициализировать указателями на уже готовьІе данньІе, делаете так:
Код:
codes << another_code;


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

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

Ваш последний пример довольно... странньІй.

Код:
QValueList<char*> codes; 
...
char c[256];
codes.append(c);
stream.readRawBytes(codes(codes.count()-1), 256);


ВьІ сохраняете в codes указатель на статический буфер. Потом читаете из потока в етот указатель, то-есть в статическую переменную c. Почему бьІ тогда просто не записать:

Код:
char c[256]; 
stream.readRawBytes(c, 256);


Подозреваю, что считанньІе данньІе нужно сохранить для дальнейшей обработке, например, если codes глобальная переменная, или вот так:

Код:
QValueList<char*> codes; 
...
char c[256];
codes.append(c);
stream.readRawBytes(codes(codes.count()-1), 256);
return codes;


Только вот в Вашем варианте ничего не получится. При вьІходе из функции статическая память очистится и в списке значений codes будут лежать указатели на мусор.

Советую делать через QValueList<QByteArray>. Только помните, что в Qt3 в отличии от Qt4 класс QByteArray Explicitly Shared, а не Implicitly Shared. Хотя в Вашем случае ето не имеет значения.
Записан
Tonal
Гость
« Ответ #4 : Декабрь 27, 2006, 20:09 »

Можно ещё совсем просто:
Код:

struct buf_t {
  char c[256];
  buf_t() {}
  buf_t(const char buf[256]) {
    memcpy(c, buf, 256);
  }
  char* get() {return c;}
};
QValueList<buf_t> codes;
...
codes.append(buf_t());
stream.readRawBytes(codes(codes.count()-1).get(), 256);
return codes;
Записан
Kosh
Гость
« Ответ #5 : Январь 09, 2007, 16:48 »

Цитата: "Tonal"
Можно ещё совсем просто...

Этим и кончилось. Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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