Перейти к содержимому


Фотография

Передача значения переменной, в другой скрипт.


Лучший Ответ vlad333000 , 25 April 2015 - 16:33


^^ Таким образом, глобальная переменная var_2 после разового присвоения значения теперь является доступной для любого кода игры в пространстве имен missionNameSpace.

Все же не много не ясно, какой мне писать синтаксис для обращения к глобальной переменной из другого скрипта.

Из справки видно, что бы обратиться к глобальной () переменной, мне нужно написать такой вид -
_yourString = missionNamespace getVariable "YourString";
где missionNamespace getVariable и есть обращение к пространству имен и возвращает значение переменной YourString.

http://arma3.ru/foru...kriptopisaniiu/ ArmA Scripting Tutorials: Переменные (Часть Номер Два) - тут пишут что нужный вид переменной - публичная локальная, т.е. та, которая будет доступна во всех скриптах, на одной машине, но не доступна другим ПК.

В первой части я рассказал о приватных переменных. Эта часть будет о двух типах публичных переменных, публичных локальных и специальных публичных локальных. Локальными они называются, потому что эти переменные доступны только на машине, которая выполняет этот скрипт, публичными - потому что будучи однажды определены, эти переменные могут быть изменены из любого места, при условии, конечно, что это "любое место" на этой машине.

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

Получается что, то что выше неверно и код должен принять такой вид -
//Скрипт 1
onEachFrame { _test10 = diag_fps; missionNamespace setVariable ["test5", _test10]; systemChat str test5;}; //переменная test5 принимает верное значение, что равносильно test5 = diag_fps;

//Скрипт 2
_test6 = 0;
onEachFrame {_test6 = missionNamespace getVariable "test5"; hint str _test6;}; //обращаемся к переменная test5 и передаем значение test6
Но все равно не работает. В Cкрипте_1 test5 принимает значение test10, но вот в Cкрипте_2, test5 по прежнему равна null.

И еще вопрос.

Цикл onEachFrame как то странно работает
onEachFrame {hint str test5} //работает корректно


onEachFrame                 //не работает корректно, и выполняется только 1 раз
{
hint str test5
}
Как так??
А вы во всех случаях уверены в том, что к моменту получения переменной любым скриптом она уже будет определена? Мой вариант в моих экспериментах работает как часы, отличие только в том, что в своих скриптах я жду пока завершиться скрипт, в которыом определяются глобальные переменные, а дальше работаю примерно так: maGlobalVariable select 1... myGlobalVar = myGlobalVar + 1... и и д

Бональный пример:
//script1
VarInit = false;
[] execVM "varInit.sqf";
waitUntil {VarInit};
{_x setDamage 1} foEach arrayOfUnits;

//varInit.sqf
arrayOfUnits = [unit1, unit2];
VarInit = true Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1 OFFLINE   Sledo

Sledo

    Ефрейтор

  • Пользователи
  • 74 сообщений

Отправлено 23 April 2015 - 14:21

Как передавать значения переменной в другой скрипт?

Я так понял, что мы создаем глобальную переменную, вызываем необходимый скрипт, передаем в нее параметр переменной, его в том скрипте получает зарезервированная переменная _this, и уже с ней дальше работаем. Верно? Но тогда не понятно, если мне надо передать несколько значений переменных, как же тогда это происходит.

И мне не ясен сам синтаксис написания, если есть возможность приведите подробный пример. Какой то темный лес этот синтаксис Армы.


  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 23 April 2015 - 14:39

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Если быть точнее, то тебя интересует - Global Variables


  • 1

#3 OFFLINE   Sledo

Sledo

    Ефрейтор

  • Пользователи
  • 74 сообщений

Отправлено 23 April 2015 - 15:47

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Если быть точнее, то тебя интересует - Global Variables

Ага, т.е. я просто объявляю глобальную переменную в каком то скрипте, и больше не забочусь о вызове ее из скрипта какими то дополнительными строками код, а пишу ее в нужном скрипте?

 

К примеру:

//Скрипт Test 1
myGlobal_1 = 0;

if(myGlobal_1 > 100) then { hint scr myGlobal_1; }

//Скрипт Test 2
for "_i" from 0 to 10000 do {myGlobal_1++;};



  • 0

#4 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 23 April 2015 - 15:56

Sledo,  да

