ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
436011 Топик полностью
Ксения (25.08.2013 02:01 - 02:26, просмотров: 164) ответил mazur на Я уже думал о том, чтобы сравнивать значение указателя с кол-вом счетчиком, то бишь, TMRS_QUANTITY. В примере Скрипача так сделано?
Да, так. Только можно чуть понятнее написать: for( p_tmrs_queue = Timers_Queue; p_tmrs_queue < Timers_Queue + TMRS_QUANTITY; p_tmrs_queue++) { if( p_tmrs_queue->st_flags & (1<<ST_UNLOCK_FLG)) p_tmrs_queue->st_flags |= (1<<ST_TIME_OUT_FLG); } Причем, складывать Timers_Queue+TMRS_QUANTITY компилятор МК не заставит, т.к. константы обязан сложить сам. Обратите внимание на выражение "Timers_Queue + TMRS_QUANTITY", здесь каждая единица из TMRS_QUANTITY ценой в 3 байта. Это к нашему разговору о том, как к указателю прибавляется число. Кстати, вы можете пользоваться здесь и своими макросами #define clrb(reg, bit) reg &= ~(1<<(bit)) #define setb(reg, bit) reg |= (1<<(bit)) тогда цикл приобрет вид for( p_tmrs_queue = Timers_Queue; p_tmrs_queue < Timers_Queue + TMRS_QUANTITY; p_tmrs_queue++) { if( p_tmrs_queue->st_flags & (1<<ST_UNLOCK_FLG)) setb( p_tmrs_queue->st_flags, ST_TIME_OUT_FLG); } А еще лучше добавить макросы для тестирования бита. Что-то вроде: #define isset(reg, bit) (reg & (1<<(bit))) #define isclr(reg, bit) ((reg & (1<<(bit)))==0) Только не пишите в первом случае "==1", т.к. вырезанный бит может оказаться в любом месте, а не только в самом младшем разряде. А в отсутствии сравнения на языке C анализируется сам результат, принимая за true любое ненулевое значение. Но можно написать и так: #define isset(reg, bit) ((reg & (1<<(bit)))!=0) В любом случае с макросами будет выглядеть так: for( p_tmrs_queue = Timers_Queue; p_tmrs_queue < Timers_Queue + TMRS_QUANTITY; p_tmrs_queue++) { if( isset(p_tmrs_queue->st_flags, ST_UNLOCK_FLG) setb( p_tmrs_queue->st_flags, ST_TIME_OUT_FLG); } P.S. Фигурные скобки после if я опустила, т.к. единственный оператор не обязательно оформлять в виде блока. С тем же основанием можно было убрать фигурные скобки и у for, записав весь цикл в одну строку, но я не стала вас пугать :).