Эти глупые Goto

Тема в разделе "Java", создана пользователем melco, 16 янв 2007.

Статус темы:
Закрыта.
  1. melco

    melco Гость

    Всем привет. Скажу сразу, что я программировал на разных языках, но с Явой не приходилось мне работать.
    Мне в руки попали исходники очень важной мне программы. Мне в ней кой-че нужно изменить, мелочь.
    Постави я себе J2EE SDK, NetBeans IDE и думал собрать ее просто первый раз тестово, без изменений.
    А вылезла мне вот такая ошибочка:
    Код (Text):
    b.java:167: illegal start of expression:
    if(k2 == 0) goto _L28; else goto _L27
    И тут меня повергло в ужас. Я вспомнил, что еще в школе учитель информатики говорил, что использовать goto !!!!ЗАПЕЩЕНО!!!, а тут в 28 файлах исходника такая вот лажа. В одном из них 37 лейблов, естественно по всем идут goto.
    Подскажите, чем можно более-мение просто, без сильно глобального рекодинга заменить конструкции goto?

    Я в ауте, потому очень жду вашей помощи.

    Заранее спасибо!
     
  2. Pete

    Pete Гость

    goto в java только для выхода из нескольких циклов используются, заменить можно условиями выхода (устанавливать флаги) и оператором break.
     
  3. melco

    melco Гость

    Там конструкция вида:
    Код (Text):
            if(k2 == 0) goto _L2; else goto _L1
    _L1:
    g.fillRect(l1 - i2, k1 + i2, 2 * i2 + 2, 1);
    i2++;
    _L2:
    if(i2 < j1) goto _L1; else goto _L3
    _L3:
    if(color2 == null)
    break MISSING_BLOCK_LABEL_922;
    g.setColor(color2);
    g.fillRect((l1 - j1) + 2, k1 + j1, 2 * j1, 1);
    if(k2 == 0)
    break MISSING_BLOCK_LABEL_922;
    i2 = 0;
    if(k2 == 0) goto _L5; else goto _L4
    ну и т.д.

    Как мне сказали - это дело рук декомпилятора, но как это заставить работать?
     
  4. Pradov

    Pradov Гость

    "учитель информатики говорил, что использовать goto !!!!ЗАПЕЩЕНО!!!, "

    Бред полнейший )))
    Учителя ф топку)
     
  5. melco

    melco Гость

    Ага, Pradov, точно... Бред! ИСпользуй goto, удачи тебе! :)
     
  6. Igorg

    Igorg Гость

    2.2.6 No More Goto Statements

    Java has no goto statement1. Studies illustrated that goto is (mis)used more often than not simply "because it's there". Eliminating goto led to a simplification of the language--there are no rules about the effects of a goto into the middle of a for statement, for example. Studies on approximately 100,000 lines of C code determined that roughly 90 percent of the goto statements were used purely to obtain the effect of breaking out of nested loops. As mentioned above, multi-level break and continue remove most of the need for goto statements.
    (http://java.sun.com/docs/white/langenv/Simple.doc2.html)
    Как здесь указано, инструкции goto в Java нет вообще.
    Такое месиво не удастся запустить "без сильно глобального рекодинга". Можно попробовать что-то вроде:
    Код (Text):
    if (k2 == 0) {
    if (i2 < j1) {
    g.fillRect(l1 - i2, k1 + i2, 2 * i2 + 2, 1);
    i2++;
    } else {
    if (color2 == null)
    break MISSING_BLOCK_LABEL_922;
    g.setColor(color2);
    g.fillRect((l1 - j1) + 2, k1 + j1, 2 * j1, 1);
    if (k2 == 0)
    break MISSING_BLOCK_LABEL_922;
    i2 = 0;
    if(k2 == 0) [i]goto _L5[/i]; else [i]goto _L4[/i];
    }
    } else {
    g.fillRect(l1 - i2, k1 + i2, 2 * i2 + 2, 1);
    i2++;
    }
    То есть просто вместо goto вставляется текст, на который этот самый goto указывает. Оговорюсь сразу -- это плохой вариант, так как пропускаются некоторые куски, которые могли бы последовательно выполниться, а из-за if-ов не выполнятся.
    break действительно используется для выхода из циклов, вроде как любой вложенности. Почитай поподробнее.
     
  7. Black horse

    Black horse Гость

    goto - является зарезервированным словом языка, но не используется(по крайней мере в 5-й jave).
    А задача, сродни олимпиадной. Есть такой критерий: любой код можно написать без goto, также можно написать без циклов и операторных скобок с помощью goto. Так что тебе надо понять логику и goto заменить на циклы, операторные скобки, а возможно и дополнительные переменные.
     
  8. Andron1234

    Andron1234 Гость

    оператор goto является оператором безусловного перехода, но безусловность может быть относительной, если добавить функцию перехода по переменной, а написание кода бедет легче чем с оператором case. так что очень хороший оператор, просто языки программирования ещё создаются для крестьян(их легче разводить), а хороших ,практически, в массах нету, хоть сам делай.
     
  9. Igorg

    Igorg Гость

    Если нужны безусловные относительные переходы -- пользуйтесь ассемблером. Что касается крестьян, то чтобы считать крестьянами сотрудников фирмы Sun, да и многих других высокопрофессиональных теоретиков программирования, которые уже пару десятков лет не рекомендуют использовать goto -- надо как минимум уже создать "хороший" язык программирования и написать компилятор к нему.
     
  10. Andron1234

    Andron1234 Гость

    извините, я сварщик ручной дуговой сварки, преимущественно работаю на монтаже (лучше для сварщика места быть не может) и создал я, считаю, хорошую коробку передач(и не только, вобщем способ, дающий право на жизнь множеству новых механизмов), где шестерни не разъеденяются, что позволит делать (надеюсь) робототехнику с одним двигателем на все исполнительные механизмы, в полне пригодную для эксплуатации даже в самых жёстких условиях.
    языками программирования же интересуюсь для защиты авторского права, после кидалова в ФИПСе, и для самообучения на новом,для себя, уровне с помощью созданных собою поисковых систем (пока осваиваю необходимые материалы)с функциями не вошедшими в функции обычных поисковых серверов, и даже предложения которых остались их службами без внимания. Короче надо мне и всё!!! И безусловный переход по переменной хочу и баста!!! :). Такие дела.
     
  11. Igorg

    Igorg Гость

    Ок. Я пока занимаюсь усовершенствованием своих знаний в имеющихся языках
     
  12. Pasha

    Pasha Гость

    Для: Andron1234
    http://ru.wikipedia.org/wiki/Goto
    Письмо Дейкстры Go To Statement Considered Harmful было написано 39 лет назад...
    Функция перехода по переменной...и что в эту переменную надо будет записывать? Неужели адрес?OMG, а как перейти обратно?
     
  13. Andron1234

    Andron1234 Гость

    Не вопрос.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей