Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Goto 
:(
    Опции темы
Domestic Cat
Дата 25.12.2004, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата
Может, мы про разные языки? smile Я знаю break/continue в Паскале smile Но при чём тут метка (label, тот самый label, на который происходит goto?)


В Java возможна например такая конструкция:
Код

label:
  for (;; )
      for (;; )
          for (int i = 0; i < 100; i++)
                if (i == 55) break label;

Вот это и имелось в виду smile


--------------------

PM   Вверх
dm9
Дата 25.12.2004, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: нет
Всего: 137



Прикольно smile Не знал.
PM MAIL ICQ   Вверх
Sardar
Дата 25.12.2004, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



dm9 это логичнее, так как ты просто помечаешь цикл из которого хочешь потом выйти. Когда узнал чт в Сях этого нет, сильно удивился...


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
dm9
Дата 25.12.2004, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: нет
Всего: 137



Да, в современных языках делается всё, чтобы сделать ненужным применение goto smile
PM MAIL ICQ   Вверх
sergejzr
Дата 27.12.2004, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 7
Всего: 360



Да, но вот в сях её нет... поэтому там нужен GOTO smile
А так конечно прекрасная вещь, эти labels smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
chipset
Дата 19.1.2005, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 4
Всего: 165



Код

#define java_break goto

И никаких goto smile

Это сообщение отредактировал(а) chipset - 19.1.2005, 16:00


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
dm9
Дата 19.1.2005, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: нет
Всего: 137



smile
Добавлено @ 16:52
Если говорить про строго структурированное программирование, тогда к лозунгу "нет goto" можно добавить "нет break-ам, halt-ам, exit-ам, continue-сам". Что там ещё? smile
PM MAIL ICQ   Вверх
Domestic Cat
Дата 19.1.2005, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Брейки и continue - довольно слабая замена goto, для циклов, где пришлось бы иначе добавлять лишние проверки Чаще всего их легко отследить и проблем они не вызывают. Екзит прерывает выполнение программы, потому вопросов там вообще нет. А вот goto может применяться и в других целях.


--------------------

PM   Вверх
Pakshin A. S.
Дата 19.1.2005, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



ПРИВЕДИТЕ ПРИМЕР ПРОГРАММЫ НА ПАСКАЛЕ ИЛИ DELPHI, в которой НЕЛЬЗЯ обойтись без GOTO!!! smile

Любой GOTO может быть заменен: циклом, дополнительным условием в цикле, выбором... smile
PM   Вверх
dm9
Дата 19.1.2005, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: нет
Всего: 137



Pakshin A. S., что доказывается в курсе дискретной математики...

Вот только вопрос не в том, что можно, а в том, что удобно.

Я могу привести как минимум один случай на Паскале и два на Си, когда GoTo удобен. Вернее, я уже приводил эти примеры выше.

Главное, без фанатизма smile
Добавлено @ 19:37
Вернее, на Паскале тоже два случая, но с горем пополам один можно заменить вложенной функцией...
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 19.1.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Гы... мне ее (дискретку) как раз 24-ого сдавать... smile smile smile


А ну дай эти случаи... smile

PM   Вверх
dm9
Дата 19.1.2005, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: нет
Всего: 137



Цитата(dm9 @ 23.12.2004, 17:03)
Применение goto:
- Выход из цикла большой вложенности.
- Переход к выполнению набора действий по условиям, разбросанным по функции. Пример: при ошибке надо сказать пользователю, что произошла ошибка, освободить ресурсы и выйти из подпрограммы. Проверок на ошибку - несколько штук в этой подпрограмме. Тогда в конец функции помещают метку и за ней эти действия, при ошибке - goto label. В Паскале без этого обойтись можно вложенной функцией, в Си, насколько я знаю, нет.


PM MAIL ICQ   Вверх
Sardar
Дата 19.1.2005, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Цитата(dm9 @ 19.1.2005, 18:45)
Выход из цикла большой вложенности.

dm9, на счёт этого у тебя просто "запаянная память" smile smile Циклы логически нужно помечать именнами или уровнями без разницы и командами break/continue продолжать или прерывать требуемый цикл, это логично smile
Это всё равно что передавать в таких языках как JS, Ptyhon и подобных обьект функцию, как нормальный обьект, а не указатель как в C/C++ - что есть домысливание(шаблон) программиста.

Возможно еще более контрастный пример, зачем нам while? Ведь метка + условный блок(if) + goto делают то же самое, попробуй программисту на асме доказать обратное smile

Цитата(dm9 @ 19.1.2005, 18:45)
Переход к выполнению набора действий по условиям, разбросанным по функции. Пример: при ошибке надо сказать пользователю, что произошла ошибка, освободить ресурсы и выйти из подпрограммы. Проверок на ошибку - несколько штук в этой подпрограмме. Тогда в конец функции помещают метку и за ней эти действия, при ошибке - goto label. В Паскале без этого обойтись можно вложенной функцией, в Си, насколько я знаю, нет.

Это устаревшая логика/мышление smile Есть и более продвинутые модели, такие как исключения и прочее smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
dm9
Дата 20.1.2005, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: нет
Всего: 137



Цитата(dm9 @ 19.1.2005, 19:37)
Я могу привести как минимум один случай на Паскале и два на Си, когда GoTo удобен.


Именно так и читать. "Паскаль" и "Си".
Не "С++", не "Delphi", не "Java", не "C#" и так далее.

Хотя в том же Delphi покажи мне способ выхода из цикла большой вложенности. Я знаю только один.

Код
for i := 1 to 100 do
begin
  if (b) then break;
  for j := 1 to 100 do
  begin
     if (b) then break;
     for k := 1 to 100 do
     begin
        if (b) then break;
        for m := 1 to 100 do
        begin
           ...
           if (cond) then
           begin
              b := true;
              break;
           end;
        end;

     end;
  end;
end;


Так попроще будет:

Код
label1:
for i := 1 to 100 do
begin
  for j := 1 to 100 do
  begin
     for k := 1 to 100 do
     begin
        for m := 1 to 100 do
        begin
           ...
           if (cond) then goto label1;
        end;

     end;
  end;
end;


Это сообщение отредактировал(а) dm9 - 20.1.2005, 00:46
PM MAIL ICQ   Вверх
dm9
Дата 19.2.2005, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: нет
Всего: 137



Вот, кстати, о чём я говорил (обработка ошибок).
Пришлось сегодня глянуть на исходник regsvr...

Обратить внимание на строчки

Код
CleanupLibrary:
       FreeLibrary(hLib);
   }

