Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.25;
Скачать: CL | DM;

Вниз

программирование IncDay-style   Найти похожие ветки 

 
TUser ©   (2011-09-04 21:16) [40]

А зачем делают переменную в цикле беззнакового типа? Приключений в жизни мало?


 
Игорь Шевченко ©   (2011-09-04 22:05) [41]

TUser ©   (04.09.11 21:16) [40]

Всякое бывает нужно, зависит от других параметров цикла.
Например в цикле

for I:=одно беззнаковое значение to другое беззнаковое значение do

I должна быть объявлена без знака.


 
asail ©   (2011-09-04 23:26) [42]


> Игорь Шевченко ©   (04.09.11 22:05) [41]

> I должна быть объявлена без знака

Не понял... Почему "должна"? Чем такое плохо?
var i: Integer;
for i := 1 to 10 do something;


> TUser ©   (04.09.11 21:16) [40]

> А зачем делают переменную в цикле беззнакового типа?

Напрмер, если нужен цикл, скажем, на 200 итераций... Можно взять беззнаковый Byte или знаковый Integer, что явно излишне. Ну, или где-то надо брать знаковый Int64 вместо Cardinal (Integer может быть недостаточно)... Но, конечно, при сегодняшних объемах памяти кто будет такое ерундой заморачиваться?


 
Германн ©   (2011-09-04 23:45) [43]


> Напрмер, если нужен цикл, скажем, на 200 итераций... Можно
> взять беззнаковый Byte или знаковый Integer, что явно излишне.
>

В большом числе случаев разницы вообще никакой не будет. Да и самой этой переменной в исполняемом коде не будет.


 
Inovet ©   (2011-09-05 00:04) [44]

> [42] asail ©   (04.09.11 23:26)
> Не понял... Почему "должна"? Чем такое плохо?
> var i: Integer;
> for i := 1 to 10 do something;

for i := a to b do something;
a и b могут быть беззнаковые целые


 
Германн ©   (2011-09-05 00:08) [45]


> for i := a to b do something;
> a и b могут быть беззнаковые целые

Сделай тестовый пример. Скомпилируй. Поставь брейк на цикл и посмотри CPU View.


 
Inovet ©   (2011-09-05 00:21) [46]

> [45] Германн ©   (05.09.11 00:08)
> Сделай тестовый пример. Скомпилируй. Поставь брейк на цикл
> и посмотри CPU View.

Я там увижу что-то экзотическое? Надо посмотреть.


 
asail ©   (2011-09-05 00:22) [47]


> Германн ©   (04.09.11 23:45) [43]

> В большом числе случаев разницы вообще никакой не будет

В случае Byte и Integer, действительно не будет, а в случае Cardinal и Int64 - думаю, будет.


 
Германн ©   (2011-09-05 00:30) [48]


> Я там увижу что-то экзотическое? Надо посмотреть.

А то ты не помнишь многочисленные удивлённые вопросы новичков про то, что "типа я задал цикл от 0 до 5, а в отладчике вижу что цикл выполняется в обратном порядке от 5 до 0".
Под переменную цикла в Дельфи очень часто вообще не выделяется память. Ибо нафиг, если её значение не влияет на то, что выполняется в теле цикла.


 
Германн ©   (2011-09-05 00:44) [49]


> Игорь Шевченко ©   (04.09.11 22:05) [41]
>
> TUser ©   (04.09.11 21:16) [40]
>
> Всякое бывает нужно, зависит от других параметров цикла.
>
> Например в цикле
>
> for I:=одно беззнаковое значение to другое беззнаковое значение
> do
>
> I должна быть объявлена без знака.
>

???


 
Игорь Шевченко ©   (2011-09-05 00:53) [50]

Игорь Шевченко ©   (04.09.11 22:05) [41]

Был неправ.

var
 I: Cardinal;
begin
 for I := $7FFFFFFF to $80000001 do
   ...;
end;

var
 I: Integer;
begin
 for I := $7FFFFFFF to $80000001 do
   ...;
end;


не выполняются ни разу


 
Inovet ©   (2011-09-05 01:09) [51]

> [48] Германн ©   (05.09.11 00:30)
> Под переменную цикла в Дельфи очень часто вообще не выделяется память.

Я не о том

> [50] Игорь Шевченко ©   (05.09.11 00:53)
> не выполняются ни разу

Что ли I всегда знаковая?

procedure TForm1.Button1Click(Sender: TObject);
 var
 i: Integer;
 a, b : Cardinal;
begin
 a := $fffffffe;
 b := $ffffffff;
 for i := a to b do ShowMessage(IntToStr(i));
end;

Почему нет предупреждения о присвоении беззнакового знаковому?
-2, -1

Не идентично, но похоже по смыслу

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int i;
 unsigned int a, b;
 a = 0xfffffffe;
 b = 0xffffffff;
 for (i = a; i <= b; i++)
 {
   ShowMessage(i);
 }
}

