Page 1 of 1

использованиe For

Posted: 18.03.2010 19:23
by MeLFiS

Code: Select all

rb= какоето айди рунбуки
rmax = 16
for r:= 1 to rmax do
begin
 Recall(rb,r);
end;
Кусок скрипта для рекола по всем рунам в 1 рунбуке как изменить его чтобы он реколился по всем рунам в 3 рунбках ? ?

П.С перекинете плиз в подфорум Help ато промазал кропаль((

Posted: 19.03.2010 13:11
by WladL
rbArr: Array of Cardinal;//ID буков

rbArr := [$xxxxxx,$yyyyyy,$zzzzzz]
rmax = 16
for a:=0 to Integer(high(rbArr)) do
for r:= 1 to rmax do
Recall(rbArr[a],r);

Posted: 19.03.2010 14:27
by CFA
по моему в pascalscript не работает low/high применительно к массивам. я везде использовал getArrayLength(rbArr)-1

Posted: 19.03.2010 14:36
by Vizit0r
что-то там давно было с high применительно к массивам в паскальскрипте - или работало неправильно, или скрипт вылетал с ошибкой, не помню. помню только что проблема была в этом.
так что не стоит использовать :)

Posted: 19.03.2010 14:53
by MeLFiS
Что же тогда использывать место

Code: Select all

for a:=0 to Integer(high(rbArr)) do 
???

Code: Select all

for a:=0 to getArrayLength(rbArr)-1 do 


это ?

Posted: 19.03.2010 15:44
by Vizit0r
да

Posted: 19.03.2010 16:37
by WladL
Проблема была в том , что в текущей версии паскальскрипта функция high вовзращает значение не Integer(как-то не удосужился проверить что именно она вовзращает) и если использовать его влоб как

Code: Select all

for a:=0 to high(rbArr) do 
получим ошибку, а вот если сделать прямое приведение к типу Integer,

Code: Select all

for a:=0 to Integer(high(rbArr)) do
то все очень даже и работает.

ЗЫ. Повторюсь это ТОЛЬКО в текущей версии паскальскрипта.
например в релизе стелса 1.0 , все работало и без приведения типов.

Posted: 20.03.2010 10:42
by Vizit0r

Code: Select all

{$IFNDEF PS_NOINT64}
  AddFunction('function Low: Int64;').Decl.AddParam.OrgName:='x';
  AddFunction('function High: Int64;').Decl.AddParam.OrgName:='x';
  {$ELSE}
  AddFunction('function Low: Integer;').Decl.AddParam.OrgName:='x';
  AddFunction('function High: Integer;').Decl.AddParam.OrgName:='x';
  {$ENDIF}


{$IFNDEF FPC}
{$IFNDEF DELPHI4UP}
{$IFNDEF LINUX}
  {$DEFINE PS_NOINT64}
{$ENDIF}
{$ENDIF}
{$ENDIF}
я устал закапываться в дебри этих дэфайнов :)
кому не лень - вперед в гугл.

из того, что я понял - надо при компиляции релизов правильно выполнять все условия, чтобы возвращало Integer, а не Int64. Хотя выполнить {$IFNDEF DELPHI4UP} сложно :)

А еще надежнее действительно жестко приводить через Integer(High(xxx))





P.S. В принципе паскальскрипт все увереннее внедряет новые форматы и стандарты, но так как мы вряд ли когда-то перейдем на Д2010 - то наверное можно принудительно задать Integer в этом и других таких местах