If Verschachtelung, für welches if gilt das else ?



  • Hey,
    Wenn ich einen Code habe der so aussieht:

    if( g_pPlayer == NULL )
    	{
    		ENVIR_INFO* pInfo = GetInContinent( g_pPlayer->GetPos( ) );
    	    if( pInfo && m_kCurContinent._bUseEnvir )		// ´ë·ú ¾ÈÀÌ°í ´ë·úÁ¤º¸¸¦ ÀÌ¿ëÇÒ °æ¿ì¸¸ !!
    		{
    			if( pLight )
    			{
    				pLight->Ambient.r =  pInfo->_fAmbient[ 0 ];
    			    pLight->Ambient.g =  pInfo->_fAmbient[ 1 ];
    			    pLight->Ambient.b =  pInfo->_fAmbient[ 2 ];
    
    			    pLight->Specular.r = 2.0f;
    			    pLight->Specular.g = 2.0f;
    			    pLight->Specular.b = 2.0f;
    
    			    pLight->Diffuse.r = pInfo->_fDiffuse[ 0 ];
    			    pLight->Diffuse.g = pInfo->_fDiffuse[ 1 ];
    			    pLight->Diffuse.b = pInfo->_fDiffuse[ 2 ];
    
    			    HookUpdateLight( pLight ); 
    
    			    memcpy( &m_lightFogSky, pLight, sizeof( m_lightFogSky ) );
    
    			    pLight->Diffuse.r *= 1.2f;
    			    pLight->Diffuse.g *= 1.2f;
    			    pLight->Diffuse.b *= 1.2f;
    
    			    pLight->Ambient.r *= 0.8f;
    			    pLight->Ambient.g *= 0.8f;
    		    	pLight->Ambient.b *= 0.8f;
    
    			    memcpy( &m_light, pLight, sizeof( m_light ) );
    
     			    D3DXVECTOR3 vecSun = D3DXVECTOR3( 0.0f, 0.5f,0.5f);
     			    D3DXVec3Normalize(&(vecSun),&(vecSun));
     		     	pLight->SetDir( -vecSun.x, -vecSun.y, -vecSun.z ); 
     		    	pLight->Appear( m_pd3dDevice, TRUE );
    
    			    DWORD dwR, dwG, dwB;
    			    dwR = (DWORD)( pLight->Ambient.r * 255 );
    			    dwG = (DWORD)( pLight->Ambient.g * 255 );
    			    dwB = (DWORD)( pLight->Ambient.b * 255 );
    			    dwAmbient = D3DCOLOR_ARGB( 255, dwR, dwG, dwB );
    			}
    		}
    	}
    	else //
    

    Für welches If gilt das Else am ende und wie ist das generell ?



  • else // g_pPlayer != NULL
    

    Generell gilt: Zu jeder öffnenden Klammer { gehört eine schließende }.

    Bei dem Code ist es auch noch besonders einfach, da er so eingerückt ist, wie es sein sollte.



  • In diesem Fall gehört das Else eindeutig zum äußersten If. Die inneren Ifs sind komplett abgeschlossen, da sie von den geschweifen Klammern umgeben sind.

    Problematisch wird es, wenn man die Klammern weg lässt (siehe http://de.wikipedia.org/wiki/Dangling_else)



  • Danke 🙂



  • Welche IDE nutzt du? Klick mal innerhalb des Quelltexts auf ein { .Normalerweise wird wenn du Syntax-Highlighting aktiviert hast, die schließende Klammer farblich makiert.



  • Nutze in dem Fall VS2003 kann bei dem Projekt leider keine neuere Version nutzen.



  • Ich weiß nicht, wie das mit dem VS ist. Aber eigentlich kann man seine Projekte konvertieren um mit neueren Versionen daran arbeiten zu können oder irre ich mich da?!

    Frage nebenbei, du heißt nicht zufällig Cz.... mit Nachnahmen? 😃 //edit: *Nachnamen natürlich 😃



  • Nein tue ich nicht 😃
    Ja kann man, aber da in dem Projekt vorher mit C gearbeitet wurde und es in C++ umgeschrieben wurde gibts ganz schön viele Errors 😛
    Schleifen ..
    Da dort noch andere Standarts galten



  • Hab schnell noch den Senf geholt 🙄

    if( g_pPlayer == NULL )
        {///####->A
    
            ENVIR_INFO* pInfo = GetInContinent( g_pPlayer->GetPos( ) );
            if( pInfo && m_kCurContinent._bUseEnvir )
            {///####->B
    
                if( pLight )
                {///####->C
    
                    pLight->Ambient.r =  pInfo->_fAmbient[ 0 ];
                    pLight->Ambient.g =  pInfo->_fAmbient[ 1 ];
                    pLight->Ambient.b =  pInfo->_fAmbient[ 2 ];
    
                    // Restlicher Scheiß
    
                }///####->C
    
            }///####->B
    
        }//####/->A
        else //Gegenüber ####A sonst mach irgendwas anderes, ist mir egal
    

    Verschachtelt sind die Dinger dann nur in ihrem Namensraum 'gültig', bzw. relevant (oder beeinflussend).

    :xmas1:



  • Zu deinen Schleifen-problemen:

    for(int a = 0;a != 10;++a)
        tuwasmit(a);
    
    nochwasanderesmit(a); ///<--- FEHLER IN C++!!
    

    Früher waren die im Kopf deklarierten Variablen auch in dem Namensraum in dem die Schleife definiert (oder was auch immer) wurde gültig, also

    {///NAMESPACE BLA
    
        for(int a = 0;a != 10;++a)
            tuwasmit(a);
    
    }
    
    ///IST GLEICHZUSETZEN MIT.....
    
    {///...IN C (!!)   NAMESPACE BLA
    
        int a = 0;
        while(a != 10)
        {
            tuwasmit(a);
            ++a;
        }
    
    }
    
    {///...C++, (natürlich) abwärtskompatibel zu C 
     ///NAMESPACE BLA (jetzt)
    
        {//Alles noch in Klammern, noch ein Namensraum
    
            int a = 0;
            while(a != 10)
            {
                tuwasmit(a);
                ++a;
            }
    
        }///Schluss
    
    }
    

    Edit: Das ist nicht ganz richtig. Die dritte Angabe (z.b. ein Inkrement) wird ERST ausgeführt, wenn die Bedingung zutrifft. Also eigentlich

    {
        int a = 0;
        while(a != 10)
        {
            tuwasmit(a);
            if(a != 10)
                ++a;
        }
    }
    

Anmelden zum Antworten