CAST II Game Engine Community

Please login or register.

Login with username, password and session length
Advanced search  

Author Topic: Oberon - Вопросы по скриптовому языку :)  (Read 1613 times)

0 Members and 1 Guest are viewing this topic.

admin

  • Administrator
  • Full Member
  • *****
  • Posts: 192
    • CAST II Engine

Спасибо, очень может быть, что так оно и есть.
Проверю, по результатам исправлю.
Logged

Sh@dow

  • Newbie
  • *
  • Posts: 2

Похоже, ошибка в модуле OComp.pas
строка 1458, функция TCompiler.ParseVarSection
Code: [Select]
  for i := OldTotalVars to OldTotalVars+VarCount-1 do begin
    Inc(Result, GetTypeSize(TID));
    if (CurNamespace.Kind = nskModule) or (CurNamespace.Kind = nskRecord) then begin
      if GetExternalVarIndex(Data.Variables[i].Name) <> -1 then
       Data.Variables[i].Index := AllocateData(0, 0) else begin
         Data.Variables[i].Index := AllocateData(GetTypeSize(TID), 0);
         SetVarLocation(Data.Variables[i], ilGlobal);
       end;
    end else begin
      Data.Variables[i].Index := AllocateStack(GetTypeSize(TID));
      SetVarLocation(Data.Variables[i], ilStack);
    end;
    Data.Variables[i].TypeID := TID;
  end;
надо заменить на
Code: [Select]
  for i := OldTotalVars to OldTotalVars+VarCount-1 do begin
    Inc(Result, GetTypeSize(TID));
    case CurNamespace.Kind of
     nskModule:begin
      if GetExternalVarIndex(Data.Variables[i].Name) <> -1 then
       Data.Variables[i].Index := AllocateData(0, 0) else begin
         Data.Variables[i].Index := AllocateData(GetTypeSize(TID), 0);
         SetVarLocation(Data.Variables[i], ilGlobal);
       end;
     end;
     nskRecord:begin
         Data.Variables[i].Index :=CurNamespace.StackLength;
         Inc(CurNamespace.StackLength, GetTypeSize(TID));
         SetVarLocation(Data.Variables[i], ilGlobal);
     end;
     nskProcedure:begin
      Data.Variables[i].Index := AllocateStack(GetTypeSize(TID));
      SetVarLocation(Data.Variables[i], ilStack);
     end;
    end;
    Data.Variables[i].TypeID := TID;
  end;
все дело в том, что у переменных, входящих в запись, параметр Index обозначает смещение относительно начала записи, а не относительно начала массива Data, как у обычных переменных.
в этом можно убедиться, просмотрев функцию TCompiler.SpecifyRecord

PS. Нашел ошибку в своем же коде :( Я использовал переменную StackLength чтобы запоминать, где заканчивается последняя переменная, т.к. у записей она все равно не используется
« Last Edit: August 01, 2010, 01:52:24 AM by Sh@dow »
Logged

svsd_val

  • Newbie
  • *
  • Posts: 3
Re: Oberon - Вопросы по скриптовому языку :)
« Reply #3 on: December 08, 2008, 01:45:26 PM »

Я это пробывал сделать, она их ставляла , но толку никакого небыло , немог заставить записи работать , работало всё кроме записей :'(


буду ждать новой версии :)
Logged

admin

  • Administrator
  • Full Member
  • *****
  • Posts: 192
    • CAST II Engine
Re: Oberon - Вопросы по скриптовому языку :)
« Reply #2 on: December 08, 2008, 10:27:36 AM »

Для этого служит процедура ImportExternalVar();
Она принимает название переменной, типа и адрес. В скрипте требуется объявить эквивалентный тип с таким же названием и можно обращаться к данной переменной из скрипта по заданному имени. Тип может быть произвольным. Я в предыдущей версии движка, таким образом импортировал массив с частицами и можно было из скрипта задавать их поведение.
Хотя похоже, что что-то сломалось и в текущей версии это не работает, если в объявлении типа присутствуют записи.
Думаю, что к следующему релизу исправлю проблему с записями.
Тут можно взять тестовое приложение для скрипта. Чтобы более так ничего не ломалось, надо бы еще что-то вроде юнит тестов изобрести.
Logged

svsd_val

  • Newbie
  • *
  • Posts: 3
Oberon - Вопросы по скриптовому языку :)
« Reply #1 on: December 07, 2008, 10:37:32 PM »

Доброго времени суток !

случайно наткнулся на oberon - в CAST][ исходниках
Помучил его немного и возник вопрос :

Как из в скрипте получить и изменить переменную от программы ?
то есть :

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

пример:

type
 TVector = record
  x,y,z:single;
  end;

Var
 A,B : TVector;
....
A = (x:  10, y: -20, z:  30)
B = (x: -20, y:  30, z: -70)

в скрипте
 A.x := ( A.x + b.x );
 A.y := ( A.y + b.y );
 A.z := ( A.z + b.z );

Так вот как мне получить стартовое значение переменных A и B
и после окончания работы скрипта новое значение переменной A


С уважением SVSD_VAL :)
Logged
 

+ Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Name: Email:
Verification:
Type the letters shown in the picture
Listen to the letters / Request another image
Type the letters shown in the picture:

Please enter the number 234 in the field: