2013-09-19 4 views
0

Я использовал MapVirtualFile для сопоставления файла под окном, используя C++ VS2010. Пустота являетсяMemCpy на векторе structs

void*     m_pVoiceData; 

Теперь я хотел бы, чтобы заполнить вектор с структур данных.

структура является

struct udtPitchmark 
{ 
    unsigned long ByteStart; 
    unsigned long ByteCount; 
    unsigned long F0; 
}; 

struct udtPitchmarks 
{ 
    vector<udtPitchmark>Pitchmarks; 
}; 

Я использую

void clsMapping::FeedPitchmarksFromMap(udtPitchmarks &uAudioInfo,unsigned long int uBytePos) 
{ 

    unsigned int iCountPM; 
    memcpy(&iCountPM, &((char*)(m_pVoiceData))[uBytePos],sizeof(unsigned long)); 

    uAudioInfo.Pitchmarks.resize(iCountPM); 

    for (unsigned int i=0;i<iCountPM;i++) 
    { 
     iBytePos+=sizeof(unsigned long); 
     unsigned long int iByteStart; 
     memcpy(&iByteStart, &((char*)(m_pVoiceData))[iBytePos],4); 

     iBytePos+=sizeof(unsigned long); 
     unsigned long int iByteCount; 
     memcpy(&iByteCount, &((char*)(m_pVoiceData))[iBytePos],4); 

     iBytePos+=sizeof(unsigned long); 
     unsigned int iF0; 
     memcpy(&iF0, &((char*)(m_pVoiceData))[iBytePos],4); 

     uAudioInfo.Pitchmarks[i].ByteStart =iByteStart; 
     uAudioInfo.Pitchmarks[i].ByteCount =iByteCount; 
     uAudioInfo.Pitchmarks[i].F0 =iF0; 
    } 
} 

Есть 3 тетср, участвующие в каждом pitchmark. Но я надеюсь, что смогу сразу прочитать ВСЕ отметки. Однако я не уверен, как это сделать.

В Структуры, где хранятся так:

vector<udtPitchmarks>::iterator it = nPitchmarks.Content().begin(); 
for (;it != nPitchmarks.Content().end(); ++it) 
{ 
    unsigned int iCountPMs = it->Pitchmarks.size(); 
    fwrite(&iCountPMs,sizeof(unsigned int),1,outfile); 

    vector<udtPitchmark>::iterator it2 = it->Pitchmarks.begin(); 
    for(;it2 != it->Pitchmarks.end(); ++it2) 
    { 
     fwrite(&it2->ByteStart,sizeof(unsigned long),1,outfile); 
     fwrite(&it2->ByteCount,sizeof(unsigned long),1,outfile); 
     fwrite(&it2->F0,sizeof(unsigned long),1,outfile); 
    } 
} 

Может кто-нибудь помочь?

+1

Использование 'unsigned long [3]', тогда вы можете заполните его за один раз. –

+0

Я отредактировал мое сообщение так, чтобы все 3 участника были без знака уже сейчас. Предположим, что есть 10 пиктограмм ... Можете ли вы опубликовать образец того, как я могу заполнить их все в один спешка? – tmighty

+0

Это прекрасно? memcpy (& uAudioInfo.Pitchmarks [0], & ((char *) (m_pVoiceData)) [iBytePos], sizeof (unsigned long) * 3 * 10); – tmighty

ответ

1

вы можете прочитать всю структуру udtPitchmark сразу

m_pVoiceData = (char *)m_pVoiceData + sizeof(unsigned int); // size field 

memcpy(&uAudioInfo.Pitchmarks[i], (udtPitchmark *)m_pVoiceData + i, sizeof udtPitchmark);

или весь вектор:

memcpy(&uAudioInfo.Pitchmarks[0], (udtPitchmark *)m_pVoiceData, sizeof(udtPitchmark) * iCountPM);

+0

Я пробовал memcpy (& uAudioInfo.Pitchmarks [0], & ((udtPitchmark *) (m_pVoiceData)) [iBytePos], sizeof (udtPitchmark) * iCountPM); теперь, что близко к вашему предложению, а также включает положение байта, в котором находятся структуры, но я получаю здесь исключение. Вы уверены, что правы? – tmighty

+0

Теперь я также опубликовал способ хранения данных. – tmighty

+0

вы не должны смешивать udtPitchmark * и iBytePos offset. –

0

Если вы выкладываете свои данные из массива, вы можете написать ему за один раз. Функции Accessor может помочь вам поддерживать читаемый интерфейс:

struct Pitchmark 
{ 
    unsigned long data[3]; 

    unsigned long & start() { return data[0]; } 
    unsigned long & count() { return data[1]; } 
    unsigned long & f0() { return data[2]; } 

    unsigned char * ptr() { return static_cast<unsigned char *>(data); } 
}; 

Pitchmark pm; 
memcpy(pm.ptr(), m_pVoiceData, sizeof pm.data); 

 Смежные вопросы

  • Нет связанных вопросов^_^