Код: Выделить всё
play()
{
if (status & TIMER_NOT_READY)
{
.....
.......
сдесь я запускаю Т2 и выпригиваю с данной ф-ции
}
else
{
сюда я возвращаюсь когда Т2 отсчитает определенное время
.....
......
status|=TIMER_NOT_READY;
}
}
Код: Выделить всё
play()
{
if (status & TIMER_NOT_READY)
{
.....
.......
сдесь я запускаю Т2 и выпригиваю с данной ф-ции
}
else
{
сюда я возвращаюсь когда Т2 отсчитает определенное время
.....
......
status|=TIMER_NOT_READY;
}
}
Код: Выделить всё
PlayState state = InitPlay();
for(;;){
if(Play(state)==PLEASE_SET_TIMER)SetTimer();
if(TimerInterrupt())PlayInterrupt(state);
}
ReleasePlay(state);Код: Выделить всё
play(PLAY_INIT);
for(;;){
witch(play(PLAY_START)){
case PLAY_PLEASE_SET_TIMER: SetTimer();
}
if(TimerInterrupt()) play(PLAY_TIME_OUT);
}
play(PLAY_RELEASE);Я и говорю - как, да ещё как! Моя мысль была "... если хочется влепить goto, значит надо пересмотреть логику". В 99.999% случаев есть более элегантное решение.так шо без GOTO никак ?
а ведь некоторые вопиют что это дурной тон![]()
![]()
![]()
Разрешите поинтересоваться, откуда такие сведения ?Desutorakuta писал(а): Но это ещё более дурной тон.
пытаюсь вникнуть в суть темы......, обясните пожалуйста на простом крестьянском языке чем GOTO отличается от setjmp кроме того что последняя сохраняет состояние процесса ?Аlex писал(а):http://computerlib.narod.ru/html/setjmp.htmFreshMan писал(а):подскажите пожалуйста, если я при определенном услови, с помощью оператора return, выхожу из ф-ции в основной цикл то как мне потом вернутся в ф-цию и продолжить с того места где я ранее прервал выполнение ?
http://ru.wikipedia.org/wiki/Setjmp.h
Код: Выделить всё
//********************************************************
#include "SetJmp.h"
jmp_buf j_buf;
//********************************************************
void mfun(void){
while(1){
if(!setjmp(j_buf)){ // Сохраняем точку возврата
return; // и выходим из функции
}
//..................
Nop(); // сюда вернёмся после longjmp
//..................
if(!setjmp(j_buf)){ // Сохраняем точку возврата
return; // и выходим из функции
}
//..................
Nop(); // сюда вернёмся после longjmp
//..................
if(!setjmp(j_buf)){ // Сохраняем точку возврата
return; // и выходим из функции
}
//..................
Nop(); // сюда вернёмся после longjmp
//..................
}
}
//********************************************************
void main (void){
mfun(); // Первый вызов ф-ии, для первого
// сохранения точки прыжка
while(1){
longjmp(j_buf, 1); // Прыгаем в сохранённую точку
Nop(); // Сюда будем возвращаться по return
}
}
//********************************************************
ВАУ..... это все стандартный Си ?Аlex писал(а):Один (setjmp) устанавливает точку возврата, с сохранением состояние, а второй (longjmp) - восстанавливает сохранённое состояние, вместе со счётчиком команд, по этому и происходит "прыжок" в то-же место, где было сохранено состояние.
Я думаю, если дизассемблировать Си-шную прошивку от самого лютого ненавистниика GOTO, то там этих GOTO, то-бишь JMP, будет до френа.Desutorakuta писал(а): Пример - попробуйте ка в ассемблере обойтись без Jxx инструкций xD. (Аналог if(x)then goto y же!)
Код: Выделить всё
#define BUF ((uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])Код: Выделить всё
/* The TCP and IP headers. */
typedef struct {
/* IP header. */
u8_t vhl,
tos,
len[2],
ipid[2],
ipoffset[2],
ttl,
proto;
u16_t ipchksum;
u16_t srcipaddr[2],
destipaddr[2];
/* TCP header. */
u16_t srcport,
destport;
u8_t seqno[4],
ackno[4],
tcpoffset,
flags,
wnd[2];
u16_t tcpchksum;
u8_t urgp[2];
u8_t optdata[4];
} uip_tcpip_hdr;Код: Выделить всё
if(BUF->srcipaddr[0] == FBUF->srcipaddr[0] &&
BUF->srcipaddr[1] == FBUF->srcipaddr[1] &&
BUF->destipaddr[0] == FBUF->destipaddr[0] &&
BUF->destipaddr[1] == FBUF->destipaddr[1] &&
BUF->ipid[0] == FBUF->ipid[0] &&
BUF->ipid[1] == FBUF->ipid[1]) {Код: Выделить всё
((uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
33333333333333333211111111111111111111Код: Выделить всё
uip_eth_hdr *BUF = (uip_eth_hdr*)uip_buf;Код: Выделить всё
uip_tcpip_hdr
-------------------
| | | | | | | | | |
-------------------------------------------------------
uip_buf| | | | | | |*| | | | | | | | | | | | | | | | | | | | |
-------------------------------------------------------
^
UIP_LLH_LEN
Код: Выделить всё
Во-первых, не "до", а начиная с элемента в ячейке с номером взятом из UIP_LLH_LEN.Код: Выделить всё
#define FBUF ((uip_tcpip_hdr *)&uip_reassbuf[0])Я примерно это так и представлял только правильно написал. С чем-то похожим сталкивался когда с переменной float воевал/Во-вторых ...
Это будет так ?В качестве более простого примера можно взять адрес переменной типа long и попросить компилятор работать с этим адресом как с char[4]. Получите доступ к long-у как к массиву байтов без масок и сдвигов.
Код: Выделить всё
typedef struct {
char b[3];
} U8long;
U8long *u8 = (U8long*)h;