Добавление в Lua функции из c++

1.07.2010. c++, Lua

0

Одним из достоинств lua-скриптов является то, что из них можно вызывать функции, написанные на c/c++.

Объявление функции:

int func(lua_State  *l);

После объявления о функции необходимо сообщить lua-интерпритаторы.

lua_register(l, "smile", func);

Первый параметр - указатель на экземпляр lua-интерпритатора, второй — имя функции, которой передается параметр, третий параметр — имя c/c++ функции, которая будет выполняться из lua
Теперь немного об обмене параметрами между lua-скриптом и нашей функцией.
Обмен между lua и основной программой осуществляется через стек. Количество параметров, передаваемых от скрипта фактически не ограничено и не является постоянным. Можно передать 1 параметр, а можно 20;)

int count = lua_gettop(l); //получаем количество переданных 
//параметров (и одновременно номер последнего элемента)

Теперь, когда мы знаем, сколько нам передали параметров можно получать и их самих:
Если вы точно знаете, какой тип данных и каким по счету вам передали, то для получения данного элемента можно использовать функцию lua_totype(l,n), где type — тип данных (number, string, nil, etc), а n — номер параметра (нумерация начинается с 1, а не с 0)
Для проверки типа данных можно использовать функцию lua_istype(l,n)
Большинство функций должны что-либо возвращать. Для того, чтоб передать lua возвращаемые параметры опять необходимо использовать стек, только теперь не читать его, а писать в него:
lua_pushtype(l, data) — вместо data — либо переменная, либо строчка заданного типа, type заменяется на тип (number,string)
Функции в lua могут возвращать несколько параметром. Количество возвращаемых функцией параметров возращается как результат ее работы:

return n;

Пример приметивной программы, считающий сумму чисел от 1 до переданного параметра:

#include <iostream>
#include "lua5.1/lua.hpp"
using namespace std;
 
int func(lua_State *l);
int main()
{
lua_State *l = lua_open();
luaL_openlibs(l);
lua_register(l, "sum", func); // регистрируем функцию,
//которая в lua будет иметь имя sum
luaL_dofile(l,"script.lua");
 
lua_close(l);
return 0;
}
int func(lua_State *l)
{
 
int count = lua_gettop(l); // получаем количество
// переданных параметров
if (count&lt;1){lua_pushstring(l,"Error"); return 0;} //если нам не передали
// параметров, то good bye
 
for (int j=0;j&lt; count;j++)
{
if (lua_isnumber(l,j+1)) //если число, то
{int n=lua_tonumber(l,j+1); // получаем j-тый
// переданный параметр
lua_pushnumber(l,(n*(n+1))/2); // сумма чисел
// от 1 до n — n*(n+1)/2
}
}
return count;
};
</iostream>
sums={sum(1,2,3,4,5,6,7,8,9,10)}; -- создаем массив sums,
-- состоящий из возвращенных функцией sum параметров
for i=1,10,1 do
io.write("Сумма от 1 до "..i.." "..sums[i].."\n");
end

Hello World: Lua и C++

29.06.2010. c++, Lua

0

Lua - простой и  удобный интерпретируемый язык программирования, позволяющий легко добавить скрипты в вашу программу.

Скачать и установить lua можно отсюда. Пользователи ubuntu/debian могут установить из репозитория:
sudo aptitude install lua5.1 liblua5.1-dev

Теперь создайте новый проект на c++ в своей IDE, затем создайте новый файл: script.lua

Для использования в c++ скриптов на lua необходимо подключить файл lua.hpp:

#include "lua.hpp" // или <lua.hpp>, "lua5.1/lua.hpp", в зависимости от того, как у вас установлен lua

Тем, кто пишет на c необходимо вместо #include "lua.hpp" написать:

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

Также вам необходимо подключить библиотеку lua (liblua5.1.so в linux или lua51.lib в Windows).

Теперь инициализируем lua:

lua_State *l = lua_open();
luaL_openlibs(l);

