1. Уважаемые участники и гости, 19 октября codeby будет работать в режиме "Только чтение". Регистрация новых участников будет закрыта. 20 октября портал продолжит работу в прежнем режиме.

Эти глупые Goto

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

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

    melco Гость

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

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

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

    Pete Гость

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

    melco Гость

    Репутация:
    0
    Там конструкция вида:
    Код:
    		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 Гость

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

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

    melco Гость

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

    Igorg Гость

    Репутация:
    0
    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 нет вообще.
    Такое месиво не удастся запустить "без сильно глобального рекодинга". Можно попробовать что-то вроде:
    Код:
    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 Гость

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

    Andron1234 Гость

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

    Igorg Гость

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

    Andron1234 Гость

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

    Igorg Гость

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

    Pasha Гость

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

    Andron1234 Гость

    Репутация:
    0
    Не вопрос.
     
Загрузка...
Статус темы:
Закрыта.

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