[an error occurred while processing this directive] [an error occurred while processing this directive]
Вот вам типичный примерчик, из Linux Kernel Sourses..
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Linuxoid 15 ноября 2001 г. 13:43
В ответ на: Честно говоря, я не вижу особого смысла в GOTO, кроме как выход из глубокой рекурсии. Так покажите, пожалуйста, пример его эффективности? (-) отправлено Или трус, или лентяй 15 ноября 2001 г. 09:42

//----------------------------------------------------------------
// File i2c-algo-bit.c
//----------------------------------------------------------------

// ...............................................................


static int test_bus(struct i2c_algo_bit_data *adap, char* name) {
int scl,sda;
sda=getsda(adap);
if (adap->getscl==NULL) {
printk("i2c-algo-bit.o: Warning: Adapter can't read from clock l return 0;
}
scl=getscl(adap);
printk("i2c-algo-bit.o: Adapter: %s scl: %d sda: %d -- testing...\n",
name,getscl(adap),getsda(adap));
if (!scl || !sda ) {
printk("i2c-algo-bit.o: %s seems to be busy.\n",name);
goto bailout;
}
sdalo(adap);
printk("i2c-algo-bit.o:1 scl: %d sda: %d \n",getscl(adap),
getsda(adap));
if ( 0 != getsda(adap) ) {
printk("i2c-algo-bit.o: %s SDA stuck high!\n",name);
sdahi(adap);
goto bailout;
}
if ( 0 == getscl(adap) ) {
printk("i2c-algo-bit.o: %s SCL unexpected low while pulling SDA
name);
goto bailout;
}
sdahi(adap);
printk("i2c-algo-bit.o:2 scl: %d sda: %d \n",getscl(adap),
getsda(adap));
if ( 0 == getsda(adap) ) {
printk("i2c-algo-bit.o: %s SDA stuck low!\n",name);
sdahi(adap);
goto bailout;
}
if ( 0 == getscl(adap) ) {
printk("i2c-algo-bit.o: %s SCL unexpected low while SDA high!\n" name);
goto bailout;
}
scllo(adap);
printk("i2c-algo-bit.o:3 scl: %d sda: %d \n",getscl(adap),
getsda(adap));
if ( 0 != getscl(adap) ) {
printk("i2c-algo-bit.o: %s SCL stuck high!\n",name);
sclhi(adap);
goto bailout;
}
if ( 0 == getsda(adap) ) {
printk("i2c-algo-bit.o: %s SDA unexpected low while pulling SCL
name);
goto bailout;
}
sclhi(adap);
printk("i2c-algo-bit.o:4 scl: %d sda: %d \n",getscl(adap),
getsda(adap));
if ( 0 == getscl(adap) ) {
printk("i2c-algo-bit.o: %s SCL stuck low!\n",name);
sclhi(adap);
goto bailout;
}
if ( 0 == getsda(adap) ) {
printk("i2c-algo-bit.o: %s SDA unexpected low while SCL high!\n" name);
goto bailout;
}
printk("i2c-algo-bit.o: %s passed test.\n",name);
return 0;

bailout:
sdahi(adap);
sclhi(adap);
return -ENODEV;
}

---------------------------------------------------------------
В журнале то ли Chip, то ли Bit (не помню номер), была
статейка в защиту goto - там приводился более наглядный пример,
когда код вообще сложно было написать без goto.
Я в своей практике 2 раза сталкивался с ситуацией, когда использование goto упрощало код.
Кстати, выход из глубокой рекурсии по goto.. это как? Что при этом будет со стеком?

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru