Re: Почему настоящие программисты избегают C++
От: nataniel  
Дата: 31.05.05 09:23
Оценка:
черт, даже не знаю, в юмор это записать или сюда...
приведу кусок кода, в который я залез час назад. Цель программы — получение информации о сетевых адапторах
int MibII::MIB_GetIPAddress(DWORD *MIB_Array,int max_addresses, 
    BOOL bShowLoopbackAddress)
{

    UINT OID_ipAdEntAddr[] = { 1, 3, 6, 1, 2, 1, 4 , 20, 1 ,1 };
    AsnObjectIdentifier MIB_ipAdEntAddr = 
    { sizeof(OID_ipAdEntAddr)/sizeof(UINT), OID_ipAdEntAddr };
    RFC1157VarBindList  varBindList;
    RFC1157VarBind      varBind[1];
    AsnInteger          errorStatus;
    AsnInteger          errorIndex;
    AsnObjectIdentifier MIB_NULL = {0,0};
    BOOL                Exit;
    int                 ret;
    int                 IpCount=0;
    DWORD               dtmp;
    BYTE                a1,a2,a3,a4;
    
    varBindList.list = varBind;
    varBindList.len  = 1;
    varBind[0].name  = MIB_NULL;
    SNMP_oidcpy(&varBind[0].name,&MIB_ipAdEntAddr);
    Exit = FALSE;
    
    IpCount=0;

    while(!Exit){
        ret = Query(ASN_RFC1157_GETNEXTREQUEST,&varBindList,
            &errorStatus,&errorIndex);
        
        if(!ret)
            Exit=TRUE;
        else{
            ret = SNMP_oidncmp(&varBind[0].name,&MIB_ipAdEntAddr,
                MIB_ipAdEntAddr.idLength);
            if(ret!=0){
                Exit=TRUE;
            }
            else
            {
                dtmp = *((DWORD *)varBind[0].value.asnValue.address.stream);
                if (dtmp!=0)
                {
                    // Octets in returned IP addresses are in reverse order
                    a1=(BYTE)((dtmp>>24) & 0xFF);
                    a2=(BYTE)((dtmp>>16) & 0xFF);
                    a3=(BYTE)((dtmp>>8) & 0xFF);
                    a4=(BYTE)(dtmp & 0xFF);

                    if ((a4!=127) && (a4!=0))
                    {
                        *MIB_Array = (a4<<24) + (a3<<16) + (a2<<8) + a1;
                        *MIB_Array++;
                        IpCount++;
                    }
                    else
                    {
                        if (bShowLoopbackAddress)
                        {
                            *MIB_Array = (a4<<24) + (a3<<16) + (a2<<8) + a1;
                            *MIB_Array++;
                            IpCount++;
                        };
                    };
                };

                if(IpCount>=max_addresses)
                    Exit = TRUE;
            }
        }
    }

    SNMP_FreeVarBind(&varBind[0]);

    return IpCount;
}

Обратите внимаение, какие мудреные условия для выхода из цикла
А условия внутри цикла... нет слов

MIB_Array — это временный статический массив; когда функция завершается, из него копируются данные в другой, такой же массив
max_addresses — отдефайненая константа
... да что это я, смотрите сами:

int CSysInfo::MIBRefreshAddresses()
{
    int i,nAddresses=0; BOOL bDiff=FALSE;

    for(i=0;i<MAX_IPADDRESSES;i++)
        { m_dwMIBIPArray_tmp[i]=0; };

    nAddresses=m_mib.MIB_GetIPAddress(&m_dwMIBIPArray_tmp[0],
        MAX_IPADDRESSES,m_bMIBShowLoopback);

    if (m_nMIBAddresses!=nAddresses)
    {
        bDiff=TRUE;
    }
    else
    {
        for (i=0;i<nAddresses;i++)
        {
            if (m_dwMIBIPArray[i]!=m_dwMIBIPArray_tmp[i])
            {
                bDiff=TRUE;
                break;
            };
        };
    };

    if (bDiff)
    {
        for(i=0;i<nAddresses;i++)
        {
            m_dwMIBIPArray[i]=m_dwMIBIPArray_tmp[i];
        };
        m_nMIBAddresses=nAddresses;
    };

    return m_nMIBAddresses;
}


Я, может, ошибаюсь, но этот человек не с Делфи пришел не так давно?
Скажите, это Делфи заставляет так писать или это его личная инициатива?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.