LINUX.ORG.RU
ФорумTalks

кто тут не любит goto?


0

2

Зачастую оператор goto поможет сильно упростить жизнь или же вообще является единственной вменяемой возможностью.

Например обход в цикле массива переменной размерности без goto реализуется через рекурсию, которая, вообще говоря, не везде разрешена.

★★★★★
Ответ на: комментарий от Deleted

Ну я, например, натолкнулся на случай, где goto сильно помогает.

cvs-255 ★★★★★
() автор топика

Например обход в цикле массива переменной размерности без goto реализуется через рекурсию

Щито?

no-such-file ★★★★★
()

Например обход в цикле массива переменной размерности …

… обычно обозначает ошибку проектирования. И Goto там уже мелочи...

KRoN73 ★★★★★
()

Я лично не люблю. А что?

CYB3R ★★★★★
()
Ответ на: комментарий от KRoN73

… обычно обозначает ошибку проектирования. И Goto там уже мелочи...

Ну как например, можно ввести полностью антисимметричный тензор в пространстве размерности N, где N задается пользователем?

cvs-255 ★★★★★
() автор топика

Например обход в цикле массива переменной размерности без goto реализуется через рекурсию

Позвольте поинтересоваться как долго вас били головой о стенку и сколько удовольствия в от этого получили?

ssvda
()
Ответ на: комментарий от cvs-255

Есть два каноничных применения гоуту (одно из них с душком). Для выхода из функций в си и для реализации конечных автоматов (хотя тут можно очень здорово нарваться).

В остальных случаях --- не нужно.

ssvda
()
Ответ на: комментарий от cvs-255

не сводящиеся к рекурсии?

Давай свой рекурсивный код

no-such-file ★★★★★
()
Ответ на: комментарий от sergej

если не делать goto внутрь циклов, веток if и switch.

Старый фортранщик?

abraziv_whiskey ★★★★★
()
Ответ на: комментарий от cvs-255

Приведи код, нифига не понятно, что там у тебя за массив, потому что первое, что приходит в голову никакого гото не требует.

Yareg ★★★
()
Ответ на: комментарий от KRoN73

Кстати, мы ведь так и не узнали о каком языке идёт речь =)

Какой-то язык, умеющий GOTO :)

Еще без оптимизации хвостовой рекурсии и с возможностью менять количество вложенных циклов во время выполнения.

inoremap ★★
()
Ответ на: комментарий от theNamelessOne

Ну и еще для выхода из вложенных циклов

Ммм.. Да. Но это условно можно отнести к выходу из функций.

Вообще гоуту ещё может использоваться для того чтобы громко хлопнуть дверью

goto 0x0;

На гцц теоретически должно сработать.

ssvda
()
Ответ на: комментарий от h31

Эм, а чем return не устраивает?

А чтобы не дублировать код освобождения ресурсов.

В с++ такой проблемы нет. Там есть деструкторы и раскрутка стека.

ssvda
()

В чистом Си без goto никуда. Постоянно его использую. В Си++ можно без него обходиться за счет наличия исключений и RAII.

Reset ★★★★★
()
Ответ на: комментарий от ssvda

Пользователя вводит м, нужно создать массив А[н**м], и каждому А[и] для 0<=и<=н**м-1 присвоить ф(м, (и/н**(м-1)), (и/н**(м-2))%н, ..., (и/н**2)%н, (и/н)%н, и%н).
Я понял это как-то так.

Yareg ★★★
()
Ответ на: комментарий от Yareg

Вот, например:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int ifend(int *i, int k)

{

if (i[k] >= 3)

return 1;

return 0;

}

int dostep(int *i, int k)

{

return i[k]+1;

}

void nfor(int nmax)

{

int k;

int *i = malloc(sizeof(int)*nmax);

memset(i, 0, sizeof(int)*nmax);

begin_for:

k = 0;

begin:

if (!ifend(i, k))

{

printf(«k = %i i[k] = %i\n», k, i[k]);

if (k < nmax-1)

{

k++;

goto begin;

}

ret:

i[k] = dostep(i, k);

goto begin;

}

else

{

i[k] = 0;

if (k > 0)

{

k--;

goto ret;

}

goto end;

} end:

free(i);

}

int main(void)

{

nfor(2);

return 0;

}

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

Ну и еще для выхода из вложенных циклов

Неужели вариант break <метка> уже отменили? goto для этого не нужен.

Sadler ★★★
()
Ответ на: комментарий от bk_

By the way, if you don’t like goto statements, don’t read this. (And don’t read any other programs that simulate multistate systems.)

goto там юзается активно, этот документ постоянно мелькает в goto-тредах.

encyrtid ★★★★★
()
Ответ на: комментарий от unC0Rr

Сдается мне, что стек адресов вызываемых функций по своей нечитаемости будет не уступать goto.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Sadler

Неужели вариант break <метка> уже отменили? goto для этого не нужен.

В стандарте языка он есть? Нет. В языке си такой конструкции нет, только в твоём диалекте.

ssvda
()
Ответ на: комментарий от Sadler

Неужели вариант break <метка> уже отменили? goto для этого не нужен.

Это и есть goto. Просто область применения урезали.

TDrive ★★★★★
()
Ответ на: комментарий от unC0Rr

И это не поможет в ситуациях, когда рекурсия невозможна не от балды, а по реальным причинам.

Например, в CUDA подобных системах понятие адреса функции не используется.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Дурацкий пример.

void mutator(int *i, int k)
{
i[k]=dostep(i, k);
}

void nfor (int max)
{
int l;
int *i = malloc(sizeof(int)*nmax);
memset(i, 0, sizeof(int)*nmax);
k = 0;
bool repeat=true;
while (repeat)
{
if (!ifend(i,k))
{
printf («k = %i i[k]=%i\n», k, i[k]);
if (k<nmax-1)
k++;
else
mutator (i, k);
}
else
{
i[k]=0;
if (k>0)
{
k--;
mutator(i,k);
}
else repeat=false;
}
}
free(i);
}

Xellos ★★★★★
()

goto стоит использовать если это повышает читабельность кода. Имхо, goto все осуждают лишь для того чтоб им не злоупотребляли новички.

observer ★★★
()
Ответ на: комментарий от cvs-255

Не хватает только аварийного завершения цикла, приходится использовать флаг. С перловыми next и last жизнь обычно проще. Но можно и без них, в принципе.

Xellos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.