PS На каком вы языке пишите? В sqf, насколько мне известно, нет таких команд: scr; var ++


  • 1

#5 OFFLINE   Sledo

Sledo

    Ефрейтор

  • Пользователи
  • 74 сообщений

Отправлено 23 April 2015 - 16:34

Sledo,  да

PS На каком вы языке пишите? В sqf, насколько мне известно, нет таких команд: scr; var ++

Вообще я привык к С#. Это я для примера просто написал, так сказать набросал на скорую руку.

 

Спс, ясно. Будем работать)


Sledo,  да

PS На каком вы языке пишите? В sqf, насколько мне известно, нет таких команд: scr; var ++

Да, а по поводу scr взято отсюда - http://arma3.ru/foru...kriptopisaniiu/

 

for [{_i=5},{_i<=93},{_i=_i+7}] do {hint str _i}; // последнее значение _i равно 89 

 

Немного ошибся)


Сообщение отредактировал Sledo: 23 April 2015 - 16:34

  • 0

#6 OFFLINE   Sledo

Sledo

    Ефрейтор

  • Пользователи
  • 74 сообщений

Отправлено 24 April 2015 - 20:39

Sledo,  да

Не передается параметры переменной таким способом.


  • 0

#7 OFFLINE   Blender

Blender

    Прапорщик

  • Администраторы
  • 615 сообщений
  • Откуда:Torrevieja, España

Отправлено 25 April 2015 - 12:54

 

Sledo,  да

Не передается параметры переменной таким способом.

 

 

Все переменные в ARMA делятся на глобальные, выходящие за рамки скрипта, и локальные, действующие только в пределах скрипта/функции/класса.

В отличии от C++/C# - переменные не имеют явного типа.

Локальные переменные имеют перед своим именем знак нижнего подчеркивания.

Простой пример:

Локальная переменная

_var_1 = 10;
if (true) then {
    _var_2 = _var_1; // Ошибки нет
};
hint (str _var_2); // Здесь ошибка, переменная не определена

Глобальная переменная

var_1 = 10;
if (true) then {
    var_2 = var_1;
};
hint (str var_2); // Ошибки нет

^^ Таким образом, глобальная переменная var_2 после разового присвоения значения теперь является доступной для любого кода игры в пространстве имен missionNameSpace.


  • 1

#8 OFFLINE   Sledo

Sledo

    Ефрейтор

  • Пользователи
  • 74 сообщений

Отправлено 25 April 2015 - 16:11

^^ Таким образом, глобальная переменная var_2 после разового присвоения значения теперь является доступной для любого кода игры в пространстве имен missionNameSpace.

 

Все же не много не ясно, какой мне писать синтаксис для обращения к глобальной переменной из другого скрипта.

 

Из справки видно, что бы обратиться к глобальной () переменной, мне нужно написать такой вид - 

_yourString = missionNamespace getVariable "YourString";

где missionNamespace getVariable и есть обращение к пространству имен и возвращает значение переменной YourString.

 

http://arma3.ru/foru...kriptopisaniiu/ ArmA Scripting Tutorials: Переменные (Часть Номер Два) - тут пишут что нужный вид переменной - публичная локальная, т.е. та, которая будет доступна во всех скриптах, на одной машине, но не доступна другим ПК.

 

 

 

В первой части я рассказал о приватных переменных. Эта часть будет о двух типах публичных переменных, публичных локальных и специальных публичных локальных. Локальными они называются, потому что эти переменные доступны только на машине, которая выполняет этот скрипт, публичными - потому что будучи однажды определены, эти переменные могут быть изменены из любого места, при условии, конечно, что это "любое место" на этой машине.

 

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

 

Получается что, то что выше неверно и код должен принять такой вид -

//Скрипт 1
onEachFrame { _test10 = diag_fps; missionNamespace setVariable ["test5", _test10]; systemChat str test5;}; //переменная test5 принимает верное значение, что равносильно test5 = diag_fps;

//Скрипт 2
_test6 = 0;
onEachFrame {_test6 = missionNamespace getVariable "test5"; hint str _test6;}; //обращаемся к переменная test5 и передаем значение test6
 

Но все равно не работает. В Cкрипте_1 test5 принимает значение test10, но вот в Cкрипте_2, test5 по прежнему равна null.

 

И еще вопрос.

 

Цикл onEachFrame как то странно работает

