Elite Games - Свобода среди звезд!
.
  » Трансляторы XC->XASM и XASM->XC | страница 3
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 3 из 4
На страницу: Пред.  1, 2, 3, 4  След. | Все страницы
Поиск в этой теме:
Канал X2: The Threat: «Трансляторы XC->XASM и XASM->XC»
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Darth Revan :
выражение if(A?(B?1:0):0) может быть восстановлено в виде if(A&&B), в то время как выражение var C=A?(B?1:0):0 можно упростить лишь до вида var C=A&&B?1:0


Мда, вжисть бы не найти...
Но пока по заданию AlexYar ковырялся в генерируемом коде нашел еще несколько, на мой взгляд неочевидных, особенностей. Для примера возьмем тестовую функцию вида:
Код:

.func      Test ;
function Test(arg1)
{
  var loc1 = 0;

  for(loc1 = 0; loc1 < 24; loc1 = loc1 + 1) {
    start {
      if (loc1 == arg1) { return (1); }
    }
  }
  return (0);
}


В генерируемом коде выполняется принудительный выход из функции из блока begin_critical/end_critical без выполнения завершающего end_critical:
Код:

Test_for_1_1:
           push       SP[0]     ; <-- loc1
           push       24
           if SP[0]<=SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endfor_1_1
; Test_start_2_1:
           begin_critical
           if SP[0]<>0 then jump Test_endstart_2_1
; Test_if_3_1:
           push       SP[0]     ; <-- loc1
           push       SP[5]     ; <-- arg1
           if SP[0]<>SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endif_3_1
           push       1
           mov        SP[1],SP[0]
           pop       
           ret       
Test_endif_3_1:
           end_critical
Test_endstart_2_1:
           push       SP[0]     ; <-- loc1
           push       1
           add        SP[0],SP[1]
           mov        SP[1],SP[0]     ; --> loc1
           pop       
           jump       Test_for_1_1
Test_endfor_1_1:

Так, далее, если вместо return(1) внутри цикла поставить просто break - выход из цикла, то генерится код примерно такого содержания:
Код:

Test_for_1_1:
           push       SP[0]     ; <-- loc1
           push       24
           if SP[0]<=SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endfor_1_1
; Test_start_2_1:
           begin_critical
           if SP[0]<>0 then jump Test_endstart_2_1
; Test_if_3_1:
           push       SP[0]     ; <-- loc1
           push       SP[5]     ; <-- arg1
           if SP[0]<>SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endif_3_1
           jump       Test_endfor_1_1
Test_endif_3_1:
           end_critical
Test_endstart_2_1:
           push       SP[0]     ; <-- loc1
           push       1
           add        SP[0],SP[1]
           mov        SP[1],SP[0]     ; --> loc1
           pop       
           jump       Test_for_1_1
Test_endfor_1_1:

При этом блок опять остается незакрытый командой end_critical. Такой код довольно часто может использоваться, а вот локализовать ошибку будет непросто... С continue - примерно тоже самое получится. С этими зависаниями я почему-то грешил именно на это, а оказалось...

Кстати, надо будет проверить, что происходит, если команда end_critical пропускается/отсутствует.

- Дополнено -
Когда тест писал, попался еще один глючек:
Код:

function Test(arg1)
{
  var loc1 = 0;

  for(loc1 = 0; loc1 < 24; loc1 = loc1 + 1)
    start {
      if (loc1 == arg1) { continue; }
    }
 
  return (0);
}

Долго соображал - куда у меня critical секция делась.
Код:

Test_for_1_1:
           push       SP[0]     ; <-- loc1
           push       24
           if SP[0]<=SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endfor_1_1
; Test_if_2_1:
           push       SP[0]     ; <-- loc1
           push       SP[5]     ; <-- arg1
           if SP[0]<>SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endif_2_1
           jump       Test_continuefor_1_1
Test_endif_2_1:
Test_continuefor_1_1:
           push       SP[0]     ; <-- loc1
           push       1
           add        SP[0],SP[1]
           mov        SP[1],SP[0]     ; --> loc1
           pop       
           jump       Test_for_1_1
Test_endfor_1_1:

Пока фигурные скобки для цикла не поставил - ничего не получалось...

Последний раз редактировалось: CheckerTwo (16:58 05-12-2007), всего редактировалось 1 раз
    Добавлено: 15:16 05-12-2007   
Darth Revan
 345 EGP


Рейтинг канала: 5(153)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
На самом деле, это проблема не транслятора, а программиста - как придумать ещё один способ сделать ошибку в коде Улыбка Хотя любой из вариантов функуции Test будет транслироваться, ни один не будет нормально работать. Выход из блока start любым способом запрещён - блок start может быть только завершён естественным путём инструкцией end_critical. С точки зрения кода вне блока start этого блока и не существует. Улыбка Т.е. по инструкции begin_critical создаётся новый поток (task), причём содержимое стека копируется. Причём, если поток создан без ошибок, то в стек этого нового потока проталкивается 0. Далее исполнение основного кода продолжается полсде команды end_critical. Новый же поток начнёт выполняться только когда ему придёт очередь при переключении активного потока. Соответственно, первой испольняемой инструкцией для него будет инструкуия
Код:
if SP[0]<>0 then jump Test_endstart_2_1

причём условный переход никогда не происходит, поскольку в стеке всегда находится 0. Я могу в данном случае ошибаться в том, что команда
Код:
if SP[0]<>0 then jump Test_endstart_2_1

выполняется в этом созданном потоке. Т.е. возможно, что при успешном создании потока 0 проталкивается в стек основной потока и там же происходит указанная проверка, хотя она тоже будет бессмысленна. Так что в каком потоке выполняется эта проверка не играет никакой роли. Главное, что код внутри блока start выполняется в отдельном потоке уже после переключения потоков и, следовательно, после возврата в основном потоке из функции Test и разрушения его стека. Иными словами, выходить из блока start попросту некуда. Код внутри блока start по существу не находится внутри функции Test, хотя благодаря тому, что стек копируется при создании нового потока из этого потока моожно обращаться к аргументам функции Test. Иными словами, не return, не выход по break и continue из блока start невозможен. Возможно лишь естественное достижение конца блока и уничтожение потока по команде end_critical.

Кстати, поскольку в примере start в находится цикла, то будет создано аж 24 новых потока. И если arg1 находится в диапазоне от 0 до 23, то мы можем получить или вылет, или подвисание. Т.е. return(1) - один возврат в окна с потерей несохранённых данных, break - вылет, continue - зависание Улыбка

Соответственно, такой код на XC писать просто нельзя. Более того, такой код может появиться в выходном файле транслятора xa2c только если точно такой же выход типа return, break, continue из участка кода, соответствующего блоку start, происходит и в asm-коде оригинального обжа, т.е. это проблема написания кода, а не его трансляции. Я на всякий случай просмотрел x3story.xc - ни одного такого некорректного выхода из блока start я там не обнаружил.

Можно придумать и другой пример из разряда "а что будет если":

Код:
begin_critical
      код1
      if SP[0]=0 then jump label
      код2
      end_critical
label:код3
      end_critical


Сам не знаю, будет ли это работать Улыбка
    Добавлено: 23:37 05-12-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Darth Revan :
На самом деле, это проблема не транслятора, а программиста - как придумать ещё один способ сделать ошибку в коде Улыбка

Ну это-то понятно Улыбка На то он и программист, чтобы придумывать ошибки - профессия такая. Идея функции Test() навеяна идеями программистов Egosoft:
Код:

function TX_AUDIO.SFX_Stress()
{
 var loc1=0;
 for(loc1=0;loc1<1000;(loc1=loc1+1)-1) {
   start {
     while(1) {
       SFX_PlaySound(900+SE_Random(84),SE_Random(200));
     }
   }
 }
 return(0);
}

А всевозможные варианты выхода из блока start - это уже предположения - почему перекомпиляция всего обжа приводила к зависанию игрухи, при условии, что xa2c где-то недопонял асм-код.. Надо же было хоть какую-то рабочую гипотезу для анализа, тем более, что пвсе предыдущие варианьы уже проверены.. Улыбка Неявный выход из цикла по break, внутри которого start-секция - вполне возможная ошибка. По свертыванию кода в тернары - это сложно, тут думать надо было. Я наверное никогда бы не дошел до их анализа..
Darth Revan :
Выход из блока start любым способом запрещён - блок start может быть только завершён естественным путём инструкцией end_critical. С точки зрения кода вне блока start этого блока и не существует. Улыбка

Ага, на 100% согласен. Я к тому, что хорошо бы сообщение выдавать - про некорректный выход из start{} блока...

Darth Revan :
Я на всякий случай просмотрел x3story.xc - ни одного такого некорректного выхода из блока start я там не обнаружил.
    Добавлено: 09:10 06-12-2007   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
Сравнивал хс-файл старого образца и нового, сгенеренный новой версией xa2c. В некоторых местах в новой версии отсутствуют некоторые скобки. Например:

Старый вариант:

Код:
  if((TX_AUDIO.current_speak_page==1271&&arg4&1)&&TX_AUDIO.au_IdleFaceState<=1)


Новый вариант:

Код:
  if(TX_AUDIO.current_speak_page==1271&&arg4&1&&TX_AUDIO.au_IdleFaceState<=1)



Это идентичный код, или нужно лишние скобки удалять вручную?


А еще есть такие случаи. Старый код:

TMONITORCONTROL.ShowSubTitleText(loc2,loc3,arg3&1|arg3&16384,arg2);

Новый:

TMONITORCONTROL.ShowSubTitleText(loc2,loc3,(arg3&1)|(arg3&16384),arg2);

Тоже по новому образцу исправлять?
    Добавлено: 16:38 06-12-2007   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
Darth Revan :
Самый яркий пример - TQUEST194.__GetParseTemplates