CleanupOle:
   OleUninitialize();


Имхо, достаточно красиво smile

Код
// regsvr.cpp : Program to invoke OLE self-registration on a DLL.
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include <windows.h>
#include <ole2.h>
#include <tchar.h>
#include <stdio.h>
#include "resource.h"

#define FAIL_ARGS   1
#define FAIL_OLE    2
#define FAIL_LOAD   3
#define FAIL_ENTRY  4
#define FAIL_REG    5

const TCHAR _szAppName[] = _T("RegSvr32");
const char _szDllRegSvr[] = "DllRegisterServer";
const char _szDllUnregSvr[] = "DllUnregisterServer";
HINSTANCE _hInstance;

BOOL _bSilent;
BOOL _bConsole;

#define SafePutts(string) ((stdout >= 0) ? _putts(string) : 0)

void
FormatString2(
   LPTSTR lpszOut,
   LPCTSTR lpszFormat,
   LPCTSTR lpsz1,
   LPCTSTR lpsz2
   )
{
   LPCTSTR pchSrc = lpszFormat;
   LPTSTR pchDest = lpszOut;
   while (*pchSrc != '\0') {
       if (pchSrc[0] == '%' && (pchSrc[1] >= '1' && pchSrc[1] <= '2')) {
           lstrcpy(pchDest, (LPCTSTR)(pchSrc[1] == '1' ? lpsz1 : lpsz2));
           pchDest += lstrlen(pchDest);
           pchSrc += 2;
       } else {
           if (_istlead(*pchSrc))
               *pchDest++ = *pchSrc++; // copy first of 2 bytes
           *pchDest++ = *pchSrc++;
       }
   }
   *pchDest = '\0';
}

#define MAX_STRING 1024

void
DisplayMessage(
   UINT ids,
   LPCTSTR pszArg1 = NULL,
   LPCTSTR pszArg2 = NULL,
   BOOL bUsage = FALSE,
   BOOL bInfo = FALSE
   )
{
   if (_bSilent && !_bConsole)
       return;

   TCHAR szFmt[MAX_STRING];
   LoadString(_hInstance, ids, szFmt, MAX_STRING);

   TCHAR szText[MAX_STRING];
   FormatString2(szText, szFmt, pszArg1, pszArg2);
   if (bUsage) {
       int cch = _tcslen(szText);
       LoadString(_hInstance, IDS_USAGE, szText + cch, MAX_STRING - cch);
   }

   if (! _bSilent)
       MessageBox(NULL, szText, _szAppName,
           MB_TASKMODAL | (bInfo ? MB_ICONINFORMATION : MB_ICONEXCLAMATION));

   if (_bConsole) {
       TCHAR szMessage[MAX_STRING];
       FormatString2(szMessage, _T("%1: %2\n"), _szAppName, szText);
       SafePutts(szMessage);
   }
}

