Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Встроенный счётчик есть? 
:(
    Опции темы
Rohoss
Дата 17.3.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

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



Есть ли в Delphi какая-то переменная, которую можно использовать вместо счётчика цикла?
Код

var
  I: Integer;
begin
  for I := 0 to List.Count - 1 do
  begin
    ..........................
  end;
end;

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


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
kami
Дата 17.3.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Rohoss @  17.3.2009,  22:25 Найти цитируемый пост)
В таких случаях можно было бы и не писать var.

нельзя. ObjectPascal, как и Delphi - строгие языки, объявлять переменные нужно обязательно, причем тип играет огромное значение. К примеру, следующий цикл будет выполнен великое множество раз, если List.Count=0.

Код

var
  I: DWORD;
begin
  for I := 0 to List.Count - 1 do
  begin
    ..........................
  end;
end;



Цитата(Rohoss @  17.3.2009,  22:25 Найти цитируемый пост)
Может в VCL завалялась какая-то переменная, которую можно использовать для данных целей?

Не вижу смысла. Уменьшения размера программы таким образом добиться не получится. Даже если и удатся что-то найти в VCL, то это будет глобальная переменная, которая после выхода из цикла окажется в неопределенном состоянии. И кто даст гарантию, что какой-нибудь метод из VCL не захочет случайно спросить, какое же значение было раньше в этой переменной? Последствия - непредсказуемы.
PM MAIL WWW   Вверх
bems
Дата 17.3.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Данкинг
Дата 17.3.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



 smile А сиё вообще хоть в каком-нибудь языке есть?! smile 

Это сообщение отредактировал(а) Данкинг - 17.3.2009, 23:40


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
former
Дата 18.3.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

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



Цитата(bems @  17.3.2009,  22:50 Найти цитируемый пост)
даже если бы где-то в другом модуле и была ненужная переменная, использовать ее не получилось бы. Счетчик цикла должен быть объявлен там же, где и цикл 

Да ну! Ну а если эта переменная глобальная, объявлена в модуле главной формы (программы)?
А из VCL нет.

Это сообщение отредактировал(а) former - 18.3.2009, 00:14


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 18.3.2009, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(former @  18.3.2009,  00:04 Найти цитируемый пост)
Да ну!

Ну да.  bems прав. Delphi по этому поводу говорит, что for loop-control variable must be a simple local variable.
А речь идет именно о переменных, объявленных в других модулях (если конкретнее - в исходниках VCL), которые планируется задействовать в своем коде в качестве счетчиков цикла.
PM MAIL WWW   Вверх
former
Дата 18.3.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

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



Цитата(kami @  18.3.2009,  00:14 Найти цитируемый пост)
loop-control variable must be a simple local variable

это точно. пробовал с Tag.  Ругается. smile 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Rohoss
Дата 18.3.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

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



Цитата(Данкинг @  17.3.2009,  23:39 Найти цитируемый пост)
А сиё вообще хоть в каком-нибудь языке есть?!

В  С – подобных языках это и не требуется, так как переменная объявляется прямо на месте



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Данкинг
Дата 18.3.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(Rohoss @  18.3.2009,  00:37 Найти цитируемый пост)
В  С – подобных языках это и не требуется, так как переменная объявляется прямо на месте