Далее создаем lua-скрипт: создаем новый файл script.lua и пишем в нем print "Hello World!!!"

Для испольнения этого скрипта в программе на c/c++ существует специальная функция:

luaL_dofile(указатель на экземпляр lua, имя или путь к файлу со скриптом);

После работы с lua надо не забыть его закрыть:

lua_close(l);

Теперь, если вы все сделали правильно, после запуска программы вы увидети строчку "Hello World!!!"

Программа польностью:
main.cpp:

#include &lt;iostream&gt;
#include "lua5.1/lua.hpp"
using namespace std;
 
int main()
{
    lua_State *l = lua_open();
    luaL_openlibs(l);
    luaL_dofile(l,"script.lua");
 
    lua_close(l);
    return 0;
}

script.lua:

print "Hello World";

Краткие основы JavaScript

19.06.2010. JavaScript

0

Что такое?

JavaScript - объектно-ориентированый скриптовой язык программирования, в первую очередь предназначенный для создание интерактивный (т.е. изменяющихся без перезагруки) web-страниц

Типы данных и переменные

Основные типы данных в javascript:

JavaScript - язык со свободными типами данных, т.е. можно проводить операции с различными типами данных (складывать число и строку и т.д.)

Переменные.

Переменная в javascript начинается с буквы, знака доллара или подчеркивания и может содержать только буквы, знак доллара, подчеркивание и цифры. Регистр, в котором написана переменная важен (a и A - разные переменные)
Создаются переменые очень просто:

Приведение типов

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

Примечание: запись func(a1[,a2[,a3..]]) означает, что в [ ] находятся необязательные параметры, которые можно опустить. Т.е. если написано s(a[,b]), то можно писать и s(a) и s(a,b)

Арифметические операторы

Математика

Функции

Math.функция

Константы

Math.константа

Логические операторы и операторы сравнения

Условные операторы