Еще один яркий пример - ф-ия TUPGRADE2.GetBestSellPrices()

Значение переменной TUPGRADE2.NumHeaders может выйти за разумные рамки на порядки Улыбка Вместо 1 или 0 там складываются размеры таблиц товаров. А вместе с этой переменной так же уходит и значение переменной TUPGRADE2.up_aStrings - это возвращаемое значение ф-ии TUPGRADE2.GetBestSellPrices().

И в перспективе, через работу меню - это тоже может стать еще одной причиной виса Улыбка
    Добавлено: 22:04 06-12-2007   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
Darth Revan :
Рассмотрим пример. Применим транслятор xa2c к файлам x3story.asm и x3story.out при включенной и выключенной опциях -skipbc. Соответственно, первое встречающееся различие в файлах x3story.xc находится в функции function TSECTOR.FindStation.


Может я чего не так делаю, но у меня различие в файлах только одно:

С опцией -skipbc в начале файла есть пустая секция:

Код:

           .title     x3story.obj
           .ident     X3
           .radix     10d
asm
 {

 }


Без опции -skipbc такой asm-секции нет.

Больше никаких различий между хс-файлами нет, они совершенно одинаковы. Даже строка:

#pragma {SafeLogicalOps=0;}

у обоих одинаковая.

Это только у меня так, или у всех?


зыж: Запускаю так:

xa2c x3story -skipbc

и просто -

xa2c x3story

зыж2: Или заглушку теперь добавлять нужно обязательно вторым параметром?
    Добавлено: 22:08 07-12-2007   
ULiX
 320 EGP


Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
Код:

           read       TMENU_SHIP.mes_iChangedValue ; [87d ; 57h]
           push       1
           add        SP[0],SP[1]
           write      TMENU_SHIP.mes_iChangedValue ; [87d ; 57h]
           push       1
           sub        SP[0],SP[1]
           pop

Транслируется как:
(TMENU_SHIP.mes_iChangedValue=TMENU_SHIP.mes_iChangedValue+1)-1;

Вопрос реальности отображения в сях:

TMENU_SHIP.mes_iChangedValue++;
или
++TMENU_SHIP.mes_iChangedValue;

Сей под руками нет чтоб проверить.
Например:

i=0;
Ai=A[i++];

i=0;
Ai=A[++i];

После выполнени как первых двух строк так и вторых значение i Изменится c 0 на 1.
Но в каком то случае Ai будет равна A[0], а в другом случае A[1]. Это у меня пробел в образовании Улыбка

Пример блока команд:

Код:

    if(TObj2601.IsOpen())
     {
     TObj2601.Close();
     }
    TObj2601.Open(TMENU.me_Object->GetName());
    TObj2601.SetTextCentered(SE_ReadText(1904,loc3?80001:80002));
    TObj2410.ShowScanPopup(TMENU.me_Object);

В этом примере методы объекта вызываются через "." хатя общепринято через точку обращаться к свойствам, а к методам обращаться через "->".
В чем вообще принципиальная разница точки и стрелочки?
Помнится, когда я пересаживался с борландского Си на микрософтский у меня этот вопрос вызвал затруднение, так как в одном языке вызывать методы можно было только через стрелочку, а в другом дозволено было пользоваться как точкой так и стрелочкой.

Я просто задался вопросом, могу ли я получить локальную переменную объекта переданного как аргумент функции другого класса не используя методы?
По тексту программы я не разу не встречал такого варианта.
К примеру, структуры типо: "arg1->GetObjext()" существуют, а вот что то вроде: "arg1.me_Obj" или "loc1.me_Obj" я ни разу не встречал.
Но собственно и асм-команды для чтения локальной переменной указанного объекта тоже не имеется. Но не факт, что команды не существует, просто она ни разу не появилась, так как разработчики ни разу не использовали такого обращения к внешним локальным переменным. Ведь в стандартных сях такое обращение допустимо.

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

Предположим есть родительский и дочерний классы со своими функциями:

.class OBJMather
.func MyFunc
.endclass

.class OBJDaughter(OBJMather)
.func Function1
.endclass


Из функции OBJDaughter.Function1() происходит вызов функции MyFunc которая описана в родительском классе.
Если я в дочерний класс добавлю одноименную функцию MyFunc, будет ли происходить вызов из функции Function1 вновь описанной функции вместо прежней родительской?

========
При задании текущего счетчика команд можно ли использовать в качестве значений метки определенные в коде. Например:
$ = TSHIP.AttackedBy
$ = $ + 100
Ну, конечно при условии, что адреса погрузились директивой .LOADOBJ

При таком раскладе, если даже произошло смещение кода при выпуске нового официального патча, но исправляемые нашими дополнениями функции не были изменены, то все необходимые адреса останутся по прежним смещениям относительно начала функций (методов).

=========
Где-то заходил разговор об оптимизации кода.
Внесу своё предложение.
Просматривая код я часто сталкивался со следующим вариантом организации цикла:

for(i=0;i<SE_ArraySize(myArray);i++){}

Подобный код не оптимален по скорости, так как на каждой итеррации происходит повторное измерение размерра массива.
Разумнее ввести дополнительную переменную, которая будет содержать размер массива вычисленный до тела цикла:

var SmyArray=SE_ArraySize(myArray);
for(i=0;i<SmyArray);i++){}

Однако увы на автомате такую оптимизацию делать не стоит.
Я также встречал варианты, где подобная структура цикла почти оправдана:

for(i=0;i<SE_ArraySize(myArray);i++)
{
if(expression)
{
SE_ArrayRemove(myArray,i);
i--;
}
}


Такую структуру лучше всего преобразовать к виду:

var SmyArray=SE_ArraySize(myArray);
for(i=0;i<SmyArray);i++)
{
if(expression)
{
SE_ArrayRemove(myArray,i);
i--;
SmyArray--;
}
}

Ну и ещё на счет этих "++".
Вроде бы запись удобная, но код получается не оптимальный.
Если скажем использовать что-то вроде

MyVar=i++;

то использование "++" оправдано, но в случае, если отсутсвует переменная, которая примет результат вычислений, то код дополнится процедурой извлечения ненужного значения из стека (pop).
Записи типо i+=1; или классическое i=i+1; лишены таких недостатков.
Это же касается и стандартных языков C, а не только XC. Кроме того операторы "+=" и "-=" вроде как не поддерживаются транслятором XC_to_XAsm.

Еще, если можно, взгляните на пост и дайте хоть какой-то ответ, но желательно в этой теме а не в той:

http://www.elite-games.ru/conference/viewtopic.php?p=1963172#1963172

Нужно дать ответ относительно задания текстовых констант.
Проблемы у меня с этим возникли.

Эммм... время поджимает...

Горячие классы: 5002-5102... из них свободные 5044-5102!

Сейчас нет времени пояснять просто глянте короткий код фукции:

function TUPGRADEMASTER.UpdateUpgrades()
А строчки (5002+loc1)->Init();
(5002+loc1)->Set();
Открывают новые возможности Улыбка
Можно добавлять новые подпункты в существующие меню и реализовывать новые способности не правя сами меню а просто добавляя слассы 5044-5102 по образцу класса TUPGRADE.

Таким образом я добавил новый пукт меню в меню инфы корабля просто добавлением своего класса не правя абсолютных адресов.
Осталось только отрехтовать код... как раз проблема с отображением из-за глюков со строковыми константами.

В общем здесь люди умные, возможно я даже ничего нового и не сообщил, а если сообщил, то заинтересовавшиеся уже знают как воспользоваться этой информацией.
_________________
Новое ещё не значит лучшее
    Добавлено: 10:29 17-07-2008   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
ULiX :
К примеру, структуры типо: "arg1->GetObjext()" существуют, а вот что то вроде: "arg1.me_Obj" или "loc1.me_Obj" я ни разу не встречал.


Потому что в хс перед точкой стоит имя класса, а в твоем примере - имя переменной Подмигиваю

ULiX :
Если я в дочерний класс добавлю одноименную функцию MyFunc, будет ли происходить вызов из функции Function1 вновь описанной функции вместо прежней родительской?


Да.


На остальное позже отвечу, надо отвлечься на поесть Хы...
    Добавлено: 18:11 18-07-2008   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
ULiX :
Я просто задался вопросом, могу ли я получить локальную переменную объекта переданного как аргумент функции другого класса не используя методы?


У тебя терминология сильно иная, и затрудняет понимание языка хс (по крайней мере моё понимание).
Есть классы, есть функции. Всё. Никаких методов, никаких свойств нет. Процедур тоже нет Гы-гы

Через точку, точнее перед ней, пишется имя класса, которому принадлежит функция или переменная. Через стрелочку вызывается функция того-же класса, что и переменная слева от стрелочки.

T.e. к примеру.

var ship=global.ga_PlayerShip.

Тут ясно, что присваивается значение глобальной переменной ga_PlayerShip

var type=ship->GetType();

Тут происходит вызов ф-ии класса TSHIP (TSHIP.GetType()), потому что корабль собственно и есть класса TSHIP.

По поводу дочерних классов - если корабль был создан из дочернего класса, то ф-ия GetType будет вызвана из того класса, если таковая там есть. Если её там нет, то из родительского класса TSHIP. Если её удалить из класса TSHIP, то она будет вызвана из класса TSCRIPT, а если и оттуда, то из класса TGBODY, т.е. по иерархии классов. Ну тут всё понятно надеюсь.


ULiX :
Кроме того операторы "+=" и "-=" вроде как не поддерживаются транслятором XC_to_XAsm.


И ++ и -- вроде тоже не поддерживаются.