Но всё равно же объявление переменной присутствует, пусть и не такое, как в Дельфи ( for (i = 0;.....).


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
bems
Дата 18.3.2009, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(former @  18.3.2009,  00:04 Найти цитируемый пост)
Да ну!
Да да!



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Matematik
Дата 18.3.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

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



В 2009 появилась конструкция for in

Код

procedure TForm1.Buton1Click(Sender: TObject);
var
  s,z : string;
  c : Char;
  sl : TStringList;
begin
  z := '1234';
  for c in z do
    ShowMessage(c);

  sl := TStringList.Create;
  sl.Add('4');
  sl.Add('3');
  sl.Add('2');
  sl.Add('1');

  for s in sl do
    ShowMessage(s);

end;


PM MAIL WWW ICQ   Вверх
THandle
Дата 18.3.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Цитата(Matematik @  18.3.2009,  14:41 Найти цитируемый пост)
В 2009 появилась конструкция for in


Небольшая поправка: цикл for...in...do появился еще в Delphi 2005.
PM   Вверх
Gwire
Дата 18.3.2009, 15:10 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

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



smile есть пару вариантов, если не устраевает обычный.
Да и в зависимости от того какую цель приследовать.
Код
procedure TForm1.Button2Click(Sender: TObject);
  procedure BodyFor(i: Integer);
  begin
      ShowMessage( IntToStr(i) );
  end;
begin
    asm
      push eax           ;// сохраняем значение ebх
      push ecx           ;// сохраняем значение eсх
      mov ecx, 5
      @begin:
          push eax
          push ecx
          mov eax, ecx
          call BodyFor
          pop ecx
          pop eax
          loop @begin  
      @end:
      pop ecx            ;// востонавливаем значение eсх
      pop eax            ;// востонавливаем значение ebх (в обратном порядке)
    end
end;

smile Сложнее чем обычный зато со спецальной управляющей есх
Код
procedure TForm1.Button3Click(Sender: TObject);
var P: Pointer;
begin
    GetMem( P, SizeOf(Integer) );       // управляющая цикла
    Integer(P^):= 5;                    // ^ справа - значение указателя
    while (Integer(P^) <> 0 ) do
    begin
        ShowMessage( IntToStr(Integer(P^)) );
        Dec( Integer(P^) );
    end;
    FreeMem(P);                         // нужно освободить память

    GetMem( P, SizeOf(Integer) );       // строковая переменная
    String(P^):= 'Строка к примеру';
    ShowMessage( String(P^) );
    FreeMem(P);

    GetMem( P, SizeOf(TForm) );         // и даже форма
    TForm(P^):= TForm.Create(nil);
    TForm(P^).ShowModal;
    TForm(P^).Free;
    FreeMem(P);                         // <-- Не завываем освободить
end;

smile Этот вариант избавляет от лишних переменных
Но стоит ли так "ПАРИТЬ" себе голову? По моему этот вид лучше и проще:
Код
procedure TForm1.Button4Click(Sender: TObject);
var I: Integer;
begin
    for I:= 1 to 5 do ShowMessage( IntToStr(I) );
end;


PM MAIL   Вверх
Beltar
Дата 20.3.2009, 12:08 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А сиё вообще хоть в каком-нибудь языке есть?


В Аде ЕМНИП переменная цикла автоматом становится Integer.

Цитата

В  С – подобных языках это и не требуется, так как переменная объявляется прямо на месте


Если уж заговорили об экономии двух-трех символов, то позволю себе небольшой оффтопик. В Си цикл for, я за таковой вообще не считаю. Т. к. for(i=0;i<n;i++) совершенно аналогично
Код

i:=0;
while i<n do
  begin
  //
  Inc(i);
  end;


В обоих случаях описано ровно 3 операции. Укажите хоть одно отличие от while? На кой фиг это дебильное i++ вообще нужно, если цикл for в 99,9% случаев имеет инкремент 1?

Это сообщение отредактировал(а) Beltar - 20.3.2009, 12:33


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Dmi3ev
Дата 22.3.2009, 13:02 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

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



Код

{
    for (int i=0; i<n; i++)
    {
    //...
    }
}

Код

i:=0;
while i<n do
  begin
  //
  Inc(i);
  end;

С++  с Delphi сравнивать?  smile 
Цитата

Укажите хоть одно отличие от while?

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

for (int i=0, int j=10; i<j; i++, j--)
{
//...
}

что с while уже будет выглядеть более запутано на мой взгляд...
Цитата

На кой фиг это дебильное i++ вообще нужно

а на кой фиг Inc(i); ?
 (не нравится сделай свою функцию Inc() или пиши i=i+1, кто не дает)
а если серьезно то "++" много возможностей и это удобная штука, а если не умеешь ей пользоваться, то это не значит, что она "дебильная"...
4) 
Цитата

если цикл for в 99,9% случаев имеет инкремент 1

у кого как... 
Код

for (double x=0; x<k; x+=0.2)
{
//...
}

а это чем тебе не цикл?
На самом деле Delphi и С++ сравнивать - глупое занятие, поэтому продолжать не буду...

Это сообщение отредактировал(а) Dmi3ev - 22.3.2009, 14:48


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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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