Podstawy języka skryptowego Lua

Podobne dokumenty
Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Część 4 życie programu

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

I - Microsoft Visual Studio C++

1,3,4,2,3,4,0,1,4,5,0. Wówczas największa suma trzech kolejnych liczb (zaznaczone na czerwono) wynosi:

Programowanie - wykład 4

Czym jest całka? Całkowanie numeryczne

Obsługa wyjątków. Język C++ WW12

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie komputerowe. Zajęcia 1

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Utworzenie pliku. Dowiesz się:

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Podstawy programowania skrót z wykładów:

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Projektowanie klas c.d. Projektowanie klas przykład

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Zadania: 1. Funkcja przeliczająca F na C: float FtoC(float f){ return (f 32.0) * 5.0 / 9.0; }

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Przekazywanie argumentów wskaźniki

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wstęp do programowania

Wstęp do programowania. Wykład 1

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Wstęp do informatyki- wykład 11 Funkcje

Podstawy Programowania. Wykład 1

Wstęp do Programowania, laboratorium 02

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Wstęp do informatyki- wykład 9 Funkcje

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Wprowadzenie do OpenMP

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Programowanie proceduralne w języku C++ Podstawy

Język C, tablice i funkcje (laboratorium, EE1-DI)

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

1 Podstawy c++ w pigułce.

tablica: dane_liczbowe

Laboratorium 1 - Programowanie proceduralne i obiektowe

Podstawy Programowania Podstawowa składnia języka C++

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

Pytania sprawdzające wiedzę z programowania C++

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

1 Podstawy c++ w pigułce.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wstęp do programowania

C++ wprowadzanie zmiennych

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Języki i metodyka programowania. Wprowadzenie do języka C

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wstęp do programowania

Assembler w C++ Syntaksa AT&T oraz Intela

Wstęp do programowania

Podział programu na moduły

Podstawy Programowania

Zadanie 2: Arytmetyka symboli

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

#line #endif #ifndef #pragma

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Wstęp do programowania

Wstęp do Informatyki

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Dr inż. Dariusz JĘDRZEJCZYK. Informacje organizacyjne, Wprowadzenie do programowanie w języku C++. Spotkanie 1

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 1. Wprowadzenie, środowisko programistyczne, pierwsze programy

Operacje wejścia/wyjścia odsłona pierwsza

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Program 14. #include <iostream> #include <ctime> using namespace std;

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

1. Wypisywanie danych

Paostwowa Wyższa Szkoła Zawodowa w Płocku Dariusz Wardowski

Struktury Struktura polami struct struct struct struct

Jak napisać listę jednokierunkową?

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Transkrypt:

Podstawy języka skryptowego Lua Wykorzystanie Lua w C++ Krzysztof Rossa - digiboy rbox_usuń_@o2.pl 2007-07-29 Kontakt z autorem: rbox_usun_@o2.pl

Zawartość Wstęp... 3 Po co używamy skryptów?... 3 Przygotowanie środowiska... 3 Pierwszy program... 3 Wywoływanie funkcji Lua w kodzie C++... 5 Wywoływanie funkcji C++ w kodzie Lua... 7 Strona 2 z 9

Wstęp Lua jest językiem skryptowym pierwotnie zaprojektowanym dla rozszerzenia funkcjonalności różnych aplikacji, jednak często jest wykorzystywany, jako samodzielny język. Język ten charakteryzuje się prostą składnią. Język zaimplementowany jest, jako mała biblioteka napisana w języku C. Celami implementacji są: prosta, wydajność i przenośność kodu. W artykule opierać się będę Lua w wersji 5.1.2. Po co używamy skryptów? Skrypty często są używane przez twórców gier, gdzie mogą zostać wykorzystane do zaprogramowania sztucznej inteligencji, logiki gry, GUI, systemu zdarzeń. Gra, wykorzystująca skrypty umożliwia łatwą rozbudowę poprzez dodawanie skryptów lub ich modyfikowanie. Wystarczy przytoczyć takie tytuły jak: FarCry, World of Warcraft, które korzystają właśnie z języka Lua. Pełna lista gier i programów (np. nowy program Adobe Lightroom, gdzie podobno 40% kodu zostało napisane w Lua) wykorzystująca język skryptowy Lua jest dostępna pod adresem http://www.lua.org/uses.html. Inne gry wykorzystują inne gotowe języki skryptowe lub piszą własne bardziej dostosowane do własnych potrzeb, np. UnrealScript wykorzystywany w silniku Unreal Engine 2 czy Unreal Engine 3. Przygotowanie środowiska Aby rozpocząć pracę z Lua musimy zaopatrzyć się z skompilowane wersje biblioteki do ulubionego kompilatora. Istnieje też możliwość pobrania kodu źródłowego i samemu go skompilowania. W zależności od środowiska instalacja bibliotek jest różna. W artykule kod jest przystosowany do środowiska Visual Studio 2005 Pierwszy program Zgodnie z tradycją napiszemy program wyświetlający napis Hello World. Za początku musimy dołączyć pliki nagłówkowe języka skryptowego Lua. Ponieważ Lua jest napisana w C, musimy poinformować o tym fakcie kompilator słowem kluczowym extern "C". Następnie definiujemy wskaźnik na interpretator Lua. Teraz już zostało nam utworzyć obiekt interpretatora poprzez wywołanie funkcji: L = lua_open(); Kiedy obiekt Lua jest nam już nie potrzebny możemy do usunąć z pamięci za pomocą wywołania: lua_close(l); Strona 3 z 9