onEachFrame {hint str test5} //работает корректно


onEachFrame                 //не работает корректно, и выполняется только 1 раз
{
hint str test5
}

Как так??


Сообщение отредактировал Sledo: 25 April 2015 - 16:12

  • 0

#9 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 25 April 2015 - 16:33   Лучший Ответ


^^ Таким образом, глобальная переменная var_2 после разового присвоения значения теперь является доступной для любого кода игры в пространстве имен missionNameSpace.

Все же не много не ясно, какой мне писать синтаксис для обращения к глобальной переменной из другого скрипта.

Из справки видно, что бы обратиться к глобальной () переменной, мне нужно написать такой вид -
_yourString = missionNamespace getVariable "YourString";
где missionNamespace getVariable и есть обращение к пространству имен и возвращает значение переменной YourString.

http://arma3.ru/foru...kriptopisaniiu/ ArmA Scripting Tutorials: Переменные (Часть Номер Два) - тут пишут что нужный вид переменной - публичная локальная, т.е. та, которая будет доступна во всех скриптах, на одной машине, но не доступна другим ПК.

В первой части я рассказал о приватных переменных. Эта часть будет о двух типах публичных переменных, публичных локальных и специальных публичных локальных. Локальными они называются, потому что эти переменные доступны только на машине, которая выполняет этот скрипт, публичными - потому что будучи однажды определены, эти переменные могут быть изменены из любого места, при условии, конечно, что это "любое место" на этой машине.

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

Получается что, то что выше неверно и код должен принять такой вид -
//Скрипт 1
onEachFrame { _test10 = diag_fps; missionNamespace setVariable ["test5", _test10]; systemChat str test5;}; //переменная test5 принимает верное значение, что равносильно test5 = diag_fps;

//Скрипт 2
_test6 = 0;
onEachFrame {_test6 = missionNamespace getVariable "test5"; hint str _test6;}; //обращаемся к переменная test5 и передаем значение test6
Но все равно не работает. В Cкрипте_1 test5 принимает значение test10, но вот в Cкрипте_2, test5 по прежнему равна null.

И еще вопрос.

Цикл onEachFrame как то странно работает
onEachFrame {hint str test5} //работает корректно


onEachFrame                 //не работает корректно, и выполняется только 1 раз
{
hint str test5
}
Как так??
А вы во всех случаях уверены в том, что к моменту получения переменной любым скриптом она уже будет определена? Мой вариант в моих экспериментах работает как часы, отличие только в том, что в своих скриптах я жду пока завершиться скрипт, в которыом определяются глобальные переменные, а дальше работаю примерно так: maGlobalVariable select 1... myGlobalVar = myGlobalVar + 1... и и д

Бональный пример:
//script1
VarInit = false;
[] execVM "varInit.sqf";
waitUntil {VarInit};
{_x setDamage 1} foEach arrayOfUnits;

//varInit.sqf
arrayOfUnits = [unit1, unit2];
VarInit = true

Сообщение отредактировал vlad333000: 25 April 2015 - 16:42

  • 1

#10 OFFLINE   Sledo

Sledo

    Ефрейтор

  • Пользователи
  • 74 сообщений

Отправлено 25 April 2015 - 17:43

А вы во всех случаях уверены в том, что к моменту получения переменной любым скриптом она уже будет определена? Мой вариант в моих экспериментах работает как часы, отличие только в том, что в своих скриптах я жду пока завершиться скрипт, в которыом определяются глобальные переменные, а дальше работаю примерно так: maGlobalVariable select 1... myGlobalVar = myGlobalVar + 1... и и д


Бональный пример:
//script1
VarInit = false;
[] execVM "varInit.sqf";
waitUntil {VarInit};
{_x setDamage 1} foEach arrayOfUnits;

//varInit.sqf
arrayOfUnits = [unit1, unit2];
VarInit = true

 

 

Что же, с вызовом скрипта из скрипта, уже есть определенный прогресс. Я получил доступ к значению переменной, но вот теперь не работает цикл onEachFrame, а именно срабатывает только один раз, во всех двух скриптах.

 

Вообще странно, последний вид скриптов был такой

//Скрипт_1

test5 = 0;

VarInit = true; //[] execVM "Test_Script.sqf";


onEachFrame { _test10 = diag_fps; missionNamespace setVariable ["test5", _test10]; systemChat str test5;};


