1

データのチャンクを識別するためにテンプレート (GUID) を配置した txt ファイルを解析しています...ファイル内の STRING 変数の解析に問題があります。解析中に、データ型のサイズを反復処理する DataPtr オブジェクトを使用しています...問題は、(文字列を読み取った後) 次の文字列に移動するために、文字列のサイズを正しく計算できないことです。データ・タイプ。解析するファイルの例を次に示します。

xof 0303txt 0032

template Effect {
  <C7D92586-6C57-42d3-8F03-0BDF87EC1848>
  STRING filename;
}

template Light {
  <ADA248C7-97E3-4a42-A4C1-74EE8536FF37>
  DWORD type;
  array float position[3];
  array float direction[3];
  array float ambient[4];
  array float diffuse[4];
  array float specular[4];
  float power;
}

template Object {
  <B6494248-7D84-42d3-A4AA-0747E22E08D3>
  DWORD type;  
  array float position[3];
  array float orientation[4];
  STRING name;
  STRING filename;
}

Effect {
    ".//Data/Scene/TrainingRoom/Effects/effect.fx";
}

Light {
    1;
    -3.0; 1.0; -3.0;
    3.0; -1.0; 3.0;
    1.0; 1.0; 1.0; 1.0;
    1.0; 0.0; 0.0; 0.0;
    1.0; 1.0; 1.0; 1.0;
    0.1;
}

Object {
    1;
    0.0; 0.0; 0.0;
    0.0; 0.0; 0.0; 1.0;
    ".//Data/Scene/TrainingRoom/TrainingRoom.x";
}

現在動作しているコードの例を次に示します (文字列タグなし):

if(CompareDataObjectType(pDataObj, TID_D3DRMLightCustom))
    {
        D3DXVECTOR3 *vecPtr = NULL;
        D3DXVECTOR4 *colorPtr = NULL;
        DWORD *DataPtr = (DWORD*)GetObjectData(pDataObj); // Data Pointer points at 1st data location
        m_light.type = *DataPtr++;  
        vecPtr = (D3DXVECTOR3*)DataPtr;
        m_light.position = *vecPtr;
        DataPtr+=3; 
        vecPtr = (D3DXVECTOR3*)DataPtr;
        m_light.direction = *vecPtr;
        DataPtr+=3;
        colorPtr = (D3DXVECTOR4*)DataPtr;
        m_light.ambient = *colorPtr;
        DataPtr+=4;
        colorPtr = (D3DXVECTOR4*)DataPtr;
        m_light.diffuse = *colorPtr;
        DataPtr+=4;
        colorPtr = (D3DXVECTOR4*)DataPtr;
        m_light.specular = *colorPtr;
        DataPtr+=4;
        float *fPtr = (float*)DataPtr;
        m_light.power = *fPtr;
        return true;
    }

これで問題ありません...次の結果は正しくありません:

if(CompareDataObjectType(pDataObj, TID_D3DRMObject))
    {
        D3DXVECTOR3 *vecPtr = NULL;
        D3DXQUATERNION *quatPtr = NULL;
        DWORD *DataPtr = (DWORD*)GetObjectData(pDataObj);       
        m_object.type = *DataPtr++; 
        vecPtr = (D3DXVECTOR3*)DataPtr;
        m_object.position = *vecPtr;
        DataPtr+=3;     
        quatPtr = (D3DXQUATERNION*)DataPtr;
        m_object.orientation = *quatPtr;
        DataPtr+=4;
        m_object.name = (LPCSTR)DataPtr;
        size_t length = strlen(m_object.name);
        DataPtr+=length;
        m_object.filename = (LPCSTR)DataPtr; // filename only contains a portion of the correct string...
        return true;
    }
4

1 に答える 1

1

入力データに null で終了する文字列が含まれている場合は、次のようになります。

size_t length = strlen(m_object.name);
DataPtr+=length;

null 文字を考慮する必要があります。

size_t length = strlen(m_object.name);
DataPtr += length + 1;
于 2012-07-29T09:36:59.810 に答える