PDA

Просмотр полной версии : Вопросы по синтаксису языка Паскаль!


ChiterEPT
25.05.2008, 01:50
Ребят у меня вопрос: Мне надо реализовать сборку информации об инвентаре нескольких чаров в одном скрипте и чтобы не писать для каждого чара отдельную процедуру я решил написать одну процедуру с возможностью подстановки разных массивов. Короче процедуру из скрипта бота Локомотива:
procedure InventoryCreate;
var
i,k : integer;
begin
for i:=0 to 79 do
if (i<ReadH(4)) then begin
Inventory[i,0]:=ReadH(i*36+6); // itemType1
Inventory[i,1]:=ReadD(i*36+8); // ObjectId
Inventory[i,2]:=ReadD(i*36+12); // ItemID
Inventory[i,3]:=ReadD(i*36+16); // count
Inventory[i,4]:=ReadH(i*36+20); // itemType2
Inventory[i,5]:=ReadH(i*36+22); // CustType1
Inventory[i,6]:=ReadH(i*36+24); // isEquipped
Inventory[i,7]:=ReadD(i*36+26); // BodyPart
Inventory[i,8]:=ReadH(i*36+30); // EnchantLevel
Inventory[i,9]:=ReadH(i*36+32); // CustType2
end else
for k:=0 to 9 do Inventory[i,k]:=0;

end;
Переделал так:
procedure InventoryCreate(array1: array[0..79,0..9] of integer);
var
i,k : integer;
begin
for i:=0 to 79 do
if (i<ReadH(4)) then begin
array1[i,0]:=ReadH(i*36+6); // itemType1
array1[i,1]:=ReadD(i*36+8); // ObjectId
array1[i,2]:=ReadD(i*36+12); // ItemID
array1[i,3]:=ReadD(i*36+16); // count
array1[i,4]:=ReadH(i*36+20); // itemType2
array1[i,5]:=ReadH(i*36+22); // CustType1
array1[i,6]:=ReadH(i*36+24); // isEquipped
array1[i,7]:=ReadD(i*36+26); // BodyPart
array1[i,8]:=ReadH(i*36+30); // EnchantLevel
array1[i,9]:=ReadH(i*36+32); // CustType2
end else
for k:=0 to 9 do array1[i,k]:=0;
end;
Как вы уже поняли такой подход не сработал... массив который я подставляю в процедуру в качестве аргумента остается забитым нулями. Кто знает что я сделал не так, прошу отпишите. Заранее Спасибо

Добавлено через 3 минуты
Кстати я проделал то же самое с Функцией GetInv (то есть добавил новый аргумент: массив в котором нужно проводить поиск) И все работает. Разницу вижу в том, что в случае с процедурой InventoryCreat в аргумент должна записываться информация, а в функции GetInv происходит считывание информации из аргумента. Думаю дело в этом ... я прав?

NLObP
25.05.2008, 03:14
Попробуй создать массив и вызывать его по типу этого:
var
ItemsBase: array[0..79,0..9] of integer

procedure InventoryCreate(array1 : array of integer);
begin
end;

begin
InventoryCreate(ItemsBase);
end.

alexsl
25.05.2008, 20:05
ИМХО через VAR, т.е. передавать указатель на переменную, иначе параметры передаются как значения.

procedure InventoryCreate(var array1: array[0..79,0..9] of integer);

ChiterEPT
25.05.2008, 21:02
Сейчас попробую оба варианта, спасибо что откликнулись.

Добавлено через 33 минуты
ИМХО через VAR, т.е. передавать указатель на переменную, иначе параметры передаются как значения.

procedure InventoryCreate(var array1: array[0..79,0..9] of integer);
Во так работает спасибо Алекс :), а теперь объясни мне в чем дело... когда мы обьявляем array1 как переменную процедура получает возможность записывать в нее данные???
procedure InventoryCreate(array1 : array of integer);
begin
end;
Ругается на Too many actual parameters.

xkor
25.05.2008, 22:47
Во так работает спасибо Алекс , а теперь объясни мне в чем дело... когда мы обьявляем array1 как переменную процедура получает возможность записывать в нее данные???
если пишеш
procedure InventoryCreate(array1: array[0..79,0..9] of integer);
то в процедуру передаётся не сам массив а его копия, если
procedure InventoryCreate(var array1: array[0..79,0..9] of integer);
то в процедуру передаётся указатель на массив и все действия которые мы с ним делаем делаются с переданным массивом, если бы мы писали
procedure InventoryCreate(const array1: array[0..79,0..9] of integer);
то мы бы так же передавали указатель но при этом он бы был доступен только для чтения

ЗЫ есть ещё ключевые слова типа var и const но я неуверен что они поддерживаются FastScript так что лучше небуду о них писать...

ChiterEPT
26.05.2008, 02:55
Спасибо Хкор исчерпывающий ответ.

ChiterEPT
28.05.2008, 01:42
Господа созрел еще один вопрос.. представим себе строку кода:

If ReadD(2)<>X and ReadD(2)<>Y and ReadD(2)<>Z then

Нельзя ее заменить на что-нибудь подобное этому?

If ReadD(2)<>X,Y,Z then

NLObP
28.05.2008, 11:19
Нет, так нельзя.
В нашем случае нужно делать так
If (ReadD(2)<>X) and (ReadD(2)<>Y) and (ReadD(2)<>Z) then
условие надо в скобках писать, иначе ошибка.

dmitry501
28.05.2008, 13:33
Можно на верно извратится

A:=ReadD(2);
if A IN (X,Y,Z) then

NLObP
28.05.2008, 15:08
Пакетхак выдает ошибку: ')' expected

ChiterEPT
29.05.2008, 00:09
Спс за отклик :) Жаль конечно, что нет какого нить сокращения, а то иногда такие строки приходится катать. :(

xkor
01.06.2008, 14:38
Можно на верно извратится
A:=ReadD(2);
if A IN (X,Y,Z) then
тогда уж:
A:=ReadD(2);
if A IN [X,Y,Z] then
но сомневаюсь что FastScript множества поддерживает полностью