inline void
Usage(
   UINT ids,
   LPCTSTR pszArg1 = NULL,
   LPCTSTR pszArg2 = NULL
   )
{
   DisplayMessage(ids, pszArg1, pszArg2, TRUE);
}

inline void
Info(
   UINT ids,
   LPCTSTR pszArg1 = NULL,
   LPCTSTR pszArg2 = NULL
   )
{
   DisplayMessage(ids, pszArg1, pszArg2, FALSE, TRUE);
}

int PASCAL
WinMain(
   HINSTANCE hInstance,
   HINSTANCE,
   LPSTR,
   int
   )
{
   int iReturn = 0;
   HRESULT (STDAPICALLTYPE * lpDllEntryPoint)(void);

   BOOL bVisualC = FALSE;
   BOOL bUnregister = FALSE;
   LPCSTR pszDllEntryPoint = _szDllRegSvr;
   LPCSTR pszDllName = NULL;
   LPCSTR pszTok;

   _hInstance = hInstance;

   // Parse command line arguments.
   int iTok;
   for (iTok = 1; iTok < __argc; iTok++) {
       pszTok = __argv[iTok];

       if ((pszTok[0] == '-') || (pszTok[0] == '/')) {
           switch (pszTok[1]) {
               case 'v':
               case 'V':
                   bVisualC = TRUE;
                   break;

               case 's':
               case 'S':
                   _bSilent = TRUE;
                   break;

               case 'u':
               case 'U':
                   bUnregister = TRUE;
                   pszDllEntryPoint = _szDllUnregSvr;
                   break;

               case 'c':
               case 'C':
                   _bConsole = TRUE;
                   break;

               default:
                   Usage(IDS_UNRECOGNIZEDFLAG, pszTok);
                   return FAIL_ARGS;
           }
       } else {
           if (pszDllName == NULL) {
               pszDllName = pszTok;
               break;
           } else {
               Usage(IDS_EXTRAARGUMENT, pszTok);
               return FAIL_ARGS;
           }
       }
   }

   if (pszDllName == NULL) {
       if (bVisualC)
           DisplayMessage(IDS_NOPROJECT);
       else
           Usage(IDS_NODLLNAME);

       return FAIL_ARGS;
   }

   // Initialize OLE.
   if (FAILED(OleInitialize(NULL))) {
       DisplayMessage(IDS_OLEINITFAILED);
       return FAIL_OLE;
   }

   SetErrorMode(SEM_FAILCRITICALERRORS);       // Make sure LoadLib fails.
   for (; iTok < __argc; iTok++) {
       pszDllName = __argv[iTok];

       // Load the library.
       HINSTANCE hLib = LoadLibraryEx(pszDllName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);

       if (hLib < (HINSTANCE)HINSTANCE_ERROR) {
           TCHAR szError[12];
           wsprintf(szError, _T("0x%08lx"), GetLastError());
           DisplayMessage(IDS_LOADLIBFAILED, pszDllName, szError);
           iReturn = FAIL_LOAD;
           goto CleanupOle;
       }

       // Find the entry point.
       (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, pszDllEntryPoint);

       if (lpDllEntryPoint == NULL) {
           TCHAR szExt[_MAX_EXT];
           _tsplitpath(pszDllName, NULL, NULL, NULL, szExt);

           if ((_stricmp(szExt, ".dll") != 0) && (_stricmp(szExt, ".ocx") != 0))
               DisplayMessage(IDS_NOTDLLOROCX, pszDllName, pszDllEntryPoint);
           else
               DisplayMessage(IDS_NOENTRYPOINT, pszDllName, pszDllEntryPoint);

           iReturn = FAIL_ENTRY;
           goto CleanupLibrary;
       }

       // Call the entry point.
       if (FAILED((*lpDllEntryPoint)())) {
           DisplayMessage(IDS_CALLFAILED, pszDllEntryPoint, pszDllName);
           iReturn = FAIL_REG;
           goto CleanupLibrary;
       }

       Info(IDS_CALLSUCCEEDED, pszDllEntryPoint, pszDllName);

CleanupLibrary:
       FreeLibrary(hLib);
   }

CleanupOle:
   OleUninitialize();

   return iReturn;
}

PM MAIL ICQ   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.2481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.