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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаг в кикле. Как сделать? 
:(
    Опции темы
LJ
Дата 31.10.2002, 02:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Прешёл с VB на Delphi, попробовал цикл For и заметил что привычного step нет. Как же его всё-таки можно реализовать?
  Вверх
Vit
Дата 31.10.2002, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Такой конструкции нет (и никогда не было, к сожалению)
Заменить на While:

[Code]
Var i:integer;
...
While i<SomeMaxValue do
 begin
   i:=i+Step;
   ....Do something
 end;
[Code]


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
neutrino
Дата 31.10.2002, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Кстати, а что будет если ... :

procedure Cycle(Step: Integer)
var I: Integer;
begin
 for
I := 1 to 100 do
 begin

   I := I + Step - 1;
   ......
   ......
   ......
 end;
end;


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Baa
Дата 31.10.2002, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Ничего не будет... нельзя ассигновать значение переменной цикла FOR


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Vit
Дата 31.10.2002, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Цитата(neutrino @ 30.10.2002, 10:04)
Кстати, а что будет если ... :

Ничего хорошего не будет - компиллятор не компиллирует такие вещи начиная со 2х Дельфей


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
neutrino
Дата 31.10.2002, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Жаль, а С такое понимает :(


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Baa
Дата 31.10.2002, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Цитата(neutrino @ 30.10.2002, 20:31)
Жаль, а С такое понимает :(

Ну там-то вообще все просто :)
for (int i = 0; i < 10; i+=2)
printf ("Test %d", i);


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Baa
Дата 31.10.2002, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



На самом деле, есть возможность использование конструкции со степом...
for I := 1 to 10 do
 begin
   asm
     Inc ebx
   end;
   WriteLn (I);
 end;

Как организован цикл в дельфи:
каждую итерацию регистр ebx увеличивается на 1
и в конце цикла происходит сравнение регистра с 10 (в данном случае)
что это может повлечь за собой:
ну самое малое - это то, что увеличивая регистр на 2 мы можем просто пролетить 10 и выдет бесконечный цикл (9+2=11)
Как избежать: можно в памяти исправить сравнение равности (jnz) на заменить на <=.
А вообще, не стоит оно таких затрат.


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Шурик
Дата 31.10.2002, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Неужели всегда в цикле используется регистр ?
А если я зделаю много вложеных циклов, тогда в коде появится много PUSH и POP ?
PM MAIL   Вверх
neutrino
Дата 31.10.2002, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Я почему-то всегда думал, что там используется регистр CX. А про вложенные циклы: именно так это и делается. По крайней мере я, когда писал сортировку массива, использовал PUSH, POP. Но их не так уж и много - одна пара на каждый вложенный цикл.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Chingachguk
Дата 31.10.2002, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



На самом деле компилляторы сейчас стали значительно умнее и просто так push-и не втыкают. Вот пример. Это оригинальный MS-овский код (Excel).

Код

; Подпрограмма MD5Update( MD5_CTX - контекст MD5, буфер, длина буфера )
; MD5_CTX - контекст MD5 - в ECX (его адрес)
; буфер - в EDX (его адрес)
; длина буфера - в стеке (первое слово за адресом возврата)
P309AD4FC proc; Что-то делаем с 24 байтами по ECX(0062B958)
 sub esp,40h; Выделить 64 байта ?
 push ebx; 10h
 push esi
 push edi; 00640F64
 mov esi,ecx; Адрес переданного по ECX буффера-0062B958
 mov eax,[esp+50h]
 push ebp
 mov ebp,edx      
; EBP=0062BCFE - адрес следующих 2 байт этого буффера ?
 mov edx,[esi]; 4 байта из переданного в ECX массива
 mov ecx,edx; Положить их (00,50h,..) в ecx
 lea eax,[edx+eax*8]; Длина массива * 8 + dd из массива в 24
 and ecx,01F8h; 4 байта из переданного в ECX массива and 01F8h
 shr ecx,3; разделить их на 8
 cmp eax,edx; Сравнить: (Длина массива * 8 + dd из массива в 24 байта) и (dd из массива)
 jae L309AD522; Вышли за пределы ?
 inc dword ptr [esi+04]; ESI=0062B958 - адрес массива в 24 байта ? L309AD522:
 mov [esi],eax; в массив 24h положить вычисленный eax
 mov eax,[esp+54h]; Длина еще одного буффера, переданного нам
 shr eax,1Dh      ; Оставить 31 и 30 биты ? - 00,00,..
 add [esi+04],eax; Добавить к ESI=0062B958 - адрес массива в 24
 mov eax,[esp+54h]; Длина еще одного буффера, переданного нам
 dec dword ptr [esp+54h]; Длина еще одного буффера, переданногонам
 test eax,eax; Прошли весь переданный массив ?
 jz L309AD59F; Нет, нет,..
L309AD53A:
 mov al,[ebp+0]; С 0062BCFE взять 31h,00h,.. (Пароль в UniCode со второго символа ?)
 inc ebp
 mov [ecx+esi+18h],al
; Положить его в [4 байта из переданного в ((ECX and 01F8h) shr 3 +
; + адрес переданного массива в 24 байта + следующие в нем 24 байта)
 inc ecx; Прирастить разделенный на 8 первый элемент массива
 cmp ecx,40h; Он вдруг стал 64 ?
 jnz L309AD593; Да, да ...
 xor edi,edi
 lea eax,[esp+10h]
L309AD54E:
 lea ebx,[edi+esi]
 xor ecx,ecx
 xor edx,edx
 add eax,04
 mov cl,[ebx+1Bh]
 mov dl,[ebx+19h]
 shl ecx,10h
 add edi,4
 or ecx,edx
 xor edx,edx
 shl ecx,08h
 mov dl,[ebx+1Ah]
 shl edx,10h
 or ecx,edx
 xor edx,edx
 mov dl,[ebx+18h]
 or ecx,edx
 mov [eax-04],ecx
 lea ecx,[esp+50h]
 cmp eax,ecx
 jb L309AD54E
 lea edx,[esp+10h]
 lea ecx,[esi+08h]
 call P309AD671; МАКРОСЫ !!!
 xor ecx,ecx
L309AD593:
 mov eax,[esp+54h]; ->09,..
 dec dword ptr [esp+54h]; Длина еще одного буффера, переданного нам
 test eax,eax; Прошли весь переданный буффер ?
 jnz L309AD53A; Продолжать заменять переданный буффер символами пароля
L309AD59F:
 pop ebp
 pop edi
 pop esi
 pop ebx
 add esp,40h
 ret 4
P309AD4FC endp
; Конец подпрограммы 309AD4FC


Обратите внимание, как компиллятор оформил вложенные циклы.
Самый верхний цикл (метка L309AD53A) использует локальный счетчик в [esp+54h] - видимо, программист декрементировал переданный int:

MD5_Update(... int Count..)
{
...
do // метка L309AD53A
{
...
}
while (!--Count)
...

Внутри этого цикла есть вложенный (метка L309AD54E). На этот раз компиллятор обошелся регистрами и командой lea для движения по локальному буфферу:

lea eax,[esp+10h]
L309AD54E:
...
lea ecx,[esp+50h]
cmp eax,ecx
jb L309AD54E

Видимо, тут программист писал что-то вроде:

BYTE  LocBuffer[0x40];
BYTE b;
BYTE *p;

p= LocBuffer;
while (1)
{
b = p++;
...
 if (p == *LocBuffer + sizeof(LocBuffer)) break;
}

Код, конечно, грешит механистичностью и некоторые места кажутся вообще нелогичными. Но это только кажется - компиллятор оптимизировал код под конвеер Пентиума(P6). Лично мне удалось всего в 6 раз сделать его быстрее ;)


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Шурик
Дата 31.10.2002, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А такую инфу вообще можно найти, или это экзешники надо ковырять, чтобы узнать как компилятор проги компилит ? Может где то какиенить описания есть ?
PM MAIL   Вверх
Chingachguk
Дата 31.10.2002, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Шурик Дата сообщения: 31.10.2002,13:40
А такую инфу вообще можно найти, или это экзешники надо ковырять, чтобы узнать как компилятор проги компилит ? Может где то какиенить описания есть ?


Уже готовых коммерческих - надо. А свой проект ты можешь легко посмотреть сам !


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
neutrino
Дата 31.10.2002, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



2Chingachguk: А MD5 это разве не алгоритм шифрования?


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Chingachguk
Дата 31.10.2002, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

neutrino Дата сообщения: 31.10.2002,13:50
2Chingachguk: А MD5 это разве не алгоритм шифрования?


Нет, это хэш-функция. (Если хочешь, могу линк на мою статью про excel дать, там я писал, что это).

Обычно используется для идентификации пользователя (файл хэшей) и т.п.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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