Добавление в Lua функции из c++
Одним из достоинств 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<1){lua_pushstring(l,"Error"); return 0;} //если нам не передали // параметров, то good bye for (int j=0;j< 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++
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 <iostream> #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:
- string - строка, какая-либо последовательность символов
- number - число (2, 4, 1e10, 3,14 и т.д.)
- bool - логический тип данных, может принимать два значение: true or false
- object - объект
- function - функция
- undefined - тип данных не определен
JavaScript - язык со свободными типами данных, т.е. можно проводить операции с различными типами данных (складывать число и строку и т.д.)
Переменные.
Переменная в javascript начинается с буквы, знака доллара или подчеркивания и может содержать только буквы, знак доллара, подчеркивание и цифры. Регистр, в котором написана переменная важен (a и A - разные переменные)
Создаются переменые очень просто:
- имя = значение - создается переменная, содержащая значение (в JS оператор = является оператором присвоения, для сравнения используется оператор ==)
- var имя - создается пустая переменная
- var name=value - создается переменная с заданным значением
Приведение типов
Для проведения некоторых операция требуется преобразование одного типа данных в другой. Для этого существуют специальные функции:
- Number(выражение\переменная) - преобразование в число, возвращает либо число, либо NaN (не число). Для логических величин возвращает 1 если true и 0 если false. Для строк пытается привести к числу (возможно преобразование в число таких строк, как "12312", "3,14" и т.д., при передачи в качестве параметра строки типа "7 дней" вернет NaN
- parseInt(string[, base]) - пытается вернуть целое число, записаное в строке. Если указан необязательный параметр base, то считает число по основанию, указаному в base (8,16, по умолчанию - 10, указывать не обязательно)
- parseFloat (string) - пытается преобразовать строку в вещественное число
- String (выражение\переменная) - преобразует данные в строковой формат. Для логических данных возвращает true or false, для undefined - пустую строку ("")
- Boolean(данные) - приводит данные к логическому типу. 0 возращается, если данные - пустая строка или 0, а в остальных случаех возращает true
- Array(1[,2[,3...]]) - возращает массив, состоящих из переданных команде элементов
Примечание: запись func(a1[,a2[,a3..]]) означает, что в [ ] находятся необязательные параметры, которые можно опустить. Т.е. если написано s(a[,b]), то можно писать и s(a) и s(a,b)
Арифметические операторы
- + - сложение (для строк - конкатенация (склейка) строк)
- - - вычитание
- * - умножение
- / - деление
- % - остаток от деление ( a mod b)
- ++ - увеличение на 1
- -- - уменьшение на 1
- += a - увеличение на a
- -=a - уменьшение на a
- *=a - умножение на a
- /=a - деление на a
- %=a - остаток от деление на a
Математика
Функции
Math.функция
- abs(number) - модуль числа
- acos(number) - арккосинус
- asin(number) - арксинус
- atan (number) - арктангенс числа
- cos (number) - косинус числа
- sin(number) - синус числа
- tan(number) - тангенс числа
- exp(number) - enumber
- floor(number) - округление вниз
- ceil(number) - округление числа вврех
- round(a) - округление до ближайшего целого
- log(number) - натуральный логарифм (логарифм а по основанию b находится так: logba=lna/lnb
- min(a,b),max(a,b) - минимальное или максимальное из двух чисел
- pow(a,b) - a в степени b
- sqrt(a) - квадратный корень из a
- random() - случайное вещественное число в промежутке от 0 до 1
Константы
Math.константа
- E - постоянная Эйлера
- PI - число пи
- SQRT1_2 - sqrt(0,5)
- SORT - sqrt(2)
Логические операторы и операторы сравнения
- == - равно
- != не равно
- > - больше
- >= - больше либо равно
- < - меньше
- <= меньше либо равно
- ! - отрицание
- && - и
- || - или
Условные операторы
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:
Записывается так: имя перемнной.свойство (метод)
- length - длина строки
- prototype - создает свое свойство или метод к объекту
- charAt (index) - возвращает символ, находящийся на позицие index
- concat(string) - присоединят к строке переданный параметр (аналог +=)
- indexOf(подстрока[,начиная откуда]) - ищет индекс первого вхождения подстроки в строку, начиная от переданного параметра (по умолчанию 0)
- lastindexOf(подстрока[,начиная откуда])indexOf(подстрока[,начиная откуда]) - аналогично предыдущему, но поиск идет с конца, т.е. возвращается последнее вхождение, а не первое
- slice (i1[,i2])- возвращает подстроку от i1 до i2, если i2 не задан, то до конца. Последний символ не включается
- substring(i1,i2) - тоже самое, только включая последний символ
- substr(index[,length]) - возвращает подстроку с заданной длинной начиная от заданнного индекса
- toLowerCase(string), toUppercase(string) - переводит строку в верхний или нижний регистр
Массивы
Массивы - множество переменных, объединеных общим именем.
Создание массива - name = new Array ([длинна])
Пример:
a=new Array;
a[0]=0;
a[1]="one";
a[2]=true;
И т.д.
Свойства и методы массивов в JavaScript:
- length - длинна массива
- prototype - добавление своего свойства (array.prototype.test = functest(); array.test() - новое свойство)
- concat(array2) - прибавить второй массив к первому
- join(разделитель) - создать из элементов массива строку с указанным разделителем
- pop - выкинуть (удалить) последний элемент массива, вернув его значение
- push (значение) - добавить элемент в конец массива и вернуть новую длинну массива
- shift - удалить первый элемент и вернуть его значение
- unshift (what) - добавить элемент в начавло массива
- reverse() - инвертировать массив (из массива 1 2 3 получится 3 2 1)
- slice (index1, index2) - подмассив от index1 до index2-1
Пишем рандомайзер (генератор случайных чисел) на perl`е
21.02.2010. perl, Программирование
0Очень простой урок о том, как написать элементарный perl-web-скрипт, генерирующий случайные числа.
CGI-скрипт должен начинаться с указания программы, которая его обрабатывает. Поэтому в первой строчке как раз и напишем это:
#!/usr/bin/perl
Теперь сообщим, что мы хотим выводить html-документ и создадим экземпляр класса для получения параметров, переданных через браузер
use CGI; use CGI::Carp qw/fatalsToBrowser/; $cgi=new CGI; print "Content-type:text\/html\n\n";
Первые три строчки - создание экземпляра класса, а последняя сообщает, что мы будем выводить html-документ
Получать данные для скрипта будем с помощью метода GET. Т.е. все переменные будут передаваться нам через строку браузера после адреса скрипта. Передача осуществляется примерно так: site.ru/script.cgi?a=10&b=12
Теперь, чтобы получить значения a и b надо создать 2 переменные и "вытащить" оттуда эти данные:
$x=$cgi->param('a'); $y=$cgi->param('b');
Вот здесь мы записали в x и y переданные скрипту a и b.
Что-бы не передавать параметры вручную создадим форму:
print "<form action=\"index.cgi\" method=\"get\"><br />Vvedite a: <input type=\"text\" value=$x name=\"a\"/> Vvedite b:<input type=\"text\" value=$y name=\"b\"/> <input type=\"submit\"/><br /></form>";
И теперь выведем случайное число от a до b:
print int(rand($x)+$y);
Вот и все. Простой скрипт, генерирующий случайные числа сделан. Загружаем его на сервер и любуемся результатом.
Полные код:
#!/usr/bin/perl use CGI; use CGI::Carp qw/fatalsToBrowser/; $cgi=new CGI; print "Content-type:text\/html\n\n"; $x=$cgi->param('a'); $y=$cgi->param('b'); print "<form action=\"index.cgi\" method=\"get\"><br />Vvedite a: <input type=\"text\" value=$x name=\"a\"/> Vvedite b:<input type=\"text\" value=$y name=\"b\"/> <input type=\"submit\"/><br /></form>"; print int(rand($x)+$y);
Уроки C++. Структуры.
1.02.2010. c++, Программирование
0Очень часто бывает необходимо объединить в одной переменной хранить несколько значений. Например, 2 координаты: х и у. Вот тогда можно использовать структуры данных, или просто структуры.
Создавать и работать с структурами очень просто. Для объявления структуры надо написать struct name
{ type varname;
type2 var2name}
Например,
struct point
{
float x;
float y;
int color;
string name;
};
Теперь, после того, как мы объявили структуру, пора создать ее экземпляр:
point points[1000]; // мы создали массив из 1000 элементов
Обращение к элементу структуры осуществляется через точку:
points[10].x=0,5;
points[10].y=1;
cout<<points[1].name;
И так далее.
Если вы создаете структуры динамически, то обращение к элементу осуществляется через ->:
point *p;
p=new point;
p->x=1;
p->y=2;
P.S.
Скачать программы и обои для стен, игры для nokia 5800 и бесплатные игры на телефон.
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 - имя стека.
У стека есть немного функций:
- push() - добавить элемент
- pop() - удалить верхний элемент
- top() - получить верхний элемент
- size() - размер стека
- empty() - true, если стек пуст
Пример:
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;
Перечень функций почти тот-же:
- push() - добавить элемент
- pop() - удалить первый элемент
- size() - размер очереди
- empty() - true, если очередь пуста
- front() - получить первый элемент
- back() - получить последний элемент
Пример:
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++. Урок 7. Чтение и запись в файл
Пора наконец-то научится работать с файлами в с++: читать в них, писать в них и изменятять их.
C++. Урок 6. Строки
Сегодня вы познакомитесь со строками в с++ и научитесь немного их обрабатывать.
C++. Урок 5. Циклы
Сегодня мы познакомимся с такой вещью, как циклы
C++. Урок 4. Массивы
2.01.2010. c++, Программирование
1
Очередной урок по c++. На этот раз вы познакомитесь с массивами данных.
С++. Урок 3. Ветвления программы (Условия: if-else)
29.12.2009. c++, Программирование
0
Сегодня вы познакомитесь у условными операторами. Благодаря ним вы сможете в зависимости от ситуации производить различные действия.
С++. Урок 2. Переменные и их типы.
28.12.2009. c++, Программирование
0
Сегодня вы подробнее узнаете о переменных в c++
C++. Урок 1. Знакомство
27.12.2009. c++, Программирование
0Первый урок по программированию на языке C++. Сегодня вы узнаете, что это вообще такое, что вам необходимо для изучения и напишете свою первую программу.





