crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Чтение бинарного файла (в дебаге нормально, в релизе нет)
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
sidsukana Дата 29.5.2011, 15:50
  Разобрался, была утечка в
char* ch = new char[1];

ufna Дата 29.5.2011, 12:56
  Основная идея - где-то что-то не инициализировано.
sidsukana Дата 29.5.2011, 10:50
  Нет никаких идей? Может какие флаги компиляции? Но все равно это было бы странно.
sidsukana Дата 27.5.2011, 16:01
  В общем есть функция считывания таблицы из бинарного файла, ячейка со строкой содержит смещение в строковом блоке. Все работает, но только в дебаге. В релизе некоторые строки непонятным образом пропадают, и всегда разные. В дебаге все полностью читается.

Функция
Раскрывающийся текст
void DTObject::Load()
{
    ThreadSet(THREAD_OPENFILE);

    // Timer
    QTime m_time;
    m_time.start();

    QFile m_file(m_fileName);
        
    if (!m_file.open(QIODevice::ReadOnly))
    {
        ThreadUnset(THREAD_OPENFILE);
        return;
    }

    // Head bytes
    QByteArray head;
    head = m_file.read(20);

    quint32 m_header;

    m_header        = *reinterpret_cast<quint32*>(head.mid(0, 4).data());
    m_recordCount   = *reinterpret_cast<quint32*>(head.mid(4, 4).data());
    m_fieldCount    = *reinterpret_cast<quint32*>(head.mid(8, 4).data());
    m_recordSize    = *reinterpret_cast<quint32*>(head.mid(12, 4).data());
    m_stringSize    = *reinterpret_cast<quint32*>(head.mid(16, 4).data());

    // Check 'WDBC'
    if (m_header != 0x43424457)
    {
        ThreadUnset(THREAD_OPENFILE);
        return;
    }

    QByteArray  dataBytes;
    QByteArray  stringBytes;
    QStringList recordList;
    quint32 offset = 0;

    // Data bytes
    m_file.seek(20);
    dataBytes = m_file.read(m_recordSize * m_recordCount);

    // String bytes
    m_file.seek(20 + m_recordSize * m_recordCount);
    stringBytes = m_file.read(m_stringSize);

    DBCTableModel* model = new DBCTableModel(m_form, this);
    model->clear();
    model->setFieldNames(m_fieldNames);

    QApplication::postEvent(m_form, new ProgressBar(m_recordCount - 1, BAR_SIZE));

    for (quint32 i = 0; i < m_recordCount; i++)
    {
        recordList.clear();
        for (quint32 j = 0; j < m_fieldCount; j++)
        {
            switch (GetFieldType(j).toAscii())
            {
                case 'u':
                {
                    quint32 value = *reinterpret_cast<quint32*>(dataBytes.mid(offset, 4).data());
                    recordList.append(QString("%0").arg(value));
                    offset += 4;
                }
                break;
                case 'i':
                {
                    qint32 value = *reinterpret_cast<qint32*>(dataBytes.mid(offset, 4).data());
                    recordList.append(QString("%0").arg(value));
                    offset += 4;
                }
                break;
                case 'f':
                {
                    float value = *reinterpret_cast<float*>(dataBytes.mid(offset, 4).data());
                    recordList.append(QString("%0").arg(value));
                    offset += 4;
                }
                break;
                case 's':
                {
                    quint32 value = *reinterpret_cast<quint32*>(dataBytes.mid(offset, 4).data());

                    if (value)
                    {
                        char* ch = new char[1];

                        quint32 length = 0;

                        while (ch[0] != 0)
                        {
                            ch[0] = stringBytes.at(value+length);
                            if (ch[0] != 0)
                                length++;
                        }

                        QString str("");
                        while (str.isEmpty())
                        {
                            str = QString("%0").arg(stringBytes.mid(value, length).data());
                        }
                        recordList.append(str);
                    }
                    else
                        recordList.append(QString(""));

                    offset += 4;
                }
                break;
                default:
                {
                    quint32 value = *reinterpret_cast<quint32*>(dataBytes.mid(offset, 4).data());
                    recordList.append(QString("%0").arg(value));
                    offset += 4;
                }
                break;
            }
        }
        model->appendRecord(recordList);
        QApplication::postEvent(m_form, new ProgressBar(i, BAR_STEP));
    }

    QApplication::postEvent(m_form, new SendModel(m_form, model));

    m_file.close();

    QString stime(QString("Load time (ms): %0").arg(m_time.elapsed()));

    QApplication::postEvent(m_form, new SendText(m_form, 1, stime));

    ThreadUnset(THREAD_OPENFILE);
}


Код для проверки вставлен в кейз строки, и даже с ним str всегда пустая, хотя смещение есть и там совершенно точно содержится строка, так как в дебаге с проверочным циклом тоже все отлично работает.
Раскрывающийся текст
QString str("");
                        while (str.isEmpty())
                        {
                            str = QString("%0").arg(stringBytes.mid(value, length).data());
                        }
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 23.7.2019, 5:39