Aby uruchomić skrypt znajdujący się w pliku zewnętrznym wywołujemy funkcję: lual_dofile(l, "plikskryptu"); main.cpp #pragma comment (lib,"lua5.1.lib") // zaimportowanie biblioteki Lua #include <iostream> using namespace std; extern "C" #include "lua.h" #include "lualib.h" #include "lauxlib.h" /* interpretator Lua */ lua_state* L; int main ( int argc, char *argv[] ) /* inicjalizacja Lua */ L = lua_open(); /* wczytanie głównych bibliotek Lua */ lual_openlibs(l); /* uruchominie skryptu znajdującego się w pliku test.lua */ lual_dofile(l, "test.lua"); /* zamkniecie Lua */ lua_close(l); system("pause"); return 0; test.lua print "Hello World" Strona 4 z 9

Rysunek 1 Wynik działania programu Wywoływanie funkcji Lua w kodzie C++ Teraz zajmiemy się rzeczami ciekawszymi. Zdefiniujemy sobie funkcję w skrypcie Lua i będziemy wywoływać ją z kodu C++. Definiowanie funkcji w Lua jest bardzo proste. Funkcje w Lua mogą przyjmować wiele parametrów i wiele parametrów zwracać. Do tego celu używają stosu. Prosta funkcja licząca sumę dwóch liczb będzie miała postać: test.lua function add ( x, y ) początek funkcji return x + y end -- koniec funkcji Aby umożliwić wywoływanie funkcji ze skryptu Lua musimy zdefiniować kodzie C++ funkcję o dowolnej nazwie i w której odłożymy na stos parametry funkcji, a następnie zdejmiemy ze stosu wartość zwracaną z funkcji main.cpp #pragma comment (lib,"lua5.1.lib") // zaimportowanie bibliteki Lua #include <iostream> using namespace std; extern "C" #include "lua.h" #include "lualib.h" #include "lauxlib.h" /* interpretator Lua */ lua_state* L; Strona 5 z 9

int luaadd ( int x, int y ) int sum; /* nazwa funkcji w pliku test.lua */ lua_getglobal(l, "add"); /* pierwszy argument */ lua_pushnumber(l, x); /* drugi agrument */ lua_pushnumber(l, y); /* wywołanie funkcji z dwoma argumentami i jedną wartościa zwracaną */ lua_call(l, 2, 1); /* pobranie wyniku, zdjęcie ze stosu */ sum = (int)lua_tointeger(l, -1); lua_pop(l, 1); return sum; int main ( int argc, char *argv[] ) int sum; /* inicjalizacja Lua */ L = lua_open(); /* wczytanie głownych bibliotek Lua */ lual_openlibs(l); /* wczytanie skryptu znajdującego się w pliku test.lua */ lual_dofile(l, "test.lua"); /* wywołanie funkcji */ sum = luaadd( 10, 15 ); /* wyświetlenie wyniku */ cout << "Suma: " << sum << endl; /* zamkniecie Lua */ lua_close(l); system("pause"); return 0; Strona 6 z 9

Rysunek 2 Wynik działania programu Wywoływanie funkcji C++ w kodzie Lua Teraz zajmiemy się sytuacją odwrotną. Wywołamy funkcję z kodu C lub C++ w skrypcie Lua. Funkcje w Lua są wywoływane używając wskaźnika na funkcję: typedef int (*lua_cfunction) (lua_state *L); Oznacza to tyle, że funkcje przyjmują jako jeden argument tylko interpretator Lua i zwracają tylko wartość całkowitą int. My napiszemy funkcję w C++, która będzie nam liczyła średnią liczb przekazanych do funkcji, a ilość będzie zmienna. Funkcją tą będzie: static int srednia(lua_state *L) Na samym początku funkcji w lini int n = lua_gettop(l); odczytujemy ilość argumetów podanych do funkcji. Następnie w pętli sumujemy wartość agrumentów. W kolejnych liniach odkładamy na stos średnią, a następnie sumę. Jako wartość zwracaną zwracamy liczbę argumentów jaką odłożyliśmy na stos, w naszym przypadku 2. Strona 7 z 9

main.cpp #pragma comment (lib,"lua5.1.lib") // zaimportowanie bibliteki Lua #include <iostream> using namespace std; extern "C" #include "lua.h" #include "lualib.h" #include "lauxlib.h" /* interpretator Lua */ lua_state* L; static int srednia(lua_state *L) /* pobranie liczby argumentów */ int n = lua_gettop(l); double sum = 0; int i; /* sumowanie agrumentów */ for (i = 1; i <= n; i++) /* suma argumentów */ sum += lua_tonumber(l, i); /* zwrocenie sredniej */ lua_pushnumber(l, sum / n); /* zwrocenie sumy */ lua_pushnumber(l, sum); /* zwracamy ilosc wartosci zwracanych przez funkcję */ return 2; int main ( int argc, char *argv[] ) /* inicjalizacja Lua */ L = lua_open(); /* wczytanie głownych bibliotek Lua */ lual_openlibs(l); /* rejestracja funkcji srednia pod nazwa f_srednia */ lua_register(l, "f_srednia", srednia); /* uruchomienie skryptu */ lual_dofile(l, "test.lua"); /* zamkniecie Lua */ lua_close(l); system("pause"); return 0; Strona 8 z 9

test.lua srednia, sum = f_srednia(10, 20, 30, 40, 50) print("srednia wynosi: ", srednia) print("suma wynosi ", sum) Rysunek 3 Wynik działania programu Strona 9 z 9