Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 26.12.2014, 21:51   #1
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию Exit и Break не прерывает цикла

Здравствуйте. Столкнулся с интересной (для меня) проблемой и не могу разобраться..

Код:
function is2numbers(numbers:TIntegerArray):integer;
var
i,x:integer;
begin
if(length(numbers)<2) then
result:=0;

		for i:=0 to length(numbers)-2 do
          begin
         	if (numbers[i]=numbers[i+1]) then
          begin
          result:=numbers[i];
          break;
          
          end;
    end;

    showmessage(inttostr(result));

    if(result>400) then
    result:=0;
end;
При запуске выполняется условие в цикле , но показывается сообщение. Я думал что раз я присвоил result значит функция не продолжается и если бреак то все - конец. Поменял на exit и результат такой же, в цикле если после эксит поставить вывод сообщения то не работает, но если в коде выше поменять бреак на эксит то сообщение выводится. Т.е. эксит останавливает цикл, но не процедуру.

Мне нужно чтобы при присвоении результата в цикле останавливалась программа. Я так понимаю только goto? Не будет ли это костылем? )

ВОПРОС №2
Если убрать присвоение результата в цикле, то в сообщении все равно выводятся числа! Это как обьяснить?
DarkHacker вне форума
Старый 26.12.2014, 22:31   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Exit всегда вываливает с процедуры/функции с любого места. В конструкции try ... finally есть особенность

Break всегда вываливает из цикла

Присвоение в Result ни как не связано с выходом из функции

Цитата:
Это как обьяснить?
Ну, наверно почитать книгу с самыми азами, наподобие букваря для первоклассников
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 26.12.2014, 22:47   #3
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Цитата:
Exit всегда вываливает с процедуры/функции с любого места. В конструкции try ... finally есть особенность
Почему этого не происходит в примере? Эксит срабатывает как выходс цикла,т.е. в цикле что после эксит не работает, а то что после цикла работает.

Цитата:
Присвоение в Result ни как не связано с выходом из функции
Я понял, спасибо.

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

Я понимаю что я недостаточно знаю букварь, я благодарен что вы мне это напомнили, вас наверное очень замучали подобные вопросы, о том зачем вы так говорите рассуждать не буду, сравнение букваря и меня как первоклассника видимо доставляет вам удовольствие, хорошо я не спорю с вашим профессионализмом, пожалуйста, если вы можете, ответье на мои вопросы выше и укажите хороший букварь, видимо в моем были вырваны страницы. Спасибо.
DarkHacker вне форума
Старый 26.12.2014, 22:58   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Цитата:
Exit всегда вываливает с процедуры/функции с любого места. В конструкции try ... finally есть особенность
Почему этого не происходит в примере?
Потому что, в вашем пример НЕТ Exit;


Цитата:
Ничего же не присваевается, откуда содержимое?
Точно. Там мусор!

сделайте процедуру:
Код:
procedure Test;
var
  i : integer;
begin
    showmessage(inttostr(i))
end;
повызывайте её, понаблюдайте за результатами...


Цитата:
Я понимаю что я недостаточно знаю букварь
Не обижайтесь.
Serge_Bliznykov вне форума
Старый 26.12.2014, 23:02   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В примере Exit нет. Если есть и не выходит, значит до него не доходит управление, например условие if-а никогда не истинно. На букварь не обижайся, ест-но не тот, а букварь для программиста. Научись ставить бряки, т.е. точки останова, и пошаговая трассировка в процедуре (F7). Смотри какие команды выполняются, значения переменных в этот момент. Без этого ни куда
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.12.2014 в 23:04.
Аватар вне форума
Старый 26.12.2014, 23:04   #6
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Цитата:
Потому что, в вашем пример НЕТ Exit;
Я писал что если заменить бреак на эксит, тогда ....
Цитата:
Точно. Там мусор!
Я так и понял, почему мусор тогда равен всегда числам от 2 до 10, т.е последовательно . столько сколько итераций цикла. Как это связано?

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

Цитата:
В примере Exit нет. Если есть и не выходит, значит до него не доходит управление, например условие if-а никогда не истинно. На букварь не обижайся, ест-но не тот, а букварь для программиста. Научись ставить бряки, т.е. точки останова, и пошаговая трассировка в процедуре (F7)
Хм, странно. Если делаю так:
Код:
if (numbers[i]=numbers[i+1]) then
          begin
          result:=numbers[i];
          exit;
          end;
То код ниже ЦИКЛА все равно выводит сообщение с последовательными цифрами равными I (переменная подсчета итераций). Я просто понять хочу, наговнокодить го ту я всегда успею)

Код:
Научись ставить бряки, т.е. точки останова, и пошаговая трассировка в процедуре (F7).
Это точно выход, в ближайшем будущем сяду , выучу. Если есть хорошая информация по этому поводу, поделитесь пожалуйста.

Последний раз редактировалось Stilet; 26.12.2014 в 23:37.
DarkHacker вне форума
Старый 26.12.2014, 23:14   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
ниже ЦИКЛА все равно выводит сообщение
Повторяю, до Exit дело не дошло. А что там выводит разбирайся
Цитата:
Если есть хорошая информация по этому поводу, поделитесь пожалуйста
Нет у меня хорошей информации, книжек по паскалю или делфи в жизни не читал, хелп-а делфийского и интернета с головой хватило. Вверху раздела есть пост с литературой, покопайся там
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 26.12.2014, 23:17   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
То код ниже ЦИКЛА все равно выводит сообщение с последовательными цифрами равными I (переменная подсчета итераций).
простите - НЕ ВЕРЮ!

полностью архив с вашим проектом выложите на форум (или на файлообменник, а сюда ссылку на скачивание), посмотрим!


Цитата:
Это точно выход, в ближайшем будущем сяду , выучу. Если есть хорошая информация по этому поводу, поделитесь пожалуйста.
ну, этого добра полно.
начните, например, со статьи отсюда
Чтобы отлаживать код, нужно поставить точку останова (BreakPoint) и пройтись пошагово (by step - клавиша F7), не надо садиться и что-то учить!
Serge_Bliznykov вне форума
Старый 26.12.2014, 23:31   #9
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Если код будет таким:

Код:
function is2numbers(numbers:TIntegerArray):integer;
var
i,x:integer;
begin
if(length(numbers)<2) then
result:=0;

		for i:=0 to length(numbers)-2 do
          begin
         	if (numbers[i]=numbers[i+1]) then
          begin
          result:=numbers[i];
          break;  
          end;
          result:=0;
    end;

    if(result>400) then
    result:=0;
end;
Все работает как нужно. Значит как я понимаю МОЯ функция работает так: результат отдается, и если в то место где оно отдается есть вывод, он происходит (а он есть если результат больше 0), но при этом функция продолжает работать дальше?

Мне кажется что я ошибаюсь. Обьясните пожалуйста. Отличительной чертой моей писанины может быть то что я портировал код из Си ...

Несу чепуху)) Извините. Попробую разобратся сам. Спасибо)

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось DarkHacker; 26.12.2014 в 23:40.
DarkHacker вне форума
Старый 26.12.2014, 23:41   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Первое.
Научитесь нормально форматировать код.
Используйте отступы, чтобы выделить логические (вложенные) блоки кода.

сравните со своим:
Код:
function is2numbers(numbers: TIntegerArray): integer;
var
  i, x: integer;
begin
  if (length(numbers) < 2) then
    result := 0;

  for i := 0 to length(numbers) - 2 do
  begin
    if (numbers[i] = numbers[i + 1]) then
    begin
      result := numbers[i];
      break;
    end;
    result := 0;
  end;

  if (result > 400) then
    result := 0;
end;
во-вторых.
Цитата:
результат отдается
Вы, похоже, чего-то не понимаете...
Результат, как Вы выражаетесь, "отдаётся" только после выхода из функции.
До того, как Вы вышли из функции, внутри есть специальная переменная с именем Result и типом, равным типу функции, в которую можно записывайть данные, её можно использовать во всех операциях, где может быть использована просто локальная переменная.

Если Вас смущает имя Result,
тогда попробуйте написать так (old-school - classic Pascal style:
Код:
function is2numbers(numbers: TIntegerArray): integer;
var
  i, x: integer;
begin
  if (length(numbers) < 2) then
    x := 0;

  for i := 0 to length(numbers) - 2 do
  begin
    if (numbers[i] = numbers[i + 1]) then
    begin
      x := numbers[i];
      break;
    end;
    x := 0;
  end;

  if (result > 400) then
    x := 0;
  
  {назначим функции значение X}
  is2numbers := x
  
end;
теперь давайте перейдём к логике ваше функции.

попробуйте записать свою функцию так.
Код:
function is2numbers(numbers: TIntegerArray): integer;
var
  i: integer;
begin
  result := 0;

  if (length(numbers) < 2) then Exit;

  for i := 0 to length(numbers) - 2 do
  begin
    if (numbers[i] = numbers[i + 1]) then
    begin
      result := numbers[i];
      break;
    end;
  end;

  if (result > 400) then
    result := 0;
end;
Проанализируйте, что я изменил, работает ли функция так, как Вам надо (т.е. подходит это под ваш алгоритм или нет).
Serge_Bliznykov вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
System.exit custom Общие вопросы по Java, Java SE, Kotlin 0 11.01.2012 14:47
Продолжить после exit(); Rost93 PHP 4 05.09.2011 19:36
exit/2 - зачем слеш? vedro-compota Общие вопросы C/C++ 7 02.06.2011 10:31
ld returned 1 exit status Hemul Qt и кроссплатформенное программирование С/С++ 9 07.04.2011 11:31
Замена Exit hacker_xD Общие вопросы Delphi 1 03.03.2011 20:50