Описание переменных вне директивы описания
Модератор: Модераторы
Описание переменных вне директивы описания
Есть ли в FP фича, аналогичная в других языках, типа C\C#\lua.... когда переменную можно описать в любом месте кода?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
KUKA, насколько я знаю, нет. А смысл?
А смысл?
Удобно.
PascalABC.Net, например, реализовал это:
Тем не менее, острой необходимости в подобном нет, но да - так было бы удобнее.
Код: Выделить всё
begin
var s: Integer;
s := 0;
for var i := 1 to 100 do
s := s + i;
end.
Тем не менее, острой необходимости в подобном нет, но да - так было бы удобнее.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
vada, зато приводит к куче ошибок, которые тяжело будет найти. Лучше уж пролистать на начало текста.
я щитаю, что объявление переменных перед телом функции стимулирует к написанию этих функций меньшего размера. так что возможность объявлять переменные, где душе захочется, не нужна.
dedm0zaj писал(а):я щитаю, что объявление переменных перед телом функции стимулирует к написанию этих функций меньшего размера. так что возможность объявлять переменные, где душе захочется, не нужна.
Вы эо локальным переменным скажите. Допустим мне нужна какая-то переменная в теле цикла, по завершению цикла, например плюсы освобождают память, выделенную для неё, что очень удобно.
Ну, а про ошибки... если их сразу не делать, то потом их не возникнет. На самом деле это жесткий минус паскалю, т.к после использования переменной её придется либо удалять вручную, либо оборачивать в функцию, либо объявлять через указатель, выделять её память, а потом освобождать, что как раз может привести к ошибкам, из-за чего может течь память.
Ну вот пример, допустим у меня функция очень длинной получилась, даже не смотря на разбивание её на составляющие, и листать вверх объявления блока, что бы вспомнить название функции или изменить название или тип, очень неудобно, благо есть IDE с умными закладками, но порой и они не спасают.
В итоге получается, что на паскале можно разве что писать всякие школьные поделки-перделки, а когда пытаешься написать что-то серьезное, возникают мелочи организации, которые критичны в проекте.
Про PascalABC вообще молчу, т.к это форум все же о freepascal.
KUKA писал(а):т.к после использования переменной её придется либо удалять вручную
Это как?
Код: Выделить всё
var s: string;
s:='не забудь удалить меня';
delete s;Так чтоли?
Лекс Айрин писал(а):vada, зато приводит к куче ошибок, которые тяжело будет найти.
Пишу на JAVA и C# там почему-то не возникает кучи ошибок которые тяжело найти. В чем собака порылась?
Добавлено спустя 9 минут 3 секунды:
SeZuka писал(а):Так чтоли?
Не так
Код: Выделить всё
procedure A(....)
var
I, J, K: integer;
MamaMilaLushuMilim: TXrenChtoZaTip;
procedure aa1;
var
...
begin
....
end;
procedure bb1;
var
.....
begin
...
end;
...
...
...
begin
// Тля! как там называлась та странная переменная? 2000 строк надо вверх отлистать.
end;
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
KUKA, всегда определял несколько переменных под циклы и прочую времянку. А потом их повторно использовал.
Попробуйте. Но не думаю, что у ВАС это получится. Например, Вы можете такую переменную забыть удалить.
надо же... вообще-то Паскаль очень активно используется в программировании очень серьезных проектов... причем, как раз то. что Вы считаете минусом, люди считают плюсом. Например, фотошоп первых версий был написан на паскале.
Есть и другие способы... и им очень много лет.
Добавлено спустя 4 минуты 37 секунд:
угу.. скажите это хакерам, которые очень быстро такие ошибки находят. На самом деле, то что вы не видите этих ошибок еще не означает, что их нет. Тут может, например, срабатывать хорошая оптимизация текста транслятором... или чистое везение.
KUKA писал(а):если их сразу не делать, то потом их не возникнет.
Попробуйте. Но не думаю, что у ВАС это получится. Например, Вы можете такую переменную забыть удалить.
KUKA писал(а):В итоге получается, что на паскале можно разве что писать всякие школьные поделки-перделки, а когда пытаешься написать что-то серьезное, возникают мелочи организации, которые критичны в проекте.
надо же... вообще-то Паскаль очень активно используется в программировании очень серьезных проектов... причем, как раз то. что Вы считаете минусом, люди считают плюсом. Например, фотошоп первых версий был написан на паскале.
KUKA писал(а):благо есть IDE с умными закладками, но порой и они не спасают.
Есть и другие способы... и им очень много лет.
Добавлено спустя 4 минуты 37 секунд:
vada писал(а):Пишу на JAVA и C# там почему-то не возникает кучи ошибок которые тяжело найти. В чем собака порылась?
угу.. скажите это хакерам, которые очень быстро такие ошибки находят. На самом деле, то что вы не видите этих ошибок еще не означает, что их нет. Тут может, например, срабатывать хорошая оптимизация текста транслятором... или чистое везение.
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 без умных закладок и других фич.
как по мне, так код должен легко читаться даже в простом блокноте.
Вообще то вынос описания переменных в отдельную секцию был сделан исключительно для того, чтобы дать возможность компилятору паскаля работать в один проход. Из того же назначения - изначальное отсутствие макроопределений и область видимости переменных, всегда распространяющаяся на все тело процедуры.
Да ну... Они совсем не эти ошибки вообще то находят
Не забываем, что переменные, определенные внутри логических блоков, во всех современных языках при выходе из зоны видимости уничтожаются и более недоступны. Более того, сам компилятор не даёт возможности их использовать там, где они недоступны.
Лекс Айрин писал(а):угу.. скажите это хакерам, которые очень быстро такие ошибки находят.
Да ну... Они совсем не эти ошибки вообще то находят
KUKA писал(а):после использования переменной её придется либо удалять вручную
Вообще-то локальные переменные размещаются в стеке, и освобождаются при возврате
из подпрограммы. Если же речь идёт об указателях, требующих явного выделения/освобождения памяти,
то никто не мешает прописать эти действия в зависимости от выполнения условных операторов, т.е. при отсутствии
необходимости вовсе их не выполнять.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
SSerge писал(а):Не забываем, что переменные, определенные внутри логических блоков, во всех современных языках при выходе из зоны видимости уничтожаются и более недоступны.
только вот понятие логического блока может не совпадать с мнением программиста. Особенно у объектов. если уж рыть в эту сторону, то проще сделать так, что счетчик циклов виден только в самом цикле и прописать это в правилах языка.
KUKA писал(а):Вы эо локальным переменным скажите. Допустим мне нужна какая-то переменная в теле цикла, по завершению цикла, например плюсы освобождают память, выделенную для неё, что очень удобно.
А Вы уверены, что они (с++) освобождают память? Если я правильно помню теорию построения трансляторов, то все переменные в память пересылаются целым сегментом независимо от степени их локальности. Максимум, который возможен, это использование регистров в качестве временных переменных, да и то, не факт, что это получится с конкретной переменной. Освобождаются только динамические переменные, для которых создается собственный сегмент. Ах да, есть еще сегмент стека, но с ним надо быть очень аккуратным, так как разбалансирование стека верный путь к краху, как минимум, программы.
Лекс Айрин писал(а):А Вы уверены, что они (с++) освобождают память?
RAII изкоробки ж. Ключевая фича языка.
