Re: GOTO must die!!!
От: Spark2K Россия  
Дата: 18.09.02 14:33
Оценка: 3 (1)
Я смотрел часть исходников Rotor'а и там, кстати, используются goto. Вот так...
Re[2]: GOTO must die!!!
От: IT Россия linq2db.com
Дата: 18.09.02 14:40
Оценка:
Здравствуйте Spark2K, Вы писали:

SK>Я смотрел часть исходников Rotor'а и там, кстати, используются goto. Вот так...


Скорее всего в case, но это тогда уже другая история.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: GOTO must die!!!
От: Spark2K Россия  
Дата: 18.09.02 14:51
Оценка:
Здравствуйте IT, Вы писали:

IT>Скорее всего в case, но это тогда уже другая история.


Да, в общем нет. Взял _первый_ попавшийся файл sscli\clr\src\csharp\csharp\sccomp\parcer.cpp

void __cdecl CParser::ErrorAfterPrevToken (enum ERRORIDS iErrorId, ...)
{
    va_list args;
    va_start(args, iErrorId);

    long iTokenIdx = Mark();
    POSDATA posCurToken = m_pposTokens[iTokenIdx];
    POSDATA posPrevToken = m_pposTokens[(iTokenIdx > 0) ? iTokenIdx - 1 : iTokenIdx];
    POSDATA pos, posEnd;

    if (posPrevToken.u.iLine == posCurToken.u.iLine) {
        pos = posEnd = posCurToken;
        posEnd.u.iChar += GetTokenLength (iTokenIdx);
        if (m_fErrorOnCurTok)
            goto SKIPERROR;
        m_fErrorOnCurTok = TRUE;
    }
    else {
        pos = posEnd = posPrevToken;
        pos.u.iChar += GetTokenLength(iTokenIdx - 1);
        posEnd.u.iChar = pos.u.iChar + 1;
    }

    CreateNewError (iErrorId, args, pos, posEnd);

SKIPERROR:
    m_iErrors++;
    va_end(args);
}


И в других местах я видел тоже самое.
Re[4]: GOTO must die!!!
От: IT Россия linq2db.com
Дата: 18.09.02 15:04
Оценка:
Здравствуйте Spark2K, Вы писали:

SK>Да, в общем нет. Взял _первый_ попавшийся файл sscli\clr\src\csharp\csharp\sccomp\parcer.cpp


Понятно. И конечно обработка ошибок. Драли небось из старых сишных кодов
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: GOTO must die!!!
От: Spark2K Россия  
Дата: 18.09.02 15:20
Оценка:
Здравствуйте IT, Вы писали:

IT>Понятно. И конечно обработка ошибок. Драли небось из старых сишных кодов


И да и нет . Да, потому, что обрабатываются действительно ошибки. Нет, потому, что обрабатываются ошибки не в коде, логике и т.д. парсера, а ошибки в коде, который это парсер разбирает (что является обычной его работой, а эта переменная m_iErrors просто считает их количество).
Re: GOTO must die!!!
От: aboo Россия  
Дата: 18.09.02 16:22
Оценка:
Здравствуйте IT, Вы писали:

....

Вот блин, как рисунок обсудить — все здесь, а как на вопрос ответить — фиг дождёсссяяя...
Re[2]: GOTO must die!!!
От: Alex77  
Дата: 19.09.02 06:28
Оценка:
У меня мало опыта программирования на сях, поэтому я понять не могу почему более двух return per function плохо.
Чем это плохо, объсните пожалуйста.


    if (srv_paraminfo(pSrvProc, 1, &bType, (unsigned long*)&cbMaxLen, (unsigned long*)&cbActualLen,
            NULL, &fNull) == FAIL)
    {
        printError (pSrvProc, "srv_paraminfo failed...");
        return (XP_ERROR);    
    }
    
    DataLen=cbActualLen;

    if (DataLen>MAX_DATA_LEN)
    {
        sprintf(mess,"Переполнение. Допускается прием архива счетов не превышающего %d байтов",MAX_DATA_LEN);
        printError (pSrvProc, mess);
        return (XP_ERROR);
    }

    pData=(unsigned char*)malloc(DataLen);
    if (pData==NULL)
    {
        printError (pSrvProc, "Невозможно выделить память для принятия данных архива счетов.");
        return (XP_ERROR);
    }
    
    // получаю данные в pData
    if (srv_paraminfo(pSrvProc, 1, &bType, (unsigned long*)&cbMaxLen, (unsigned long*)&cbActualLen,
        (unsigned char*)pData, &fNull) == FAIL)
    {
        free(pData);
        printError (pSrvProc, "Ошибка при получении данных архива счетов");
        return (XP_ERROR);    
    }
Re[3]: GOTO must die!!!
От: aboo Россия  
Дата: 19.09.02 07:10
Оценка:
Здравствуйте Alex77, Вы писали:

A>У меня мало опыта программирования на сях, поэтому я понять не могу почему более двух return per function плохо.

A>Чем это плохо, объсните пожалуйста.

...

Если это вопрос ко мне, то только одно предположение — плохой стиль программирования.
Хотя в той же MSDN-е полно примеров, где return втречается гораздо больше 2-х раз.
Re[3]: GOTO must die!!!
От: Snax Россия  
Дата: 19.09.02 09:19
Оценка: 1 (1) +1
Здравствуйте Alex77, Вы писали:

A>Чем это плохо, объсните пожалуйста.


Понимаете, Alex77, обычно процедура на C++ имеет такую структуру:

1. проверка аргументов
(тут может быть return, ничего страшного)

2. Выделение временных ресурсов
3. Изменение состояния объекта
4. Освобождение ресурсов.