if  (условие) {code{ - если условие истино, то выполняется код в { }

if (условие)

{ code }

else

{code 2}

Если усовие истино, то выполняется code, иначе code 2

switch (выражение)

{

case value1:

код;

break;

case value2:

код2;

break;

default:

код

}

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

условие ? код 1 : код 2 - если условие истино, выполняется код 1, иначе код 2

Операторы цикла

for (инициализация, условие, изменение) {code} - цикл выполняется до тех пор, пока условие истино. Например for (i=0;i<13;i++) {a+=a}

while (условие) {код} - пока условие истино выполняем код

do { код } while (условие) - аналогично предыдущему, только сначала выполнится код, а потом проверится условие

Функции

Cоздание фукнции в Java Script:

function name(parametr1[,parametr2...)
{

code

}

Вызов

name(параметры);

Строки

Специальные функции для работы со строками:

escape(string) - возвращает escape-последовательность стоки

unescape(string) - обратная операция

eval - вычисляет значение выражения, записанного в строку. Например, eval("2+5") вернет 7

Свойства и методы объекта String:

Записывается так: имя перемнной.свойство (метод)

Массивы

Массивы - множество переменных, объединеных общим именем.

Создание массива - name = new Array ([длинна])

Пример:

a=new Array;

a[0]=0;

a[1]="one";

a[2]=true;

И т.д.

Свойства и методы массивов в JavaScript:

C++. Урок 12. Работа с указателями. Динамическое выделение памяти

28.01.2010. c++, Программирование

0

Кроме переменных в с++ существуют указатели, которые вместо того, чтобы "хранить" их, содержат адрес этих данных в памяти. То есть, например, у нас есть куча шариков. Где-то есть шарик с номером 5. Ну так вот, указатель - это такая переменная, которая указывает на "позицию" этого шарика, на его местоположения.

Создание указателя:

тип *имя;

Пример:

int *p;  // указатель на переменную типа int или первый элемент массива типа int

char *pc; // указатель на переменную или массив типа char

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

int *p;

int a=10;

p=&a;

//теперь p указывает на переменную a.

Для записи чего-либо в память, на которую указывает указатель надо использовать оператор *, который обозначает, что мы работаем с данными, находящимися по такому-то адресу

*p=20; //теперь a==20

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

Для выделения памяти служит функция new:

char *c=new char(количество символов);

Вот мы создали массив типа char.Работа с ним ничем не отличается от работы с обычным массивом.

Внимание, после того, как вы поработали с массивом и вам он больше не нужно, необходимо отчистить память:

delete [] имя указателя на память, которую нужно отчистить.

Может будет интересно:

Если вам нужен выделенный сервер, то рекомендую вот этот сервер в Германии

Урок 11. C++. STL Стеки и очереди (stack and queue)

21.01.2010. c++, Программирование

0

Собственно сегодня небольшой урок про стеки и очереди.

Стеки (stack)

Стеки - это множество элементов, сложенных в стопку. Например, у нас есть коробка 3х5. Мы кладем в нее доски такого же размера с различными узорами. У нас получается стек. Достать из него мы можем только начинаяя с последнего элемента, поэтому первый положенные элемент вынут будет последним. В стеках реализуется принцип first in last out (FILO).

Для создания стека нужно подключить <stack> и в коде программы его объявить:

stack <type> name, где type - тип стека, а name - имя стека.

У стека есть немного функций:

Пример:

string s;

stack <string> st;

while (cin>>s);

st.push(s);

while (!(st.empty()))

{cout<<st.top();st.pop()}

В этом примере мы считываем слова с клавиатури и выводим их в обратном порядке

Очереди (Queue)

Очереди, как следует из название, используют принцип first in first out (FIFO). То есть, тот, кого мы первым запихнули в очередь, первым из нее и выйдет (хотя в реальной жизни не всегда так....)

Реализуются очереди также просто.

Подключаем <queue>

И создаем очередь

queue <type> name;

Перечень функций почти тот-же:

Пример:

queue <int>  events;

int n;

while (cin>>n)

events.push(n);

while (!events.empty)

{make(events.front());events.pop()}

В данном примере make - какая-то функция, обрабатывающая события

Вот и все об очередях со стеками. Просто и немного;)

С++. Урок 10. Изучаем map (ассоциативный массив).

18.01.2010. c++, Программирование

3

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

Читать дальше

C++. Урок 9. Стандартные алгоритмы для работы с STL (algorithm)

17.01.2010. c++, Программирование

0

В C++ существует множество спецальных алгоритмов для работы с массивами. Они позволяют сортировать данные в массиве, искать в нем какое-либо значение, менять элементы местами и т.д. Для их работы вам необходимо подкючить <algorithm> в начале программы.

Читать дальше

C++. Урок 8. STL. Контейнеры. Vector (вектор) – динамический массив

14.01.2010. c++, Программирование

11

Кроме массивов в c++ существуют еще контейнеры, которые позволяют вам немного по другому хранить данные и, вдобавок, применять к ним различные функции (поиск, сортировка и т.д.) . Сегодня вы узнаете об одном из  контейнеров - векторе (vector) Читать дальше

C++. Урок 6. Строки

10.01.2010. c++

1

Сегодня вы познакомитесь со строками в с++ и научитесь немного их обрабатывать.

Читать дальше

C++. Урок 5. Циклы

10.01.2010. c++

0

Сегодня мы познакомимся с такой вещью, как циклы

Читать дальше

С++. Урок 3. Ветвления программы (Условия: if-else)

29.12.2009. c++, Программирование

0

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

Читать дальше

С++. Урок 2. Переменные и их типы.

28.12.2009. c++, Программирование

0

Сегодня вы подробнее узнаете о переменных в c++

Читать дальше

C++. Урок 1. Знакомство

27.12.2009. c++, Программирование

0

Первый урок по программированию на языке C++. Сегодня вы узнаете, что это вообще такое, что вам необходимо для изучения и напишете свою первую программу.

Читать дальше

Страница 1 из 11

Rambler's Top100 Блогун - монетизируем блоги