ULiX :
function TUPGRADEMASTER.UpdateUpgrades()
А строчки (5002+loc1)->Init();
(5002+loc1)->Set();
Открывают новые возможности
Можно добавлять новые подпункты в существующие меню и реализовывать новые способности не правя сами меню а просто добавляя слассы 5044-5102 по образцу класса TUPGRADE.


Честно говоря не понял, о каких меню идёт речь.

Классы 5000* это классы апгрейдов, и помимо обжа они обрабатываются и напрямую в ехе. К меню они совершенно не относятся никак, кроме как косвенно. Кроме того, некоторые классы этого диапазона отсутсвуют в обже, но присутствуют в ехе.
По крайней мере я добавив новый апгрейд добавлением нового класса нарвался на очень неприятный баг, приведший игру в нерабочее состояние после суточного прогона игры (видимо попал на старый кусок кода в ехе, который остался со времен х2/ХТ/ХБТФ).

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


зыж По поводу твоих ошибок со строками я ответил в той теме, где ты спрашивал.
    Добавлено: 02:42 19-07-2008   
ULiX
 320 EGP


Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
AlexYar :
И ++ и -- вроде тоже не поддерживаются.

Да вроде как поддерживаются, но только в одну сторону из XC в XASM а вот из асма в си прописывает все операции: (i=i+1)-1

На счет локальных переменных. Я вижу мы друг друга не допоняли.
Пример:

Меню SHIPINFO имеет ссылку на объек-корабль, которая сохранена в локальной переменной me_Object, об этом позаботилась процедура создания меню. Таким образом программа меню знает свойсва какого объекта она должна использовать.

Для получения каких либо свойств (локальных переменных сласса) из процедур класса меню, используются методы (функции) скласса корабля. Например для получения состояния корпуса:
TMENU.me_Object->GetHull();

Но никак не:

TMENU.me_Object.sh_Hull;

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

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

Вывод. Если я дополняю класс TSHIP своей переменной (свойством) и собираюсь менять это свойство и читать его из процедур других классов, то необходимо также добавить в класс два метода (функции) для установки и чтения этой переменной.

Вопос у меня возник в связи с отсутствием функций для чтения и изменения переменной im_AllowedContexts класса 2400.
Эта переменная хранит таблицу контекстов обработки горячих клавиш. Эта переменная заполняется из файла contexts.dat и не правится больше, кроме как дополнением скриптовых обработок клавишь. Очень хотелось изменить контекст так, чтоб некоторые клавиши передавались обработчику своего меню. И вообще создать свой набор горячих клавиш для своего контекста меню.

AlexYar :
Честно говоря не понял, о каких меню идёт речь.


Я говорю о всех меню, где вызывается функция:

TUPGRADEMASTER.ContextMenuBuild(ClassObject,Object)
где
ClassObject - класс объекта меню
Object - ссылка на сам объект меню

Эта функции для каждого апгрейда вызовет фукцию:
ContextMenuBuild(ArrayConxMenu,ClassObject,Object)

Каждый апгрейд самостоятельно решает проверяя класс объекта ClassObject добавлять контекстное меню в вызывающее или нет, путём добавления в массив ArrayConxMenu свой подмассив из трех элементов. Первый элемент текст контекстного меню, третий ссылка на объект для которого определена функция ContextMenuAction, обычно апгрейды добаляют только один пункт мею и ссылаются самми на себя, хотя теоретически один апгред может создать несколько контекстных меню, каждое из которых будет просто ссылаться на функцию ContextMenuAction любого другого объект. Таким образом можно создать один апгрейд дающий дополнительные пункцты меню, а сами функции оформалять в других классах.

Млин... это так легко не объяснить, это нужно вжиться... Если очень интересно, то могу помочь это всё понять...

Выложил своё творение в готовом виде, без исходников:

Расширенные торговые утилиты

Как раз демонстрация добавления нового устройства и пункта меню в меню корабля, там же где анализаторы цен высвечиваются.
Для появления этого пункта необходимо установить Торговый модуль МК-3, а для работы ещё и Расширенную торговую систему. Может быть и дорого зато функции не слабые. А то было не понятно почему галоторговцы так обожают этот Мк-3, если для игрока оно бесполезно.

Если кого заинтересует, как всё это реализовано, могу подклиться исходниками. Гы-гы
_________________
Новое ещё не значит лучшее
    Добавлено: 09:57 23-07-2008   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
ULiX :
Да вроде как поддерживаются


Неа. Не поддерживаются. В документации по синтаксису хс о них нет ни слова.

ULiX :
Получается так, что локальными переменными могут пользоваться только локальные функции класса в котором эти переменные определены.

Вывод. Если я дополняю класс TSHIP своей переменной (свойством) и собираюсь менять это свойство и читать его из процедур других классов, то необходимо также добавить в класс два метода (функции) для установки и чтения этой переменной.


Совершенно верно. Иным способом получить значение лок.переменной класса из ф-ии другого класса нельзя.

ULiX :
Очень хотелось изменить контекст так, чтоб некоторые клавиши передавались обработчику своего меню. И вообще создать свой набор горячих клавиш для своего контекста меню.


А изменения context.dat недостаточно?

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


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

ULiX :
Млин... это так легко не объяснить, это нужно вжиться... Если очень интересно, то могу помочь это всё понять...


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

Я легко делаю новые меню целиком, но пока не понял, что именно делаешь ты. Имхо это как-то... слишком усложнённо и крайне ненадёжно. Проще сделать новое меню, какое надо, и не ломать уже существующие меню в "надежде" привести игру в неработоспособность Улыбка
    Добавлено: 12:06 23-07-2008   
ULiX
 320 EGP


Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
AlexYar :
А изменения context.dat недостаточно?

Для изменения этого файла нужно конкретно очень строго прошить код своей клавиши, тогда клавиша уже не будет Custom и естесно не будет отображаться в опциях как возможную для перезадания, если только не править код меню опций, я же регистрирую клавишу как пользовательскую. Как ни странно создатели сделали вариант внутренней регистрации дополнительных клавиш с запуском не скриптов а со сылкой на объект. То есть дополнительные классы могут зарегестрировать свои горячие клавиши так, чтобы у игроков имелась возможность перезадать их. По умолчанию контекст для таких кустом клавиш задаётся равным 2, что соответствует "В полёте"... Не совсем удобно, так как в меню эти клавиши работать не будут, что мы и наблюдаем с Анализаторами цен. Но я тут заметил, что Эгософт всё же услышал мои молитвы. По крайней мере в версии 2.5 сделано исправление... Теперь все кустом клавиши исправляют контекст на 1 (Всегда)...

Оригинальный ход и вроде и так сойдёт. Собственно мне это наруку, так как все мои новые зарегестрированные пользовательские клавиши смогут обрабатываться во всех меню созданных мной и всех других меню в которые я внедрил своё дополнительный пункт. Вопрос тут только в конфликтности... К примеру клавиша "s" используется как стрейф вниз в полете, но как старт скрипт редактора в консоле... т.е. разделенные функции по разным контекстам. К примеру клавиша "е" используется как для поворота оси корбля так и для вызова консоли в главном меню. Но в качестве контекста для функции поворота осей задано Всегда, поэтому при нажатии "е" в главном меню происходит изменение крена корабля и одновременное открытие консоли, т.е. две функции по одной клавише...
Тогда стоит задача, как для кустом клавиши (с контектом Всегда) не допустить срабатывания двух разных функций при условии что в качестве горячки задана одна кнопка на клавиатуре? Нужно изменить context.dat но до регистрации кустом клавиши не известен её код, который выделяется динамически от 1536 и в порядке возрастания. Но context.dat читается только при старте новой игры и остаётся в памяти в массивах, если исправить их, то можно добиться нужного результата.

А что разве нет какой-нибудь SE функции для получения доступа к локальной переменной другого класса?

Исправление контекста дополнительныъ клавишь с 2 на 1 не исправило глюков с анализаторами, так как в X3 в отличии от Х2 анализаторы больше не кустом девайсы и их коды горячих функций прошиты не массиве дополнительных клавиш. Хотя действительно если изменить контекст с 2 на 1 для Анализаторов, то будет сработка клавиш во всех меню разом... Даже когда корабль пристыкован Улыбка... НО исправление файла context.dat не даст результатов пока не начнешь новую игру. Поэтому и была предпринята попытка сменить контекст с 2 на 1 для кустом.

Предлагаю провести эксперимент, чтоб понять о каких исправлениях идёт речь.

1. Поставте бонус пак, или какой-нить скрипт который регистрирует горячие клавишу.
2. Начните новую игру.
3. Зайдите в настройки клавиш и задайте горячую кнопку для какой либо дополнительной скриптовой функции. Например оборона маскитами.

При задании клавиши вы увидете строчку что-то вроде "Сработка: В полёте"

4. Сохранитесь.
5. Загрузитесь.
6. Снова зайдите в настройку клавишь. И попытайтесь перезадать кнопку для скрипт функций.
Но теперь вы будете видеть "Сработка: Всегда".

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

Я всё это веду к тому, что исправить контекст очень бы хотелось, в частности, чтобы исправить неработающие клавиши анализаторов без старта новой игры.

Из обжа это делается:
TObj2400.im_AllowedContexts[673]="1;"
TObj2400.im_AllowedContexts[674]="1;"

Или по более избирательному:

TObj2400.im_AllowedContexts[673]="2;1004;1025;"
TObj2400.im_AllowedContexts[674]="2;1004;1025;"

Нужно лишь получить доступ к этой локальной переменной Подмигиваю
_________________
Новое ещё не значит лучшее
    Добавлено: 06:50 24-07-2008   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
ULiX :
А что разве нет какой-нибудь SE функции для получения доступа к локальной переменной другого класса?


Нет.

ULiX :
Нужно лишь получить доступ к этой локальной переменной


Выход, который использую я (да и егософт тоже, судя по изменениям в 2.5 насчёт наконец-то добавленной команды GetSector всем объектам, кроме TCLIENT) - добавление ф-ий в класс этой переменной для её считывания и записи. Других способов скорее всего нет.
    Добавлено: 12:04 24-07-2008   
ULiX
 320 EGP


Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
У меня глобальная просьба для Darth Revan

Можно ли сделать альтернативный синтакси для команд, таким образом, чтобы приблизить язык XC к языку KC, который и используется для создания обжей X?

Думаю, следовало бы сразу пойти этим курсом. Это позволит писать проекты на языке, который может быть принят компанией Эгософт для внедрения в новую версию игры. Многие проекты вполне приличные и могли бы быть приняты официально, но честно говоря будет очень много мороки переделать исходник из XC для трансляции в KC. Я уже это проделал со своими Расширенными торговыми утилитами, и поверте, мне это не доставило удовольствие. Построчно проверять код на несколько тысяч строк на предмет правильности синтаксиса для KC это ужас!!! Рыдания.

Нет необходимости менять детранслятор, хотя бы потому, что автоматически определить тип переменной при детрасляции будет невозможно, но можно было бы сделать альтернативный синтаксис для XC.exe.

Если есть такое желание, то я попробую выложить отличия синтакиса для некоторых команд.

Если нет времени или желания, то я бы с удовольствием глянул бы на исходники для XC и попробывал бы добавить самостоятельно поддержку альтернативного синтаксиса.

Вообще странно, зачем было выдумывать свой синтаксис для команд, которые уже имеют свой синтаксис в стандартном си.

Вот только незадача... в KC вместо "->" используется точка "."
Нужно научить транслятор распозновать имена классов и переменные указывающие на объект. Нужно проверить определен ли псевдоним как класс.

return(retc);

В KC нет скобок для команды return
return retc;

В KC cтрока
return;
Без параметров эквивалентна:
return(0);

Массивы преопределяются как:
array MyAr={a1,a2,a3};

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

Но это дело поправимо, если за такую задачу возьмутся, то я согласен предоставить инфу по синтаксису.
_________________
Новое ещё не значит лучшее
    Добавлено: 09:01 28-07-2008   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
ULiX :
но честно говоря будет очень много мороки переделать исходник из XC для трансляции в KC


А но кой хрен нужно переделывать исходники из ХС на КС? Хочешь работать на Егософт - пиши сразу на КС. А если хочешь воровать чужие работы - будешь получать по балде со всеми вытекающими Хы...

зыж На дату его последнего посещения ЕГи посмотреть не забыл?

зыыж Переделка ХС под КС - полный абсурд по той еще причине, что уже на ХС написано множество исходников, и никто их переписывать не будет, как никто не будет переучиваться на КС без острой на то необходимости.

Последний раз редактировалось: AlexYar (11:52 28-07-2008), всего редактировалось 2 раз(а)
    Добавлено: 11:03 28-07-2008   
ULiX
 320 EGP


Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
AlexYar :
зыыж Переделка ХС под КС - полный абсурд по той еще причине, что уже на ХС написано множество исходников, и никто их переписывать не будет, как никто не будет переучиваться на КС без острой на то необходимости.

Я не прошу переделку. Я хочу чтоб добавился альтернативный синтаксис. Т.е. один и тот же код можно написать разными способами.

К приемеру XC не делает отличий по типам переменных, как следствие определение переменных в КС:

int MyInt;
bool MyBool;
array MyArray;
table MyTable;
vartype MyVar;
GALOBJ MyObj;
SECOBJ MySecOBJ;

Абсолютно аналогично с определениями
var MyVariable;

И имеют идентичный код на асме.

Таким образом, нужно ввести лишь синонимы слову var при определении переменной. А также синонимы слову function при определении функций. Если уже существует база замен текстового кода на Xасм код, то нужно просто дополнить её ещё несколькими синонимами и доп структурами. Это не заставит привыкших к старому XC пилотов перестраиваться, но доставит удобство тем, кто привык программить на традиционном языке Си.

А наши иероманты скоро соберут всю базу объектов со всеми функциями и описанием к ним, так что дайте стандартный Си и люди потянутся что-то делать более энергично. На ЕС много желающих предложить свои задумки, но они склонны к традиционному синтаксису.
_________________
Новое ещё не значит лучшее
    Добавлено: 09:12 29-07-2008   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
ULiX :
тем, кто привык программить на традиционном языке Си.


А что сложного привикнуть к "традиционному" ХС ? Хы...
Я "привык" за неделю. Не вижу никакой проблемы в этом.

ULiX :
А наши иероманты скоро соберут всю базу объектов со всеми функциями и описанием к ним,


Мечтать не вредно, вредно не мечтать Улыбка Если Егософт сам эту информацию не предоставит - иероманты по всем ф-иям инфу соберут только лет через 5-7, не раньше, а то и больше.
Пока собрана информация примерно только о 50% ехе-ф-ий и их параметров. Если ты о ф-иях в обже - то они уже давно разобраны все. Но сами по себе они ничто, нужна инфомация по ехе-функциям.