//Скрипт_2

waitUntil {VarInit};

onEachFrame {_test6 = missionNamespace getVariable "test5"; hint str _test6;};

Получается, что я инициализирую переменную test5, присваиваю каждый кадр ей значение, во втором скрипте жду когда контрольная переменная будет проинициализирована, и начинаю работать с нужной мне переменной. Однако, все равно значение test5 было равно null. И только с вызовом Скрипта_2 из Скрипта_1, вместо контрольной переменной в Скрипте_1 вызов Скрипта_2, все более менее заработало, однако перестали работать циклы. Это особенности движка такие, или это я что то не так понимаю??

 

Да, и есть ли какой то способ получения ошибок динамически? Например вывод их в чат, или как то еще на экран?


  • 0

#11 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 25 April 2015 - 18:40


А вы во всех случаях уверены в том, что к моменту получения переменной любым скриптом она уже будет определена? Мой вариант в моих экспериментах работает как часы, отличие только в том, что в своих скриптах я жду пока завершиться скрипт, в которыом определяются глобальные переменные, а дальше работаю примерно так: maGlobalVariable select 1... myGlobalVar = myGlobalVar + 1... и и д
Бональный пример:
//script1
VarInit = false;
[] execVM "varInit.sqf";
waitUntil {VarInit};
{_x setDamage 1} foEach arrayOfUnits;

//varInit.sqf
arrayOfUnits = [unit1, unit2];
VarInit = true


Что же, с вызовом скрипта из скрипта, уже есть определенный прогресс. Я получил доступ к значению переменной, но вот теперь не работает цикл onEachFrame, а именно срабатывает только один раз, во всех двух скриптах.

Вообще странно, последний вид скриптов был такой
//Скрипт_1

test5 = 0;

VarInit = true; //[] execVM "Test_Script.sqf";


onEachFrame { _test10 = diag_fps; missionNamespace setVariable ["test5", _test10]; systemChat str test5;};


//Скрипт_2

waitUntil {VarInit};

onEachFrame {_test6 = missionNamespace getVariable "test5"; hint str _test6;};
Получается, что я инициализирую переменную test5, присваиваю каждый кадр ей значение, во втором скрипте жду когда контрольная переменная будет проинициализирована, и начинаю работать с нужной мне переменной. Однако, все равно значение test5 было равно null. И только с вызовом Скрипта_2 из Скрипта_1, вместо контрольной переменной в Скрипте_1 вызов Скрипта_2, все более менее заработало, однако перестали работать циклы. Это особенности движка такие, или это я что то не так понимаю??

Да, и есть ли какой то способ получения ошибок динамически? Например вывод их в чат, или как то еще на экран?
Arms 3 launcher (лаунчер от бисов, По дефолту вроде стартиться) - настройки - расширенные - автор - показывать ошибки в скриптах. Ошибки будут показываться в виде черного окошка с куском кода, знаком "#" в месте ошибки и описание (если возможно но очень скудное и в основном будет написано что что то не подходит По типу данных)
  • 0

#12 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 25 April 2015 - 19:57

onEachFrame { _test10 = diag_fps; missionNamespace setVariable ["test5", _test10]; systemChat str test5;};

Написанное выше равнозначно написанному ниже

onEachFrame { _test5 = diag_fps; systemChat str test5;};

Есть более удобный формат вывода инфы

onEachFrame { _test5 = diag_fps; systemChat format["_test5 = %1", test5];};

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

Далее, нет нужды для определения глобальной переменной использовать постоянно

missionNamespace setVariable ["test5", _test10]; 

Это полезно в случаях когда вам приходится обращаться к переменной в динамике, то есть когда некому коду заранее не известно к какой переменной придётся обратиться.

То есть то что выше вполне корректно записать и так

test5 = _test10;

Переменная test5 будет определена как глобальная, и ей будет присвоено значение локальной переменной _test10.


  • 1

#13 OFFLINE   Sledo

Sledo

    Ефрейтор

  • Пользователи
  • 74 сообщений

Отправлено 25 April 2015 - 22:32

onEachFrame { _test10 = diag_fps; missionNamespace setVariable ["test5", _test10]; systemChat str test5;};

Написанное выше равнозначно написанному ниже

onEachFrame { _test5 = diag_fps; systemChat str test5;};

Есть более удобный формат вывода инфы

