Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
И уж если есть потребность в одинаковом куске кода, который не может быть завернут в функцию то вместо тупого копирования можно сделать из него макрос
#define getnextpathchar() ( utfModeFileName ? *++utf16path : *++temppath )#define getnextpathchar(really, wherewhere, where) ( really ? *++wherewhere : *++where )
while(cntr--) *ptr++=a;
if(cntr){
--ptr;
do {
*++ptr=a;
}while(--cntr);
++ptr;
}
memset(ptr, a, cntr);
start
clrf INDF ;1 cycle
incf FSR, f ;1 cycle
decfsz counter ;1(2 if Zero) cycles
goto start ;2 cycles
;end :)
clrf 0x00 ;1 cycle
clrf 0x01 ;1 cycle
...
clrf 0xff ;1 cycle
clrf FSR ; этого не то чтобы нет в исходном примере, его просто плохо видно :)
start:
clrf INDF ;1 cycle
incfsz FSR, f ;1(2 if Zero) cycles
goto start ;2 cycles
;end
Вообще не терплю копипаст в программировании. Если возникло желание что-то скопировать то сразу задумываюсь где и что надо переписыватьглавное при этом не переписать до анти-паттерна over-optimization.
loop:
if (0 != localCounter) {
localCounter = localCounter - 1;
...
goto loop;
}
#if defined __C30__ || defined __C32__
{
BYTE* localPointer = ioInfo.pBuffer;
WORD localCounter = ioInfo.wNumBytes;
// здесь тот самый, приведенный кусок
// переменные локальнее некуда
}
#endif
Remarks:
Optimize code later
Прошло 10 лет с момента публикации, однако, судя по всему, ошибки так никто и не заметил.
// а это полный аналог,
А вот и не полный. В оригинальном коде по завершению блока localPointer будет указывать на последний принятый байт, а в вашей - на следующий за ним. Возможно, конкретно в данном применении разницы и не будет, но назвать такое полным аналогом - нельзя.
А если это становится важно, то обойтись 4-мя строчками уже не выйдет, т.к. нужна еще одна проверка. В итоге, разница с исходным становится уже и не такая большая.
Индусский код в Микрочипе