ULiX :
На ЕС много желающих предложить свои задумки, но они склонны к традиционному синтаксису.


Какое отношение ЕС имеет к ЕГ ? С какого бодуна ты стал представлять интересы ЕС? Подозрение. Засланный казачок что-ли? Гы-гы

К тому же на повестке дня стоят более важные проблемы с ХС, чем подстройка под чьи-то удобства Улыбка Сперва нужно сделать возможность детрансляции обжа ХТ хотя бы, и сделать возможность его полной перекомпиляции.
Далее на повестке стоит модернизация xa_asm и xc для полной невозможности разборки перекомпилированных обжей.


Ну и конечно же ничто не сдвинется с мёртвой точки, если Darth Revan не захочет опять заняться иксами, так как сейчас у него такого желания/возможностей нет. CheckerTwo тоже взял долгосрочный таймаут.
    Добавлено: 12:37 29-07-2008   
ULiX
 320 EGP


Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
В этих вопросах нужно искать желающих перенять эстафету, как это например делается с ExScE. Всё, что для этого нужно, чтоб чекер и дарт выложили исходники, не сомневаюсь, что тогда найдутся и желающие покопаться в коде и модернизировать и даже сделают интерфейс Улыбка. Без исходников никто за это не возьмется, так как истоки о структуре obj уходят далеко в прошлое, и уже никто не задумывается об этой самой структуре... Как собственно любой программист на ООП языках забывает об ассемблере, как о страшном сне.
Эхх старые добрые времена, когда установленный SoftIce было нормой и проги не ругались, что у тебя дебагер в памяти и они отказываются дальше устанавливаться. Кто интересно сейчас ещё помнит как это было, собирать по крупицам структуру обж, да и вообще всего. Разборки c pck, cat, смех над XOR кодированием, на котором Эгософт видимо помешалось... Настальгия...
_________________
Новое ещё не значит лучшее
    Добавлено: 10:23 06-08-2008   
AlexYar
 1712 EGP


Рейтинг канала: 6(412)
Репутация: 338
Сообщения: 27580

Зарегистрирован: 26.10.2003
ULiX :
Всё, что для этого нужно, чтоб чекер и дарт выложили исходники, не сомневаюсь, что тогда найдутся и желающие покопаться в коде


Ха-ха-ха Ой, не могу!.. Желающие покопаться в коде... Ой, не могу!..
Я даже знаю, кто эти желающие, и как их фирма называется Гы-гы


2DarthRevan и CheckerTwo: Не дай бог, даже не думайте Гы-гы
    Добавлено: 20:58 07-08-2008   
ULiX
 320 EGP


Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
Цитата:

Рыыыыыыыыыыы....
У XC тоже свои причуды... Он же каждый раз когда новый файл компилирует автоматом создаёт строки с именами:
S_XC_B_1
S_XC_B_2
S_XC_B_3
и т.д.

И получается, что в нескольких inc файлах имеются разные строки с одними и теми же именами-ссылками... Повеситься можно. Приходится, либо ручками исправлять имена строк в кадом файле отдельно, либо объединять все свои cpp файлы в один и генерировать один inc файл. Не удобно ни то ни другое... ПОсле каждой компиляции XC-XASM исправлять имена строк обломно, а общий файл слишком геморно, когда нужно иметь под глазами сразу несколько классов, чтоб помнить имена переменных и функций, да и вообще НУЖНО!

Явно в XC необходимо ввести метакоманду задающую базовое имя строковой переменной, чтоб можно было избежать повторений в разных модулях.
Как, скажите мне, могут два разных человека написать совместимые сpp файлы, используя в своём коде строки, если в результате inc файлы будут иметь повторения определения строк?


AlexYar :
2DarthRevan и CheckerTwo: Не дай бог, даже не думайте

Какой ты всё таки... Вот имел бы я исходники с проблемой, которую я изложил в тут:

http://www.elite-games.ru/conference/viewtopic.php?p=1986002#1986002

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

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

Представте, что можно сделать с человеком, изменив правильно в нужной позиции цепочки ДНК один атом???

Блин, хоть раз бы увидеть ДНК и её структуру живъём. Я вообще считаю, поручите вы раскадирование кода ДНК не биологам а заядлым программерам-х.....м и проект Геном Человека завершится в ближайшие месяцы. Уж кто лучше разбирается в шифровке и кодировании? Подумаешь несколько миллионов атомов... Что мы не сможем расшифровать несколько мегабайт информации?
_________________
Новое ещё не значит лучшее
    Добавлено: 05:49 11-08-2008   
Канал X2: The Threat: «Трансляторы XC->XASM и XASM->XC»
На страницу: Пред.  1, 2, 3, 4  След. | Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Я не призрак коммунизма, я призрак админизма. Щас буду бродить по аппаратной и греметь серверами. (Alone)

  » Трансляторы XC->XASM и XASM->XC | страница 3
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18