onEachFrame { _test5 = diag_fps; systemChat format["_test5 = %1", test5];};

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

Далее, нет нужды для определения глобальной переменной использовать постоянно

missionNamespace setVariable ["test5", _test10];

Спс, с этим уже разобрался. Насколько я понял, get/set не объявляют переменную, но присваивают ей значение или обращаются к этому значению. Побочным явлением является объявление переменной. По сути, всякий раз, как я пишу переменную, я ее объявляю. Поэтому не вижу в чем не корректность использования get/set. Это обычная практика и в других языках, больше нужная не компилятору, но программисту.

 

 


Это полезно в случаях когда вам приходится обращаться к переменной в динамике, то есть когда некому коду заранее не известно к какой переменной придётся обратиться.

То есть то что выше вполне корректно записать и так

 

Вот этот момент, что то я совсем не понял. Это как я не знаю к какой переменной я обращаюсь?? Как я вообще могу к ней обратиться, если не знаю переменную??

 

Вы бы мне лучше ответили на вопросы, по поводу onEachFrame, которые я задавал выше.


  • 0

#14 OFFLINE   Dimon UA

Dimon UA

    Ст.сержант

  • Пользователи
  • 304 сообщений
  • Откуда:Севастополь

Отправлено 25 April 2015 - 22:57

если работает это

onEachFrame {hint str test5;}; //работает корректно

то будет работать и это


onEachFrame
{
     hint str test5;
};


Сообщение отредактировал Dimon UA: 25 April 2015 - 22:57

  • 0

#15 OFFLINE   Sledo

Sledo

    Ефрейтор

  • Пользователи
  • 74 сообщений

Отправлено 26 April 2015 - 15:39

 

если работает это

onEachFrame {hint str test5;}; //работает корректно

то будет работать и это

onEachFrame
{
     hint str test5;
};

Я конечно понимаю, что тут нет профессиональных программистов, но все же, зачем спорить с фактами и писать мне и так то, что я уже знаю??


  • 0

#16 OFFLINE   Dimon UA

Dimon UA

    Ст.сержант

  • Пользователи
  • 304 сообщений
  • Откуда:Севастополь

Отправлено 26 April 2015 - 20:21

Потому что 

это работает у меня

код

программист....


  • 0

#17 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 26 April 2015 - 20:44

 

Я конечно понимаю, что тут нет профессиональных программистов, но все же, зачем спорить с фактами и писать мне и так то, что я уже знаю??

Скриптовый язык SQF создан не для програмистов, а для пользователей продукции от БИСов, и для самих БИСов.

Его главная задача, упростить по максимуму процесс написания кода, пользователями.

И не кто с вами тут спорить особо не горит желанием), вам тут желают помочь, если вы обратили на это внимание!)


  • 0

#18 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 26 April 2015 - 20:53

 

Вот этот момент, что то я совсем не понял. Это как я не знаю к какой переменной я обращаюсь?? Как я вообще могу к ней обратиться, если не знаю переменную??

Вы, Сударь, не внимательны, я написал, "имя переменной заранее не известное коду"? а не вам.

 

Вам, как программисту, не известны подобные сценарии? Мною, не программистом, написанный код, для решения неких динамично развивающихся событий, вполне решает задачи, типа понять к какой переменной из нескольких обратиться, или ещё страшнее как определить динамично созданную переменную, имя которой даже мне при написании кода будет не известно.

 

Чем мне нравится кодинг, это тем что я могу извращаться самыми невероятными способами).


  • 1

#19 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 26 April 2015 - 21:07

 

По сути, всякий раз, как я пишу переменную, я ее объявляю. Поэтому не вижу в чем не корректность использования get/set. Это обычная практика и в других языках, больше нужная не компилятору, но программисту.

Я имел ввиду, что не обязательно всегда использовать для определения и получения значения некой переменной команды

setVariable
getVariable

Если вам это очень нравится, ни что не мешает вам их использовать.

 

Если вам понадобится присвоить некую переменную некому объекту, тогда эти команды к вашим услугам

player setVariable["cocaineVal", "vHlam"];

if (player getVariable ["cocaineVal", "bezPaleva"] == "vHlam") then {
  cop action "playerObezainnik";
};

Сообщение отредактировал SteelRat: 26 April 2015 - 21:13

  • 0




Яндекс.Метрика