Так вот, если хочется поставить return, но выделение каких-либо
ресурсов уже проихошло, то чистить их приходится перед каждым из
return'ов. В Вашем примере это будет N вызовов free(pData);
И не дай бог, захочется переименовать pData или что подобное.
В любом случае, код распухает, вероятность ошибки увеличивается.

Впрочем, на этом этапе это еще не так страшно. Тут нам на помощь
придут всевозможные "умные" указатели и обертки над хендлами.

А вот когда дело доходит до изменения внутреннего состояния объекта,
тут лишний выход по ошибке может оставить объект в таком виде,
что он потом где-то очень далего-далего испортится и Вы будите
долго-долго искать причину. Не факт, что если писать код без return'ов,
такого не произойдет, но мой жизненный опыт подтверждает:
return посреди метода чаще приводит объекты в неустойчивое состояние.
ОСОБЕННО, если метод разрабатывал один человек, а return потом
вставил другой.

Вот. И чтобы логика процедуры (инициализация-изменение-освобождение)
не нарушалась, перед return нужно освободить все выделенные ресурсы.
Чем ближе к финишу, тем болше дублированного кода. Тем больше строк
кода вообще.

Павел.
Re[4]: GOTO must die!!!
От: IT Россия linq2db.com
Дата: 19.09.02 11:46
Оценка:
Здравствуйте aboo, Вы писали:

A>Здравствуйте Alex77, Вы писали:


A>>У меня мало опыта программирования на сях, поэтому я понять не могу почему более двух return per function плохо.

A>>Чем это плохо, объсните пожалуйста.

A>...


A>Если это вопрос ко мне, то только одно предположение — плохой стиль программирования.

A>Хотя в той же MSDN-е полно примеров, где return втречается гораздо больше 2-х раз.

Alex77, не воспринимайте это всё в серьёз, это же форум про юмор
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: GOTO must die!!!
От: Аноним  
Дата: 20.09.02 04:43
Оценка:
Спасибо Павел за то, что объяснили.
Re[4]: GOTO must die!!!
От: Дарней Россия  
Дата: 15.09.04 11:46
Оценка:
Здравствуйте, Snax, Вы писали:

S>А вот когда дело доходит до изменения внутреннего состояния объекта,


какого объекта?
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re: GOTO must die!!!
От: V.Petrovski Беларусь  
Дата: 15.09.04 12:27
Оценка: :)
Здравствуйте, IT, а почему вы пропустили BREAK TO и CONTINUE TO?
... << RSDN@Home 1.1.4 @@subversion >>
Re: GOTO must die!!!
От: _Jane_ Украина  
Дата: 15.09.04 14:50
Оценка:
Здравствуйте, IT, Вы писали:

IT>IT production представляет: "GOTO must die!"


IT>(навеяно топиком 'Выйти из двух циклов сразу'
Автор: LeonGorbachev
Дата: 27.05.02
)


Jane
Re: GOTO must die!!!
От: kavlad Россия http://www.wavesoft.ru
Дата: 19.09.04 09:31
Оценка:
Здравствуйте, IT, Вы писали:

IT>IT production представляет: "GOTO must die!"


IT>(навеяно топиком 'Выйти из двух циклов сразу'
Автор: LeonGorbachev
Дата: 27.05.02
)


На последнем кадре у бедного готика такое удивленное лицо!!!
... По ушам лупит "Melissa — Doncha Feel the Sky" ...
Re[2]: GOTO must die!!!
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 21.09.04 12:10
Оценка:
Здравствуйте, kavlad, Вы писали:

K>На последнем кадре у бедного готика такое удивленное лицо!!!


Не, это подстава. GOTO остался жив и, вероятно, даже здоров. На последнем кадре отчетливо видно, что повержена осталась невалидная конструкция TOGO. Наверное, она попала вместо ненавидимой многими программистами конструкции TODO

А может, кто-то из героев еще и на машинке крестиком вышивать умеет
Алексей Кирдин
Re[3]: GOTO must die!!!
От: achp  
Дата: 21.09.04 12:22
Оценка:
Здравствуйте, Kaa, Вы писали:

Kaa>Не, это подстава. GOTO остался жив и, вероятно, даже здоров. На последнем кадре отчетливо видно, что повержена осталась невалидная конструкция TOGO. Наверное, она попала вместо ненавидимой многими программистами конструкции TODO


Того — это адмирал, который побил Рожественского у Цусимы. Вот и его очередь пришла!
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Re[3]: GOTO must die!!!
От: IT Россия linq2db.com
Дата: 14.02.05 01:24
Оценка:
Здравствуйте, Kaa, Вы писали:

Kaa>На последнем кадре отчетливо видно, что повержена осталась невалидная конструкция TOGO.


TOGO — это стандартная конструкция в американских фастфудах, означающая "с собой"

Kaa>А может, кто-то из героев еще и на машинке крестиком вышивать умеет


На дотнете сишарпиком как минимум двое
Если нам не помогут, то мы тоже никого не пощадим.
Re: GOTO must die!!!
От: Spidola Россия http://www.usametrics.ru
Дата: 14.02.05 16:22
Оценка: 3 (1) :))) :)
Здравствуйте, IT, Вы писали:

IT>IT production представляет: "GOTO must die!"


Самое обидное, что не того прирезали-то... Охотились на GOTO, а на последней картинке на шампуре TOGO... Вот так всегда — хотят люди сделать что-то хорошее, а страдают невинные

В этом суть технологии NET
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: GOTO must die!!!
От: Аноним  
Дата: 25.06.06 14:41
Оценка:
Здравствуйте, IT, Вы писали:

IT>IT production представляет: "GOTO must die!"


Интересно минусы за что? Это ведь юмор.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.