OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 07:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 05 Декабрь, 2012 02:51 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В примере работы с библиотекой 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 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Код:
res1<=0
?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Декабрь, 2012 16:58 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, блин, писал UNTIL уже так поздно, что дал такого позорного ляпу :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Декабрь, 2012 04:37 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Результаты не эквивалентны, в оригинале в случае POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY ничего не печатается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Декабрь, 2012 05:17 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, я знаю, это код примера - и я делал, чтобы печаталось и это.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Декабрь, 2012 07:32 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Да, блин, писал UNTIL уже так поздно, что дал такого позорного ляпу :)
Вот поэтому и существует совет въявь писать отрицание ~( >0), не допуская до руля свой ... ум :)

*******

Есть ли какое-то техническое обоснование писать в две строки

ELSE EXIT
END END

вместо одной

ELSE EXIT END END ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Декабрь, 2012 13:28 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
А есть-ли обоснование писать в одну?
Код:
LOOP IF res1 > 0 THEN


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Декабрь, 2012 16:09 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Поскольку это эмуляция WHILE ELSE END, то имеет смысл всё в одну строчку.. :)
А EXIT END END без всякой причины разнёс на две..


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB