2011-09-14 6 views
0

이 두 함수는 QVector를 serialize하려는 제 시도입니다. 불행히도 내 상사는 구현이 Qt 독립적이며 QDataStream이 헤더를 앞에 둡니다 때문에 QDataStream을 사용할 수 없습니다. 따라서 문제는 binToVector 함수가 반환하는 벡터가 크기가 0과 같음을 반환하지만 요소가 인쇄되면 원래 벡터와 같습니다. 왜 벡터의 요소가 원본과 같은 경우 반환되는 크기가 0입니까? 이러한 직렬화 함수는 괜찮습니까? 나는 그것을 구현하기 위해 Qt 함수를 향상시킬 수 없다. 오직 C++만이 가능하다.QVector size() 반환 크기가 0입니다.

QByteArray vectorToBin(const QVector<qint32> & vec) 
{ 
    QByteArray result; 
    foreach(quint32 e, vec) { 
    char *src = reinterpret_cast<char*>(&e); 
    result.append(src, sizeof(qint32)); 
    } 
    return result; 
} 

QVector<qint32> binToVector(const QByteArray & bytes) 
{ 
    int size = sizeof(qint32); 
    QVector<qint32> result; 
    result.reserve(bytes.count()/size); 
    int j=0; 
    for(int i=0; i<bytes.count(); i+=size) { 
    memcpy(&result[j++], bytes.constData()+i, size); 
    } 
    return result; 
} 
+0

사장님, QT를 사용하지 않고 QT 데이터 구조를 직렬화 하시겠습니까? – Puppy

+0

이미 QVector를 사용하고 있으므로 구현은 Qt와 독립적 일 수 없습니다. 그것의 헤더 문제라면 앞으로 선언을 시도하십시오. QDataStream이 작성한 것은 기본적으로 휠을 다시 작성하는 것입니다. 상사에게 그가 바퀴를 재발견 할 수 있는지 물어보십시오.) – blueskin

+1

종류, @DeadMG. 그는 * 발생하는 데이터를 프로젝트의 현재 화신에있는 Qt 데이터 구조에 저장하도록 직렬화하려고합니다. 그는 언젠가 특정 Qt 클래스 이외의 다른 것을 사용하기로 결정하거나 다른 비 Qt 사용 프로젝트가 동일한 직렬화 된 데이터를 사용할 수있게하려는 경우 Qt의 직렬화 형식에 묶기를 원하지 않습니다. . –

답변

6

당신은 클래스 스토리지로 사용하는 메모리를 할당하지만 실제로 컨테이너에 실제 요소의 수를 변경하지 않습니다 QVector::reserve를 호출하고 있습니다. 이를 위해서는 QVector::resize이 필요합니다. 표준 C++ vector 클래스도 같은 방식으로 작동합니다. 공간을 미리 예약하면 append에 대한 향후 반복 호출은 항상 컨테이너의 저장소를 다시 할당 할 필요가 없습니다.

+0

빙고! 답변 해주셔서 감사합니다. –

관련 문제