Перейти к содержанию

setarray + getarraysize


Рекомендуемые сообщения

В общем, проблема состоит в том, что значения в массиве дублируются.

Возьмем для примера обычный кусок:


prontera,151,148,6 script arraytest 100,{
for(.i = 0; .i < getarraysize(.Arrays); .i++){
if(.Arrays[.i] != 0)
mes (.i+1) +" > "+.Arrays[.i];
}
close;
OnInit:
setarray .Arrays[0], 1, 2, 3, 4, 5;
end;
}

Он должен показать что-то типа:

1 > 1

2 > 2

3 > 3

4 > 4

5 > 5

А он показывает:

1 > 1

2 > 2

3 > 3

4 > 4

5 > 5

257 > 1

258 > 2

259 > 3

260 > 4

261 > 5

Если заменить


for(.i = 0; .i < getarraysize(.Arrays); .i++){

на


for(.i = 0; .i < 5; .i++){

Тогда будет все ок.

И так со всеми нпц. Даже стандартными. Из-за этого половина нпцов дублируют свои значения, типа кафра предлагает 2 раза засейвиться и т.д.

А некоторые нпц которые используют getarraysize вообще не работают. Типа новых энчант-квестов в mora

Есть у кого инфа по решению? заплачу, если что. С апдейтом эмуля траблы, если предложите :<

Изменено пользователем Kubix
Ссылка на комментарий
Поделиться на другие сайты

А вывести результат getarraysize пробовал? Какую цифру функция возвращает?

А еще глянь код функции gearraysize в script.c

Ссылка на комментарий
Поделиться на другие сайты

А вывести результат getarraysize пробовал? Какую цифру функция возвращает?

А еще глянь код функции gearraysize в script.c


mes ">"+getarraysize(.Arrays);

Выводит результат: 261. :<


prontera,151,148,6 script arraytest 100,{
for(.s = 0; .s <= getarraysize(.Arrays); .s++){
if(.Arrays[.s] != 0)
mes (.s+1) +" > "+getelementofarray(.Arrays, .s);
}
next;
switch(select("arraysize loop:copyarray loop:getarraysize")){
case 1:
for(.i = 0; .i <= getarraysize(.Arrays); .i++){
if(.Arrays[.i] != 0)
mes (.i+1) +" & "+.Arrays[.i];
}
close;

case 2:
for(.a = 0; .a <= getarraysize(.Arrays2); .a++){
if(.Arrays2[.a] != 0)
mes (.a+1) +" ! "+.Arrays2[.a];
}
close;
case 3:
mes ">"+getarraysize(.Arrays);
mes ">"+getarraysize(.Arrays2);
close;
}
OnInit:
setarray .Arrays[0], 1, 2, 3, 4, 5;
copyarray .Arrays2,.Arrays[0],getarraysize(.Arrays);
end;
}

Все это - дублирует массив и выводит 1,2,3,4,5,257,258,259,260,261

В script.c смотрел, но я мало чего там понимаю:<

Мой getarraysize в script.c:

static int32 getarraysize(struct script_state* st, int32 id, int32 idx, int isstring, struct DBMap** ref)
{
int32 ret = idx;

if( isstring )
{
for( ; idx < SCRIPT_MAX_ARRAYSIZE; ++idx )
{
char* str = (char*)get_val2(st, reference_uid(id, idx), ref);
if( str && *str )
ret = idx + 1;
script_removetop(st, -1, 0);
}
}
else
{
for( ; idx < SCRIPT_MAX_ARRAYSIZE; ++idx )
{
int32 num = (int32)__64BPRTSIZE(get_val2(st, reference_uid(id, idx), ref));
if( num )
ret = idx + 1;
script_removetop(st, -1, 0);
}
}
return ret;
}

Изменено пользователем Kubix
Ссылка на комментарий
Поделиться на другие сайты

Так, походу разобрался. Какой-то придурок в script.c поставил значение MAX_ARRAY_SIZE = 500;

Сейчас проверю -_-

да, это было оно. фу -_-

пойду убивать дурака который это сделал, я неделю мучался, не знал что за беда :D

Изменено пользователем Kubix
Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...
Яндекс.Метрика