OberonCore https://forum.oberoncore.ru/ |
|
Переписываем break-нутый цикл из PolarSSL через ЦД и REPEAT https://forum.oberoncore.ru/viewtopic.php?f=82&t=4178 |
Страница 1 из 1 |
Автор: | Илья Ермаков [ Среда, 05 Декабрь, 2012 02:51 ] |
Заголовок сообщения: | Переписываем break-нутый цикл из PolarSSL через ЦД и REPEAT |
В примере работы с библиотекой PolarSSL есть такой брейканутый цикл: Код: do { len = sizeof( buf ) - 1; memset( buf, 0, sizeof( buf ) ); ret = ssl_read( &ssl, buf, len ); if( ret == POLARSSL_ERR_NET_WANT_READ || ret == POLARSSL_ERR_NET_WANT_WRITE ) continue; if( ret == POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY ) break; if( ret < 0 ) { printf( "failed\n ! ssl_read returned %d\n\n", ret ); break; } if( ret == 0 ) { printf( "\n\nEOF\n\n" ); break; } len = ret; printf( " %d bytes read\n\n%s", len, (char *) buf ); } while( 1 ); Переводится в ЦД (действия по EOF и по ошибке, разумеется, выносятся из цикла, как не входящие в циклическую последовательность): Код: res1 := Ssl.read(c.ssl, buf, bufLen-1); LOOP IF res1 > 0 THEN C.buf2str(buf, req, res1); req[res1] := 0X; Log.Int(res1); Log.String(" bytes read:"); Log.Ln; Log.String(req$); Log.Ln; res1 := Ssl.read(c.ssl, buf, bufLen-1) ELSIF (res1 = Net.ERR_WANT_READ) OR (res1 = Net.ERR_WANT_WRITE) THEN res1 := Ssl.read(c.ssl, buf, bufLen-1) ELSE EXIT END END; IF res1 = 0 THEN Log.String("EOF"); Log.Ln ELSE Log.String("Error: "); Log.Int(res1) END Для сравнения - запись через REPEAT: Код: REPEAT res1 := Ssl.read(c.ssl, buf, bufLen-1); IF res1 > 0 THEN C.buf2str(buf, req, res1); req[res1] := 0X; Log.Int(res1); Log.String(" bytes read:"); Log.Ln; Log.String(req$); Log.Ln END UNTIL (res1 <= 0) & (res1 # Net.ERR_WANT_READ) & (res1 # Net.ERR_WANT_WRITE); IF res1 = 0 THEN Log.String("EOF"); Log.Ln ELSE Log.String("Error: "); Log.Int(res1) END Видим, что классы ситуаций "замаскированы" в монолитной охране выхода и условии IF внутри. ЦД выигрывает. |
Автор: | Пётр Кушнир [ Среда, 05 Декабрь, 2012 03:55 ] |
Заголовок сообщения: | Re: Переписываем break-нутый цикл из PolarSSL через ЦД и REP |
Код: res1<=0 ?
|
Автор: | Илья Ермаков [ Среда, 05 Декабрь, 2012 16:58 ] |
Заголовок сообщения: | Re: Переписываем break-нутый цикл из PolarSSL через ЦД и REP |
Да, блин, писал UNTIL уже так поздно, что дал такого позорного ляпу |
Автор: | Peter Almazov [ Четверг, 06 Декабрь, 2012 04:37 ] |
Заголовок сообщения: | Re: Переписываем break-нутый цикл из PolarSSL через ЦД и REP |
Результаты не эквивалентны, в оригинале в случае POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY ничего не печатается. |
Автор: | Илья Ермаков [ Четверг, 06 Декабрь, 2012 05:17 ] |
Заголовок сообщения: | Re: Переписываем break-нутый цикл из PolarSSL через ЦД и REP |
Да, я знаю, это код примера - и я делал, чтобы печаталось и это. |
Автор: | Info21 [ Четверг, 06 Декабрь, 2012 07:32 ] |
Заголовок сообщения: | Re: Переписываем break-нутый цикл из PolarSSL через ЦД и REP |
Илья Ермаков писал(а): Да, блин, писал UNTIL уже так поздно, что дал такого позорного ляпу Вот поэтому и существует совет въявь писать отрицание ~( >0), не допуская до руля свой ... ум ******* Есть ли какое-то техническое обоснование писать в две строки ELSE EXIT END END вместо одной ELSE EXIT END END ? |
Автор: | Ярослав Романченко [ Четверг, 06 Декабрь, 2012 13:28 ] |
Заголовок сообщения: | Re: Переписываем break-нутый цикл из PolarSSL через ЦД и REP |
А есть-ли обоснование писать в одну? Код: LOOP IF res1 > 0 THEN
|
Автор: | Илья Ермаков [ Четверг, 06 Декабрь, 2012 16:09 ] |
Заголовок сообщения: | Re: Переписываем break-нутый цикл из PolarSSL через ЦД и REP |
Поскольку это эмуляция WHILE ELSE END, то имеет смысл всё в одну строчку.. А EXIT END END без всякой причины разнёс на две.. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |