Описание переменных вне директивы описания

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Описание переменных вне директивы описания

Сообщение KUKA » 21.04.2013 20:27:35

Есть ли в FP фича, аналогичная в других языках, типа C\C#\lua.... когда переменную можно описать в любом месте кода?
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Описание переменных вне директивы описания

Сообщение Лекс Айрин » 21.04.2013 20:52:54

KUKA, насколько я знаю, нет. А смысл?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Описание переменных вне директивы описания

Сообщение vada » 22.04.2013 15:25:57

А смысл?

Удобно.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Описание переменных вне директивы описания

Сообщение absdjfh » 22.04.2013 15:32:56

PascalABC.Net, например, реализовал это:
Код: Выделить всё
begin
  var s: Integer;
  s := 0;
  for var i := 1 to 100 do
    s := s + i;
end.

Тем не менее, острой необходимости в подобном нет, но да - так было бы удобнее.
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

Re: Описание переменных вне директивы описания

Сообщение Лекс Айрин » 22.04.2013 15:34:35

vada, зато приводит к куче ошибок, которые тяжело будет найти. Лучше уж пролистать на начало текста.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Описание переменных вне директивы описания

Сообщение dedm0zaj » 22.04.2013 16:04:55

я щитаю, что объявление переменных перед телом функции стимулирует к написанию этих функций меньшего размера. так что возможность объявлять переменные, где душе захочется, не нужна.
dedm0zaj
постоялец
 
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Re: Описание переменных вне директивы описания

Сообщение KUKA » 22.04.2013 16:55:18

dedm0zaj писал(а):я щитаю, что объявление переменных перед телом функции стимулирует к написанию этих функций меньшего размера. так что возможность объявлять переменные, где душе захочется, не нужна.


Вы эо локальным переменным скажите. Допустим мне нужна какая-то переменная в теле цикла, по завершению цикла, например плюсы освобождают память, выделенную для неё, что очень удобно.

Ну, а про ошибки... если их сразу не делать, то потом их не возникнет. На самом деле это жесткий минус паскалю, т.к после использования переменной её придется либо удалять вручную, либо оборачивать в функцию, либо объявлять через указатель, выделять её память, а потом освобождать, что как раз может привести к ошибкам, из-за чего может течь память.

Ну вот пример, допустим у меня функция очень длинной получилась, даже не смотря на разбивание её на составляющие, и листать вверх объявления блока, что бы вспомнить название функции или изменить название или тип, очень неудобно, благо есть IDE с умными закладками, но порой и они не спасают.

В итоге получается, что на паскале можно разве что писать всякие школьные поделки-перделки, а когда пытаешься написать что-то серьезное, возникают мелочи организации, которые критичны в проекте.

Про PascalABC вообще молчу, т.к это форум все же о freepascal.
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Описание переменных вне директивы описания

Сообщение SeZuka » 22.04.2013 17:28:33

KUKA писал(а):т.к после использования переменной её придется либо удалять вручную

Это как?
Код: Выделить всё
var s: string;
s:='не забудь удалить меня';
delete s;

Так чтоли? :lol:
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Описание переменных вне директивы описания

Сообщение vada » 22.04.2013 18:12:50

Лекс Айрин писал(а):vada, зато приводит к куче ошибок, которые тяжело будет найти.

Пишу на JAVA и C# там почему-то не возникает кучи ошибок которые тяжело найти. В чем собака порылась?

Добавлено спустя 9 минут 3 секунды:
SeZuka писал(а):Так чтоли? :lol:

Не так
Код: Выделить всё
procedure A(....)
var
I, J, K: integer;
MamaMilaLushuMilim: TXrenChtoZaTip;

  procedure aa1;
  var
  ...
  begin
  ....
  end;

  procedure bb1;
  var
  .....
  begin
  ...
  end;

  ...
  ...
  ...
begin
  // Тля! как там называлась та странная переменная? 2000 строк надо вверх отлистать.
end;
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Описание переменных вне директивы описания

Сообщение Лекс Айрин » 22.04.2013 18:27:14

KUKA, всегда определял несколько переменных под циклы и прочую времянку. А потом их повторно использовал.

KUKA писал(а):если их сразу не делать, то потом их не возникнет.


Попробуйте. Но не думаю, что у ВАС это получится. Например, Вы можете такую переменную забыть удалить.

KUKA писал(а):В итоге получается, что на паскале можно разве что писать всякие школьные поделки-перделки, а когда пытаешься написать что-то серьезное, возникают мелочи организации, которые критичны в проекте.


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

KUKA писал(а):благо есть IDE с умными закладками, но порой и они не спасают.


Есть и другие способы... и им очень много лет.

Добавлено спустя 4 минуты 37 секунд:
vada писал(а):Пишу на JAVA и C# там почему-то не возникает кучи ошибок которые тяжело найти. В чем собака порылась?


угу.. скажите это хакерам, которые очень быстро такие ошибки находят. На самом деле, то что вы не видите этих ошибок еще не означает, что их нет. Тут может, например, срабатывать хорошая оптимизация текста транслятором... или чистое везение.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Описание переменных вне директивы описания

Сообщение dedm0zaj » 22.04.2013 18:47:39

KUKA писал(а):Ну вот пример, допустим у меня функция очень длинной получилась, даже не смотря на разбивание её на составляющие, и листать вверх объявления блока, что бы вспомнить название функции или изменить название или тип, очень неудобно, благо есть IDE с умными закладками, но порой и они не спасают.


vada писал(а):Не так
Код: Выделить всё
procedure A(....)
var
I, J, K: integer;
MamaMilaLushuMilim: TXrenChtoZaTip;

  procedure aa1;
  var
  ...
  begin
  ....
  end;

  procedure bb1;
  var
  .....
  begin
  ...
  end;

  ...
  ...
  ...
begin
  // Тля! как там называлась та странная переменная? 2000 строк надо вверх отлистать.
end;


а нафига делать такие длинные процедуры/функции?
я и говорю, что объявление переменных перед телом функции стимулирует написание коротких функций, а не over9000 строк.

KUKA писал(а):благо есть IDE с умными закладками

ide с умными закладками и другими фичами, "облегчающими" работу программиста, стимулируют к написанию кода, который потом будет трудночитаем на ide без умных закладок и других фич.
как по мне, так код должен легко читаться даже в простом блокноте.
dedm0zaj
постоялец
 
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Re: Описание переменных вне директивы описания

Сообщение SSerge » 22.04.2013 19:21:00

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

Лекс Айрин писал(а):угу.. скажите это хакерам, которые очень быстро такие ошибки находят.

Да ну... Они совсем не эти ошибки вообще то находят :mrgreen: Не забываем, что переменные, определенные внутри логических блоков, во всех современных языках при выходе из зоны видимости уничтожаются и более недоступны. Более того, сам компилятор не даёт возможности их использовать там, где они недоступны.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Описание переменных вне директивы описания

Сообщение svk12 » 22.04.2013 20:15:41

KUKA писал(а):после использования переменной её придется либо удалять вручную


Вообще-то локальные переменные размещаются в стеке, и освобождаются при возврате
из подпрограммы. Если же речь идёт об указателях, требующих явного выделения/освобождения памяти,
то никто не мешает прописать эти действия в зависимости от выполнения условных операторов, т.е. при отсутствии
необходимости вовсе их не выполнять.
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: Описание переменных вне директивы описания

Сообщение Лекс Айрин » 22.04.2013 21:26:26

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

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

KUKA писал(а):Вы эо локальным переменным скажите. Допустим мне нужна какая-то переменная в теле цикла, по завершению цикла, например плюсы освобождают память, выделенную для неё, что очень удобно.

А Вы уверены, что они (с++) освобождают память? Если я правильно помню теорию построения трансляторов, то все переменные в память пересылаются целым сегментом независимо от степени их локальности. Максимум, который возможен, это использование регистров в качестве временных переменных, да и то, не факт, что это получится с конкретной переменной. Освобождаются только динамические переменные, для которых создается собственный сегмент. Ах да, есть еще сегмент стека, но с ним надо быть очень аккуратным, так как разбалансирование стека верный путь к краху, как минимум, программы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Описание переменных вне директивы описания

Сообщение runewalsh » 23.04.2013 03:09:36

Лекс Айрин писал(а):А Вы уверены, что они (с++) освобождают память?

RAII изкоробки ж. Ключевая фича языка.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru