zHz00
Изучаю чужой проект. Немножко говнокода...

bool IsDeviceReady(void)
{
if(LOW_LEVEL_REGISTER&BIT_READY)
return true;
else
return false;
}

bool TestIfDeviceIsReady(void)
{
while(!IsDeviceReady())
if(Timeout())
return true;
return false;
}


Как легко заметить, первая функция возвращает истину, если устройство готово и ложь, если нет. Тут всё хорошо. А вот вторааая функция возвращает ЛОЖЬ, если устройство готово и истину, если произошёл тайм-аут ожидания готовности. Мдаа. При этом по смыслу названия функций совпадают. И вторая, кстати, вызывает первую.

***

#define DMAxREG (*(struct dma_reg_struct*)(DMA_BASE_ADDRESS+DMA_SPACING*nNumDMA))
//...
void func(void)
{
int nNumDMA=0;
DMAxREG|=BIT_FLAG;
//...
}


Тут контринтуитивно, что макрос DMAxREG на самом деле параметризованный, но параметр не виден. При взгляде на текст складывается впечатление, что DMAxREG ни от чего не зависит. Но это не так. Кроме того, если попытаться использовать данный макрос в функции, где не об'явлена переменная nNumDMA, программа просто не соберётся! Конечно же, надо было делать так:

#define DMAxREG(X) (*(struct dma_reg_struct*)(DMA_BASE_ADDRESS+DMA_SPACING*(X)))

@темы: Говнокод