Russian Qt Forum

Qt => Общие вопросы => Тема начата: Kosh от Декабрь 27, 2006, 17:16



Название: QValueList... можно ли так делать?
Отправлено: 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] = ...;


Подскажите, какой вариант правильный.


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

Хотя если честно я не понимаю как он аппенд делает тогда.......


Название: QValueList... можно ли так делать?
Отправлено: Kosh от Декабрь 27, 2006, 18:09
Втом-то и дело, что это не строки. Вобщем, скорей всего это второй вариант.  Хотя пробовала так
Код:

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

никакого удара по памяти не состоялось. Вот это меня удивляет и пугает. А вдруг, они наворотили,так что создаётся список массивов?
А, всё равно буду второй вариант использовать... Все равно скоро Новый год!!! ) и голова уже не варит, а пальцы цепляются за соседние клавиши.


Название: QValueList... можно ли так делать?
Отправлено: Dendy от Декабрь 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. Хотя в Вашем случае ето не имеет значения.


Название: QValueList... можно ли так делать?
Отправлено: Tonal от Декабрь 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;


Название: QValueList... можно ли так делать?
Отправлено: Kosh от Январь 09, 2007, 16:48
Цитата: "Tonal"
Можно ещё совсем просто...

Этим и кончилось. Спасибо.