хотя бы получаю [BCC32 Warning] Unit1.cpp(23): W8012 Comparing signed and unsigned values
и цикл
-2, -1, 0, 1, ...


 
Игорь Шевченко ©   (2011-09-05 01:13) [52]


> Почему нет предупреждения о присвоении беззнакового знаковому?


есть.

var
 I: Integer;
begin
 for I := $80000000 to $80000001 do
   ...;
end;


[Pascal Warning] main.pas(35): W1012 Constant expression violates subrange bounds

А так - нету:

var
 I: Cardinal;
begin
 for I := $80000000 to $80000001 do
   ...;
end;


 
Германн ©   (2011-09-05 01:17) [53]


> Inovet ©   (05.09.11 01:09) [51]
>
> > [48] Германн ©   (05.09.11 00:30)
> > Под переменную цикла в Дельфи очень часто вообще не выделяется
> память.
>
> Я не о том
>
>

Ну как же не о том?
Именно о том!
Ты не исходник на СИ приводи. Ты посмотри на "исполняемый код"!


 
Inovet ©   (2011-09-05 01:17) [54]

> [52] Игорь Шевченко ©   (05.09.11 01:13)
> есть.
>
> var
> I: Integer;
> begin
> for I := $80000000 to $80000001 do
>   ...;
> end;

А с переменными беззнаковыми вместо констант.


 
Inovet ©   (2011-09-05 01:23) [55]

> [53] Германн ©   (05.09.11 01:17)
> Ты посмотри на "исполняемый код"!

Смотрел, вычитается нижняя граница из верхней сохраняется в сщётчик, и отдельно переменная цикла имеется.

Unit1.pas.31: a := $fffffffe;
004BD9D7 C745F4FEFFFFFF   mov [ebp-$0c],$fffffffe
Unit1.pas.32: b := $ffffffff;
004BD9DE C745F0FFFFFFFF   mov [ebp-$10],$ffffffff
Unit1.pas.33: for i := a to b do ShowMessage(IntToStr(i));
004BD9E5 8B45F4           mov eax,[ebp-$0c]
004BD9E8 8B55F0           mov edx,[ebp-$10]
004BD9EB 2BD0             sub edx,eax
004BD9ED 7C22             jl $004bda11
004BD9EF 42               inc edx
004BD9F0 8955EC           mov [ebp-$14],edx
004BD9F3 8945F8           mov [ebp-$08],eax
004BD9F6 8D55E4           lea edx,[ebp-$1c]
004BD9F9 8B45F8           mov eax,[ebp-$08]
004BD9FC E877E8F5FF       call IntToStr
004BDA01 8B45E4           mov eax,[ebp-$1c]
004BDA04 E8AB9EFEFF       call ShowMessage
004BDA09 FF45F8           inc dword ptr [ebp-$08]
004BDA0C FF4DEC           dec dword ptr [ebp-$14]
004BDA0F 75E5             jnz $004bd9f6


 
Игорь Шевченко ©   (2011-09-05 01:30) [56]


> 004BD9ED 7C22             jl $004bda11


Для случая беззнаковых переменных должно быть
jb $004bda11


 
Германн ©   (2011-09-05 01:56) [57]


>  Inovet ©   (05.09.11 01:23) [55]
>
> > [53] Германн ©   (05.09.11 01:17)
> > Ты посмотри на "исполняемый код"!
>
> Смотрел, вычитается нижняя граница из верхней сохраняется
> в сщётчик, и отдельно переменная цикла имеется.
Ещё вопросы есть?
:)
А ты убери  из кода  ShowMessage.


 
Inovet ©   (2011-09-05 02:41) [58]

> [57] Германн ©   (05.09.11 01:56)
> Ещё вопросы есть?

Что присвоишь, то и получишь.


 
Anatoly Podgoretsky ©   (2011-09-05 10:32) [59]

> Игорь Шевченко  (05.09.2011 01:13:52)  [52]

Так первый случай вообще то бессмысленный, 0 иттераций, в отличии от
второго.
Кроме того у кодогенератора Дельфи есть проблемы с граничными значениями
Integer, а тут одно из них - MinInt



Страницы: 1 2 вся ветка

Текущий архив: 2011.12.25;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.011 c
2-1315479852
dEN
2011-09-08 15:04
2011.12.25
Удалить определенные символы в строке


3-1269033816
Slym
2010-03-20 00:23
2011.12.25
проблема с датами и временем в ADOComand


15-1315548799
user1987
2011-09-09 10:13
2011.12.25
Часы на рабочем столе


15-1315315520
Palladin
2011-09-06 17:25
2011.12.25
Ассоциированные с файлом иконки в Vista и Windows 7


4-1252568961
Гриня
2009-09-10 11:49
2011.12.25
Взаимодействие с Opera