2012-03-04 3 views
0

Je travaille sur un moteur graphique avec DirectX. J'ai simplifié l'un de mes func comme celui-ci (parce qu'il a la même question):VS 2010 Débogage de variable locale 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; 
} 

si je l'appelle foo (1,2), je ne peux pas les valeurs de vue d'un bloc dans le reste dans VS panneau de débogage, mais quand J'appelle foo (0,2) je peux voir les valeurs d'un dans si block.Il montre le symbole 'a' non trouvé bla bla ... Et quand j'ai changé "float opacity = 0;" "float opacity" ça marche bien et je peux le déboguer.

je groupe les objets, les mailles et les matériaux en fonction de leur properties.Here est ma fonction originale:

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

Je n'ai pas vu 'VOID' depuis des décennies. Toutes nos félicitations. –

+0

Pas étonnant que vous ayez passé le débogage des heures entières, s'il s'agit d'une version simplifiée de votre fonction –

+0

Hmm ... cette fonction exacte montrait toutes les variables attendues sous mon débogueur VS2010. Pourriez-vous être plus précis quant à ce que vous avez réellement fait? –

Répondre

0

Il est un bogue dans VS 2010.I vient d'être installé VS SP1 une Je peux déboguer n'importe quelle variable sans modifier le code.

0

A l'intérieur du reste, est en dehors de la portée des variables qui vous intéressent déplacer le. variables au-dessus de la fonction et ils auront la portée de la fonction, vous permet de les voir dans le débogueur pour la portée de l'ensemble de la fonction

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; 
}