2012-03-04 87 views
0

我正在使用DirectX的图形引擎。我简化像这样我的FUNC之一(因为它有同样的问题):VS 2010 C++局部变量调试

void foo(int p,int q){ 
if(!p){ 
    int a=0; 
    a=4; 
}else{ 
    int a=0; 
    a=5; 
} 
if(p==1){ 
    if(q==1){ 
    float opacity=0; 
    } 
} 
} 
int main(){ 
    foo(1,2); 
    return 0; 
} 

如果我调用foo(1,2),我不能查看的值else块在VS调试面板,但是当我打foo(0,2)我可以看到一个if块的值。它显示Symbol'a'没有找到bla bla ...而当我改变“float opacity = 0;”时“浮动不透明”;它运作良好,我可以调试它。

我根据自己的properties.Here分组的对象,网格和材料是我原来的功能:

VOID DXACMyApp::LoadSceneFromFile(CHAR *a_file){ 
    //File name can not be null 
    DXAMIsNull(a_file,DXAE_ERROR_REPORTING_LEVEL_MBOX); 
    DXAMIsNull(m_effect,DXAE_ERROR_REPORTING_LEVEL_MBOX); 

    //Create Supported Input Layouts 

    //1st input layout 
    //elements 
    D3D11_INPUT_ELEMENT_DESC ied_PN[] = { 
     {"POSITION", 0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0}, 
     {"NORMAL",  0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0} 
    }; 
    //every pass of same technique must have same layout 
    //create input layout 
    IDXACRenderGroupIL  *ilGroup_PN = 0; 
    DXAMHResult(CreateILGroup(m_effect->GetTechniqueByName("SolidMaterialRender"),ied_PN,2,&ilGroup_PN),DXAE_ERROR_REPORTING_LEVEL_MBOX); 
    AddInputLayoutGroup(ilGroup_PN); 
    //create technique groups 
    IDXACRenderGroupTechnique *SolidMaterialTechGroup = 0; 
    DXAMHResult(CreateTechniqueGroup(m_effect->GetTechniqueByName("SolidMaterialRender"),&SolidMaterialTechGroup),DXAE_ERROR_REPORTING_LEVEL_MBOX); 
    //add tech group to il group 
    ilGroup_PN->AddTechniqueGroup(SolidMaterialTechGroup); 

    Assimp::Importer importer; 
    const aiScene *scene = importer.ReadFile(a_file,aiProcess_CalcTangentSpace|aiProcess_Triangulate|aiProcess_OptimizeMeshes| 
    aiProcess_JoinIdenticalVertices|aiProcess_SortByPType|aiProcess_RemoveRedundantMaterials); 

    //iterate objects 
    for(UINT i=0 ; i<scene->mRootNode->mNumChildren ; i++){ 
     aiNode *object = scene->mRootNode->mChildren[i]; 

     D3DXMATRIX worldMatrix = ToD3DXMATRIX(object->mTransformation); 

     //object's mesh vector 
     std::vector<IDXACMesh*> meshes; 
     //count known mesh types 
     UINT recognizedMeshCount = 0; 

     //iterate object's meshes(materials) 
     for(UINT j=0 ; j<object->mNumMeshes ; j++){ 
      aiMesh  *mesh  = scene->mMeshes[ object->mMeshes[j] ]; 
      //Test material type 
      aiMaterial *material = scene->mMaterials[mesh->mMaterialIndex]; 
      BOOL recognized = false; 
      IDXACMaterial *newMaterial = 0; 

      if(material->mNumProperties == 8){ 
       //materials with 8 properties 
       if(strcmp(material->mProperties[0]->mKey.data,"?mat.name")==0   && 
         strcmp(material->mProperties[1]->mKey.data,"$clr.ambient")==0  && 
         strcmp(material->mProperties[2]->mKey.data,"$clr.diffuse")==0  && 
         strcmp(material->mProperties[3]->mKey.data,"$clr.specular")==0  && 
         strcmp(material->mProperties[4]->mKey.data,"$clr.emissive")==0  && 
         strcmp(material->mProperties[5]->mKey.data,"$mat.opacity")==0  && 
         strcmp(material->mProperties[6]->mKey.data,"$mat.bumpscaling")==0 && 
         strcmp(material->mProperties[7]->mKey.data,"$mat.shadingm")==0 ){ 

        FLOAT  opacity,specPower; 
        D3DXCOLOR diffuse; 
        D3DXCOLOR specular,ambient,emissive; 

        //get material info 
        specPower = 1.0f;          
        memcpy(&ambient ,material->mProperties[1]->mData,12); 
        memcpy(&diffuse ,material->mProperties[2]->mData,12); 
        memcpy(&specular,material->mProperties[3]->mData,12); 
        memcpy(&emissive,material->mProperties[4]->mData,12); 
        memcpy(&opacity ,material->mProperties[5]->mData,4); 
        diffuse.a = ambient.a = specular.a = emissive.a = opacity; 
        //create material interface 
        std::string matName(material->mProperties[0]->mData,17); 
        DXACMaterialT1 *matInstance = 0; 
        matInstance = new DXACMaterialT1(material->mProperties[0]->mData,&diffuse,&specular,&ambient,&emissive,specPower,m_effect); 
        newMaterial  = matInstance; 

        recognized = true; 
        recognizedMeshCount++; 
       } 

      }else if(material->mNumProperties == 10){ 
       if(strcmp(material->mProperties[0]->mKey.data,"?mat.name")==0   && 
         strcmp(material->mProperties[1]->mKey.data,"$clr.ambient")==0  && 
         strcmp(material->mProperties[2]->mKey.data,"$clr.diffuse")==0  && 
         strcmp(material->mProperties[3]->mKey.data,"$clr.specular")==0  && 
         strcmp(material->mProperties[4]->mKey.data,"$clr.emissive")==0  && 
         strcmp(material->mProperties[5]->mKey.data,"$mat.shininess")==0  && 
         strcmp(material->mProperties[6]->mKey.data,"$mat.shinpercent")==0 && 
         strcmp(material->mProperties[7]->mKey.data,"$mat.opacity")==0  && 
         strcmp(material->mProperties[8]->mKey.data,"$mat.bumpscaling")==0 && 
         strcmp(material->mProperties[9]->mKey.data,"$mat.shadingm")==0 ){ 

        D3DXCOLOR diffuse; 
        D3DXCOLOR specular,ambient,emissive; 
        FLOAT  opacity,specPower; 

        memcpy(&ambient ,material->mProperties[1]->mData,12); 
        memcpy(&diffuse ,material->mProperties[2]->mData,12); 
        memcpy(&specular,material->mProperties[3]->mData,12); 
        memcpy(&emissive,material->mProperties[4]->mData,12); 
        memcpy(&specPower ,material->mProperties[5]->mData,4);           
        memcpy(&opacity  ,material->mProperties[7]->mData,4); 
        diffuse.a = ambient.a = specular.a = emissive.a = opacity; 

        std::string matName(material->mProperties[0]->mData,17); 
        DXACMaterialT1 *matInstance = new DXACMaterialT1(matName.substr(4,matName.npos).c_str(),&diffuse,&specular,&ambient,&emissive,specPower,m_effect); 
        newMaterial  = matInstance; 

        recognized = true; 
        recognizedMeshCount++; 
       } 
      } 
      if(recognized){ 
       //create mesh instance 
       DXACMeshT1  *newMesh = new DXACMeshT1(m_d3dDeviceContext); 

       //fill vertex buffer desc 
       D3D11_BUFFER_DESC vbd; 
       vbd.ByteWidth   = mesh->mNumVertices*sizeof(VERTEXT1); 
       vbd.BindFlags   = D3D11_BIND_VERTEX_BUFFER; 
       vbd.CPUAccessFlags  = 0; 
       vbd.MiscFlags   = 0; 
       vbd.StructureByteStride = 0; 
       vbd.Usage    = D3D11_USAGE_IMMUTABLE; 
       //create vertex buffer memory block and subres. data 
       VERTEXT1 *vbMemBlock = new VERTEXT1[mesh->mNumVertices]; 
       for(UINT i=0; i<mesh->mNumVertices ; i++){ 
        vbMemBlock[i] = VERTEXT1(mesh->mVertices[i],mesh->mNormals[i]); 
       } 
       D3D11_SUBRESOURCE_DATA vbSrd; 
       vbSrd.pSysMem = vbMemBlock; 
       DXAMHResult(m_d3dDevice->CreateBuffer(&vbd,&vbSrd,&newMesh->m_vertexBuffer),DXAE_ERROR_REPORTING_LEVEL_MBOX); 
       newMesh->m_vertexCount = mesh->mNumVertices; 
       newMesh->m_vertexStride = sizeof(VERTEXT1); 

       //fill index buffer desc 
       //only triangles are valid as face 
       D3D11_BUFFER_DESC ibd; 
       ibd.ByteWidth   = mesh->mNumFaces*3*sizeof(DWORD); 
       ibd.BindFlags   = D3D11_BIND_INDEX_BUFFER; 
       ibd.CPUAccessFlags  = 0; 
       ibd.MiscFlags   = 0; 
       ibd.StructureByteStride = 0; 
       ibd.Usage    = D3D11_USAGE_IMMUTABLE; 
       //create index buffer memory block and subres. data 
       DWORD *ibMemBlock = new DWORD[mesh->mNumFaces*3]; 
       for(UINT i=0,j=0; i<mesh->mNumFaces ; i++){ 
        aiFace &face = mesh->mFaces[i]; 
        if(face.mNumIndices!=3){ 
         OutputDebugString("Ignoring face"); 
         ibMemBlock[j++] = 0; 
         ibMemBlock[j++] = 0; 
         ibMemBlock[j++] = 0; 
        }else{ 
         ibMemBlock[j++] = face.mIndices[0]; 
         ibMemBlock[j++] = face.mIndices[1]; 
         ibMemBlock[j++] = face.mIndices[2]; 
        } 
       } 
       D3D11_SUBRESOURCE_DATA ibSrd; 
       ibSrd.pSysMem = ibMemBlock; 
       DXAMHResult(m_d3dDevice->CreateBuffer(&ibd,&ibSrd,&newMesh->m_indexBuffer),DXAE_ERROR_REPORTING_LEVEL_MBOX); 
       newMesh->m_indexCount = mesh->mNumFaces*3; 


       IDXACMesh  *imesh = newMesh; 
       imesh->Release(); 

      }else{ 

       //not recognized material 
       OutputDebugString("Ignoring mesh"); 
       return; 
      } 
     } 


    } 
    ReleaseCOM(SolidMaterialTechGroup); 
    ReleaseCOM(ilGroup_PN); 
} 
+3

我几十年没见过'VOID'。恭喜。 – 2012-03-04 15:41:19

+0

没有奇迹,你花了整整一个小时的时间调试,如果这是你的函数的简化版本 – 2012-03-04 15:43:29

+0

嗯......这个确切的函数显示了我的VS2010调试器下的所有预期变量。你能更具体地说明你做了什么_exactly_吗? – 2012-03-04 15:48:11

回答

0

这是刚刚安装VS SP1在VS 2010.I错误一个nd我可以在不修改代码的情况下调试任何变量。

0

里面的东西,是你感兴趣的变量范围之外 移动。变量的函数的顶部,他们将有功能范围, 让你看到他们在调试器全功能的范围

void foo(int p,int q) 
{ 
    int a = 0;    // Move them here 
    float opacity = 3.1415f; // And here 

    if(!p) 
    { 
     a=4; 
    } 
    else 
    { 
     a=5; 
    } 

    if(p==1) 
    { 
    if(q==1) 
    { 
     opacity=0; 
    } 
    } 
} 

int main() 
{ 
    foo(1,2); 
    return 0; 
}