(Srednio) zaawansowane programowanie w C++ (ZPR)

advertisement
Š¡czenie C++ i innych j¦zyków programowania
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Powtórzenie
(‘rednio) zaawansowane programowanie w C++
(ZPR)
Wykªad 6 - ª¡czenie C++ i Pythona, powtórzenie
Robert Nowak
2017L
(‘rednio) zaawansowane programowanie w C++ (ZPR)
1/46
Š¡czenie C++ i innych j¦zyków programowania
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python C
Powtórzenie
Š¡czenie C i C++
Kompilatory musz¡ by¢ zgodne (w taki sam sposób reprezentowa¢
typy wbudowane)
problemy:
I dekorowanie nazw dla linkera
I struktury danych
I funkcja main
I operacje na stercie
(‘rednio) zaawansowane programowanie w C++ (ZPR)
2/46
Š¡czenie C++ i innych j¦zyków programowania
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python C
Powtórzenie
dekorowanie nazw
linker
I w C nazwy nie mog¡ by¢ przeci¡»ane
I w C++ mog¡
nazwa funkcji jest dekorowana przez kompilator C++ (name
mengling, name decoration)
extern "C" { //Zapobiega dekorowaniu nazw
int funkcja(int a, int b) /* ... */
}
//Zapobiega dekorowaniu nazw je»eli jest kompilowane przez C++
#ifdef __cplusplus
extern "C" {
#endif
int funkcja( int a, int b) /* ... */
#ifdef __cplusplus
}
#endif
(‘rednio) zaawansowane programowanie w C++ (ZPR)
3/46
Š¡czenie C++ i innych j¦zyków programowania
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python C
Powtórzenie
funkcja main i struktury danych
Nale»y wybiera¢ implementacj¦ main z C++, poniewa»
I zapewnia ona prawidªow¡ inicjacj¦ skªadowych statycznych
I zapewnia woªanie destruktorów dla skªadowych statycznych
Struktury danych (tylko te, które s¡ dost¦pne w C):
I typy wbudowane, POD
I struktury, które nie maj¡ funkcji wirtualnych
I obiekty, które zostaªy powoªane przez
zwalniane przez
delete
I pami¦¢ zaalokowana przez
przez
free
malloc
new
powinny by¢
powinna by¢ zwalniana
(‘rednio) zaawansowane programowanie w C++ (ZPR)
4/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python
I interpretowany, interaktywny j¦zyk programowania
I Python Software Fundation,
www.python.org
I programowanie funkcyjne, obiektowe i strukturalne
I dynamiczna kontrola typów
I brak enkapsulacji
I zarz¡dzanie pami¦ci¡ przez garbage collection
I dokumentacja w kodzie ¹ródªowym
I zmienna liczba argumentów funkcji i metod
I zaznaczanie bloków przez wci¦cia
(‘rednio) zaawansowane programowanie w C++ (ZPR)
5/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - hello world
I uruchomienie interpretera
python
>>> print 'Hello world!' # comments after hash
>>> quit()
I skrypt
I utworzenie pliku o nazwie
hello.py
print 'Hello world!'
I uruchomienie skryptu
python hello.py
(‘rednio) zaawansowane programowanie w C++ (ZPR)
6/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python, obliczenia - wykorzystanie interpretera do oblicze«
>>> 2+2
4
>>> (2+3*3)/2 # arytmetyka caªkowita
5
>>> width = 20.1
>>> height = 5/2.0 # arytmetyka rzeczywista
>>> width * height
50.25
>>> x = y = 0 # równoczesne przypisanie do dwóch obiektów
>>> n # odwoªanie si¦ do niezdefiniowanego obiektu
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
None
oznacza brak warto±ci
x = None
(‘rednio) zaawansowane programowanie w C++ (ZPR)
7/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python, obliczenia (2)
%
**
Funkcje wbudowane
int()
float()
Math module (import math)
modulo (5 % 2 = 1)
pot¦ga (2 ** 3 = 8)
konwersja (podªoga)
konwersja
math.e
π = 3.1415...
e = 2.718281...
math.sqrt()
pierwiastek kwadratowy
math.pi
math.log(),
math.log10(),
funkcje wykªadnicze i logarytmiczne
math.exp(x), math.pow(x,y)
dodatkowo funkcje trygonometryczne i inne
Google: python math
or
http://docs.python.org/library/math.html
(‘rednio) zaawansowane programowanie w C++ (ZPR)
8/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - napis
>>> s = 'Hello' # pojedyncze lub podwójne cudzysªowy
>>> print s
Hello
>>> print s + "world" # konkatenacja przez operator +
Hello world
>>> print s + ' man'*3 # powtórzenia napisów za pomoc¡ *
Hello man man man
>>> u'Hello' # unicode
>>> print u'Section \u00A7'# unicode character
>>> unicode('xyz','utf-8') # ASCII, UTF-8, UTF-16, Latin-1, etc.
Indeksowanie
>>>
>>>
>>>
>>>
>>>
>>>
>>>
s = 'Hello'
s[0] # pierwsza litera, tutaj 'H'
s[-1] # ujemy indeks oznacza liczenie od ko«ca, tutaj 'o'
s[1:3] # substring, tutaj 'ell'
s[:3] # pierwszy indeks jest domy±lnie równy 0
s[1:] # drugi indeks jest domy±lnie równy dªugo±ci napisu
len(s)# dªugo±¢ napisu
(‘rednio) zaawansowane programowanie w C++ (ZPR)
9/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - lista
l = [ 'Hello', 'world', 1, 2] # elementy listy mog¡ by¢ ró»nych typów
l[0] # indeks u»ywany dla list
len(l) # liczba elementów w liscie
l[1:3] # wycinanie dla list (podobnie jak dla napisów)
l + [ 'X', 'Y' ] # ª¡czenie list
print l[2:]*3 # powtórzenia dla list
l[0] = 'cat' # l = [ 'cat', 'world', 1, 2 ]
l.append('mouse') # dodaje element na koniec listy
l[0:2] = [ 'xxx' ] # modyfikuje list¦, mo»e doda¢ lub usun¡¢ elementy
l[:] = [ ] # czy±ci list¦
l = [ 1, 2, 3 ]
m = [ l, [ 4 ] ] # m jest list¡ list
# [[1, 2, 3], [4]]
(‘rednio) zaawansowane programowanie w C++ (ZPR)
10/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - sªownik
I len(d) - liczba obiektów w sªowniku
I k in d - czy d zawiera klucz k
I d[k] - zwraca warto±¢ dla klucza k, je»eli brak klucza zgªasza
wyj¡tek KeyError
I d[k] = val - dodaje par¦ klucz-warto±¢, je»eli poprzednio
istniaªa para jest nadpisywana
d = {'one':1, 'three':3} # tworzy sªownik
d['two'] = 1 # d = { 'one':1, 'three':3, 'two':1 }
d['two'] = 2 # d = { 'one':1, 'three':3, 'two':2 }
d = {'John Smidth': '+48 213-234-22',
'Mark Brown' : '+01 234 121212',
'Max Sugar' : '+853 0123456' }
(‘rednio) zaawansowane programowanie w C++ (ZPR)
11/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - instrukcje steruj¡ce
Bloki s¡ oznaczane przez wci¦cia
x = int(raw_input("Enter integer:"))
if x < 0:
print 'Negative'
elif x == 0:
print 'Zero'
else:
print 'Positive'
while x > 0: # p¦tla while
x = x - 1
print x
animals = [ 'dog', 'cat', 'mouse' ]
for a in animals: # p¦tla for
for i in range(len(a)): # range generuje list¦, np.
print a[:i]
[0, 1, 2]
(‘rednio) zaawansowane programowanie w C++ (ZPR)
12/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Programowanie strukturalne w Pythonie
Nowa funkcja deniowana za pomoc¡
Przykªad:
wie»e
Hanoi,
def
a
b
c
a
b
c
a
b
c
a
b
c
animacja:
http://en.wikipedia.org/wiki/File:
Tower_of_Hanoi_4.gif
def hanoi(in_tower, out_tower, tmp_tower, nr):
"documentation of the function" # narz¦dzia u»ywaj¡ tego opisu
if nr == 1:
print 'move 1 from ' + in_tower + ' to ' + out_tower
return
hanoi(in_tower, tmp_tower, out_tower, nr - 1)
print 'move ' + str(nr) + ' from ' + in_tower + ' to ' + out_tower
hanoi(tmp_tower, out_tower, in_tower, nr - 1)
return
(‘rednio) zaawansowane programowanie w C++ (ZPR)
13/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - wyj¡tki
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def f(i):
if i == 2:
raise Exception('i==2')
else:
g(i-1)
def g(i):
while i > 0:
i = i - 1;
f(i)
def h(i):
try:
g(i)
except Exception:
pass
h(5)
linia
15
10
11
12
06
07
08
09
01
02
04
05
06
07
08
09
01
02
03
13
14
h(5)
i=5
*
*
*
*
g(5)
i=5
*
i=4
*
f(4)
i=4
*
*
*
g(3)
i=3
*
i=2
*
f(2)
i=2
*
*
(‘rednio) zaawansowane programowanie w C++ (ZPR)
14/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Programowanie funkcyjne w Pythonie
>>>g= lambda x: x**2 # tworzy funkcj¦ anomimow¡
>>>g(4)
16
>>>add = lambda a, b: a+b
>>>add(2,3)
5
>>># pierwszy argument to warunek
>>>print filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5, 6, 7])
[2, 4, 6]
>>># domkni¦cie (closure) - zapami¦tuje otoczenie funkcji
>>>def callback(msg):
... print msg
>>>words = ['do', 're', 'mi' ]
>>>func = []
>>>for w in words:
... func.append( lambda p = w: callback(p) )
>>>func[0]()
do
(‘rednio) zaawansowane programowanie w C++ (ZPR)
15/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - moduª (plik)
Moduª - plik z rozszerzeniem
py
zawieraj¡cy kod Pythona
I wewn¡trz moduªu jego nazwa jest zmienn¡ __name__
I gdy moduª jest uruchomiony jako skrypt python module.py
jego nazw¡ jest '__main__'
I denicje mog¡ by¢ u»yte w innym module import name
Funkcje:
I dir(module-name) - zawarto±¢ moduªu
I help(module-name) - dokumentacja moduªu
Moduª mo»e zawiera¢ sekcj¦ wykonywan¡ gdy po raz pierwszy
moduª jest u»yty
def f()
# definicja
if __name__== '__main__': # nie uruchamia gdy moduª jest doª¡czany
# sekcja wykonywana gdy moduª jest woªany jako skrypt
(‘rednio) zaawansowane programowanie w C++ (ZPR)
16/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - programowanie obiektowe
denicja klasy po sªowie kluczowym class
class MyClass:
default_x = 1 # skªadowa statyczna
def __init__(self, x, y=0): # metoda inicjuj¡ca
self.x = x # skªadowa obiektu
self.y = y # skªadowa obiektu
def f(self): # metoda
return self.x
I j¦zyk upraszcza woªanie metody inicjuj¡cej obiekt, np.
m=MyClass(23),
wtedy
m.x==23
I j¦zyk upraszcza dost¦p do atrybutu lub woªanie metody, np.
m.f()
to to samo co
MyClass.f(m)
I pierwszy atrybut metody jest wymieniony jawnie, przyj¦ªo si¦
go nazywa¢
self
(‘rednio) zaawansowane programowanie w C++ (ZPR)
17/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - (wielo)dziedziczenie
# dziedziczenie
class DerivedClass(BaseClass):
# definicja klasy pochodnej
I je»eli atrybut (lub metoda) nie jest zdeniowana w danej klasie
klasy bazowe s¡ przeszukiwane (rekursywnie)
I wszystkie metody zachowuj¡ si¦ jak wirtualne w C++
I mo»na woªa¢ metody wprost BaseClass.method(self,
arguments)
I brak enkapsulacji (wszystkie metody i skªadowe s¡ publiczne)
I isinstance(obj, class) bada, czy obj is typu class
I issubclass(classA, classB) bada, zcy classA jest pochodna
po
classB
(‘rednio) zaawansowane programowanie w C++ (ZPR)
18/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Python - programowanie obiektowe (2)
Mo»na dodawa¢ metody w czasie dziaªania
class A():
def __init__(self):
self.i = 0
def f(self, p):
print 'A::f, i=' + str(self.i) + ' p=' + str(p)
>>>a=A()
>>>a.f(1)
A::f, i=0 p=1
>>>a.__class__.g = lambda self: self.f('ala')
>>>a.g()
A::f, i=0, p=ala
(‘rednio) zaawansowane programowanie w C++ (ZPR)
19/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Pakiety
Pakiet - katalog zawieraj¡cy moduªy Pythona i moduª specjalny (inicjuj¡cy) o nazwie __init__.py
server/ # przykªad pakietu
__init__.py # inicjacja
config/ # pakiet skªadowy
__init__.py
models.py # moduª
simulator/
__init__.py
camera.py
radar.py
nazwy moduªów wykorzystuj¡ kropki
import server.simulator.camera # import module
Plik
__init__.py
musi istnie¢, nawet gdy nie jest potrzebna
inicjacja pakietu (wielko±¢ pliku=0)
(‘rednio) zaawansowane programowanie w C++ (ZPR)
20/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
‘cie»ka poszukiwa« moduªów
Gdy
name
jest doª¡czany, poszukuje si¦ plików w katalogach:
I lokalnym, zawieraj¡cym uruchomiony skrypt
I innych, katalogi s¡ przechowywane w zmiennej sys.path
import sys
print sys.path # drukuje aktualne ±cie»ki
I aby doda¢ ±cie»k¦, mo»na ustawi¢ zmienn¡ ±rodowiskow¡
PYTHONPATH
(‘rednio) zaawansowane programowanie w C++ (ZPR)
21/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Standardowe pakiety Pythona - dostarczane wraz z
interpreterem
dokumentacja:
http://docs.python.org/library/
string re struct diib StringIO cStringIO textwrap codecs unicodedata stringprep fpformat datetime
calendar collections heapq bisect array sets sched mutex Queue weakref UserDict UserList UserString
types new copy pprint repr numbers math cmath decimal fractions random itertools functools operator
os.path leinput stat statvfs lecmp temple glob fnmatch linecache shutil dircache macpath pickle
cPickle copy_reg shelve marshal anydbm whichdb dbm gdbm dbhash bsddb dumbdbm sqlite3 zlib gzip
bz2 ziple tarle csv CongParser robotparser netrc xdrlib plistlib hashlib hmac md5 sha os io time
argparse optparse getopt logging logging.cong logging.handlers getpass curses curses.textpad
curses.ascii curses.panel platform errno ctypes select threading thread dummy_threading
dummy_thread multiprocessing mmap readline rlcompleter subprocess socket ssl signal popen2 asyncore
asynchat email json mailcap mailbox mhlib mimetools mimetypes MimeWriter mimify multile rfc822
base64 binhex binascii quopri uu HTMLParser sgmllib htmllib htmlentitydefs xml.parsers.expat xml.dom
xml.dom.minidom xml.dom.pulldom xml.sax xml.sax.handler xml.sax.saxutils xml.sax.xmlreader
xml.etree.ElementTree webbrowser cgi cgitb wsgiref urllib urllib2 httplib ftplib poplib imaplib nntplib
smtplib smtpd telnetlib uuid urlparse SocketServer BaseHTTPServer SimpleHTTPServer
CGIHTTPServer cookielib Cookie xmlrpclib SimpleXMLRPCServer DocXMLRPCServer audioop
imageop aifc sunau wave chunk colorsys imghdr sndhdr ossaudiodev gettext locale cmd shlex Tk Tkinter
ttk Tix ScrolledText turtle IDLE Packages pydoc doctest unittest translation test test.test_support bdb
pdb Commands Prolers hotshot timeit trace sys syscong future_builtins warnings contextlib abc
atexit traceback gc inspect site user fpectl distutils code codeop rexec Bastion imp imputil zipimport
pkgutil modulender runpy parser ast symtable symbol token keyword tokenize tabnanny pyclbr
py_compile compileall dis pickletools
i wiele innych
(‘rednio) zaawansowane programowanie w C++ (ZPR)
22/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
automatyczna instalacja pakietów
kilka tysi¦cy pakietów dost¦pnych w repozytorium Python Package
Index.
pypi.python.org
Dost¦pne s¡ narz¦dzia do automatycznego instalowania pakietów
przechowywanych w tym repozytorium
I zainstalowa¢ setuptools dla odpowiedniej wersji interpretera
http://pypi.python.org/pypi/setuptools#downloads
I run the Python egg: sh setuptools-version.egg
Nast¦pnie:
I pip install package_name
I wersja pakietu jest wybierana automatycznie (najcz¦±ciej
najnowsza)
(‘rednio) zaawansowane programowanie w C++ (ZPR)
23/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Š¡czenie C++
i Pythona
(‘rednio) zaawansowane programowanie w C++ (ZPR)
24/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Potrzeba u»ycia ró»nych j¦zyków w aplikacjach
(patrz wykªad 1)
System komputerowy zawsze:
I ma ograniczenia czasowe, wi¦c tworzenie caªo±ci powinno by¢
mo»liwie szybkie
I posiada pewne elementy, które s¡ w¡skim gardªem - powinny by¢
zaimplementowane wydajnie (20% kodu)
System komputerowy cz¦sto:
I posiada pewne elementy, których autor nie chce udost¦pnia¢ (kod
ukryty przed u»ytkownikiem)
I posiada pewne fragmenty, które powinny by¢ dost¦pne dla
u»ytkownika (aby dostosowa¢ aplikacj¦ do indywidualnych potrzeb,
np. konguracja)
(‘rednio) zaawansowane programowanie w C++ (ZPR)
25/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Š¡czenie C++ i Pythona
I powody rozszerzania Pythona w C++
I kod wykonywany jest szybciej
I wykorzystanie istniej¡cego kodu
I kod jest ukryty przed u»ytkownikiem
I powody osadzania Pythona w C++
I brak potrzeby kompilacji
I wykorzystanie bibliotek Pythona
I kod dost¦pny dla u»ytkownika
Interfejsy:
I Python C API
I Boost Python
(‘rednio) zaawansowane programowanie w C++ (ZPR)
26/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Przykªady
Rozszerzanie Pythona w C++:
I utworzenie biblioteki dzielonej zawieraj¡cej funkcje w C++
I import biblioteki do Pythona i wykonanie
Przykªad: hello world
Osadzanie Pythona w C++ (Boost Python):
Przykªad: embedding
(‘rednio) zaawansowane programowanie w C++ (ZPR)
27/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Zadanie dodatkowe (dodatkowe 10 pkt)
Zadanie nieobowi¡zkowe, omówione cz¦±ciowo na wykªadzie 1.
Napisa¢ przykªadow¡, prost¡ aplikacj¦, która wykorzystuje
Python/C++/JavaScript. Aplikacja powinna kompilowa¢ si¦ i
dziaªa¢ na ró»nych systemach operacyjnych (np. Linux, Windows),
wykorzystywa¢ przegl¡dark¦ jako graczny interfejs u»ytkownika.
(‘rednio) zaawansowane programowanie w C++ (ZPR)
28/46
Š¡czenie C++ i innych j¦zyków programowania
Python
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Š¡czenie C++ i Pythona
Powtórzenie
Dodatkowa lektura
(http://staff.elka.pw.edu.pl/~rnowak2/rnbib.html):
I R. Nowak, Biblioteka Boost.Python. Š¡czenie C++
i Pythona, Software Developer's Journal, 2011.
I R. Nowak, Wydajne i elastyczne programy. Š¡czenie C++
i Pythona przy pomocy Boost.Python, Programista, 2012.
I R. Nowak, Komunikacja z serwerem w aplikacjach ex,
Programista, no. 7, pp. 52 54, 2012.
I R. Nowak, Aplikacje internetowe wykorzystuj¡ce python.
biblioteki up, web2py, django, Programista, no. 13, pp. 66 69, 2013.
(‘rednio) zaawansowane programowanie w C++ (ZPR)
29/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Powtórzenie
(‘rednio) zaawansowane programowanie w C++ (ZPR)
30/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Wzorce projektowe
I Wzorce kreacyjne (tworzenie obiektów)
I fabryka obiektów
I fabryka abstrakcyjna
I prototyp
I singleton
I wzorce strukturalne (budowa obiektów)
I adapter
I fasada
I proxy
I kompozyt
I dekorator
I wzorce czynno±ciowe (wspóªpraca pomi¦dzy obiektami)
I polecenie, komenda
I wizytator
I wielometoda
I obserwator
I iterator
(‘rednio) zaawansowane programowanie w C++ (ZPR)
31/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Powtórzenie i uzupeªnienie wiadomo±ci o C++
I staªo±¢, 'const', 'mutable'
I polimorzm, funkcje wirtualne, dziedziczenie wielobazowe
I dynamiczna informacja o typie
I ró»ne strategie obsªugi bª¦dów, mechanizm wyj¡tków
I sprytne wska¹niki:
I std::unique_ptr, std::auto_ptr (wycofywany)
I std::shared_ptr, boost::shared_ptr
I std::weak_ptr, boost::weak_ptr
I boost::scoped_ptr, boost::scoped_array
I boost::intrusive_ptr
I referencja do r-warto±ci w C++11 (r-value reference)
(‘rednio) zaawansowane programowanie w C++ (ZPR)
32/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Przykªadowe zadania
(‘rednio) zaawansowane programowanie w C++ (ZPR)
33/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Zad1 - zaproponuj implementacj¦ 'readFromStream'
wczytuje ona kolekcj¦ pracowników ze strumienia (hierarchia taka
jak na rysunku). Deklaracje s¡ zaproponowane poni»ej.
enum PracownikTyp { SEZNONOWY, SPECJALISTA, KIEROWNIK};
typedef boost::shared_ptr<Pracownik> PracownikPtr;
typedef std::vector<PracownikPtr> Pracownicy;
Pracownicy readFromStream(std::istream& iys);
(‘rednio) zaawansowane programowanie w C++ (ZPR)
34/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
typedef boost::shared_ptr<Pracownik> PracownikPtr;
class UnknownTypeException : public std::exception { };
class PracownikFactory {
public:
typedef PracownikPtr (*PracownikCreateFun)();
static PracownikFactory& getInstance() {
static PracownikFactory instance;
return instance;
}
void regist(int t, PracownikCreateFun fun) {
creators_.insert( std::pair<int,PracownikCreateFun>(t,fun) );
}
PracownikPtr create(std::istream& is) {
int typ; is >> typ;
Creators::const_iterator it = creators_.find(typ);
if(it != creators_.end() ) return it->second();
else throw UnknownTypeException();
}
private:
typedef std::map<int,PracownikCreateFun> Creators;
Creators creators_;
(‘rednio) zaawansowane programowanie w C++ (ZPR)
};
35/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Zad1 - przykªadowe rozwi¡zanie
typedef std::vector<PracownikPtr> Pracownicy;
Pracownicy readFromStream(std::istream& is) {
Pracownicy out;
while(is) {
try {
PracownikPtr p = PracownikFactory::getInstance().create(is);
out.push_back(p);
}
catch(UnknownTypeException&) {}
}
return out;
}
(‘rednio) zaawansowane programowanie w C++ (ZPR)
36/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
class File {
std::string name_; int size_;
public:
File(std::string n, int s) : name_(n), size_(s) {}
std::string getName() const { return name_; }
int getSize() const { return size_; }
~File(){}
};
class Dir {
typedef File* Child; typedef std::vector<Child> Children;
std::string name_; Children ch_;
public:
Dir(const std::string& n) : name_(n) {}
std::string getName() const { return name_; }
int getSize() const { int size = 0;
for(Children::const_iterator i=ch_.begin(); i!=ch_.end();++i)
size += (*i)->getSize();
return size; }
void add(Child el) { ch_.push_back(el); }
~Dir() { for(Children::iterator i=ch_.begin(); i!=ch_.end();++i)
delete *i; }
(‘rednio) zaawansowane programowanie w C++ (ZPR)
};
37/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Zad3 - poda¢ napis, który zostanie wydrukowany
M m;
D1* d1 = &m;
cout << m.f() << d1->f()
<< static_cast<D2&>(m).f()
<< static_cast<B&>(m).f() << flush;
struct B {
virtual int f() { return 1; }
};
struct D1 : virtual public B {
virtual int f() { return 2; }
};
struct D2 : virtual public B { };
struct M : public D1, public D2 {
virtual int f() { return 3; }
};
(‘rednio) zaawansowane programowanie w C++ (ZPR)
38/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
try { h(); }
catch(const std::exception&)
{
std::cout << 'c';
}
catch(const E& e) {
std::cout << e.c_;
}
Ile razy zostanie wywoªany destruktor klasy X
Je»eli denicja typu
PX
zosta-
nie zmieniona na nast¦puj¡c¡:
typedef X* PX;,
zostanie
klasy X
wywoªany
to ile razy
destruktor
struct E : public std::exception {
char c_; E(char c):c_(c){}
};
struct X {
char c_;
X(char c):c_(c){cout << c_;}
~X(){ std::cout << c_; }
};
typedef std::auto_ptr<X> PX;
PX f(char c){ return PX(new X(c) );}
void g(const PX& px){
throw E(px->c_);}
void h() {
PX pa = f('a');
try { PX pb = pa;
g(f('b'));}
catch(const E& e){
cout << e.c_;throw;}
}
(‘rednio) zaawansowane programowanie w C++ (ZPR)
39/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Wekt2D w1(1,1), w2(2); assert( w1 + w2 == Wekt2D(3,1) );
class Wekt2D {
public:
explicit Wekt2D(int dx = 0, int dy ) : dx_(dx), dy_(dy) {}
int getDX() { return dx_; }
int getDY() { return dy_; }
Wekt2D& operator+=(const Wekt2D& w) {
Wekt2D o;
o.dx_ = w.dx_ + dx_; o.dy_ = w.dy_ = dy_;
return o;
}
Wekt2D& operator+(Wekt2D& w) const {
Wekt2D o(*this); o += w;
return o;
}
int operator==(Wekt2D w) const { return dy_ == w.dy_; }
private:
int dx_, dy_;
};
std::ostream& operator<<(std::ostream os, Wekt2D w) {
os << ( << w.getDX() << , << w.getDY() << );
(‘rednio) zaawansowane programowanie w C++ (ZPR)
}
40/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
class Wekt2D {
public:
explicit Wekt2D(int dx = 0, int dy = 0) : dx_(dx), dy_(dy) {}
int getDX() const { return dx_; }
int getDY() const { return dy_; }
Wekt2D& operator+=(const Wekt2D& w) {
dx_ += w.dx_;
dy_ += w.dy_;
return *this;
}
Wekt2D operator+(const Wekt2D& w) const {
Wekt2D o(*this); o += w; return o;
}
bool operator==(const Wekt2D& w) const {
return dx_ == w.dx_ && dy_ == w.dy_; }
private:
int dx_, dy_;
};
std::ostream& operator<<(std::ostream& os, const Wekt2D& w) {
os << "(" << w.getDX() << "," << w.getDY() << ")";
return os;
(‘rednio) zaawansowane programowanie w C++ (ZPR)
}
41/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty
string FindAddr( list<Employee> l, string name ) {
for( list<Employee>::iterator i = l.begin(); i != l.end(); i++ )
if( *i == name )
return (*i).addr;
return "";
}
(‘rednio) zaawansowane programowanie w C++ (ZPR)
42/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty
string FindAddr( list<Employee> l, string name ) {
for( list<Employee>::iterator i = l.begin(); i != l.end(); i++ )
if( *i == name )
return (*i).addr;
return "";
}
string FindAddr( const list<Employee>& l, const string& name ) {
string addr;
for( list<Employee>::iterator i = l.begin(); i != l.end(); ++i )
if( i->name() == name ){
addr = (*i).addr; break; }
return addr;
}
(‘rednio) zaawansowane programowanie w C++ (ZPR)
43/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty
string FindAddr( list<Employee> l, string name ) {
for( list<Employee>::iterator i = l.begin(); i != l.end(); i++ )
if( *i == name )
return (*i).addr;
return "";
}
string FindAddr( const list<Employee>& l, const string& name ) {
string addr;
for( list<Employee>::iterator i = l.begin(); i != l.end(); ++i )
if( i->name() == name ){
addr = (*i).addr; break; }
return addr;
}
list<Employee>::const_iterator it =
find_if(l.begin(), l.end(), bind(&Employee::name,_1) == name);
(‘rednio) zaawansowane programowanie w C++ (ZPR)
44/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty
string FindAddr( list<Employee> l, string name ) {
for( list<Employee>::iterator i = l.begin(); i != l.end(); i++ )
if( *i == name )
return (*i).addr;
return "";
}
string FindAddr( const list<Employee>& l, const string& name ) {
string addr;
for( list<Employee>::iterator i = l.begin(); i != l.end(); ++i )
if( i->name() == name ){
addr = (*i).addr; break; }
return addr;
}
list<Employee>::const_iterator it =
find_if(l.begin(), l.end(), bind(&Employee::name,_1) == name);
auto it =
find_if(l.begin(), l.end(), [&](Employee& e) return e.name == name;);
(‘rednio) zaawansowane programowanie w C++ (ZPR)
45/46
Š¡czenie C++ i innych j¦zyków programowania
Powtórzenie
Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python
Przykªadowe zadania
Powtórzenie
Dzi¦kuj¦
(‘rednio) zaawansowane programowanie w C++ (ZPR)
46/46
Download