Podstawy komunikacji między procesami PVM
|
|
- Danuta Nowicka
- 8 lat temu
- Przeglądów:
Transkrypt
1 Podstawy komunikacji między procesami PVM Zakres ćwiczenia Komunikacja między zadaniami PVM odbywa się przy pomocy wymiany wiadomości. Celem ćwiczenia jest więc poznanie podstawowych operacji tworzenia, wysyłania i odbierania wiadomości. Komunikacja między zadaniami w środowisku PVM Wysłanie komunikatu składa się w PVM z trzech kroków: 1. Konieczna jest inicjalizacja bufora za pomocą funkcji pvm_initsend (lub za pomocą nie omawianej tutaj funkcji pvm_mkbuf). 2. Komunikat musi zostać umieszczony w buforze za pomocą kombinacji funkcji pvm_pk*. 3. Kompletny komunikat przesyłany jest do innego zadania poprzez wywołanie funkcji pvm_send (lub do wielu zadań za pomocą pvm_mcast) Komunikat odbierany jest przez wywołanie blokującej bądź nieblokującej funkcji odbiorczej i późniejsze rozpakowanie wiadomości z bufora do zmiennych. Odbierane komunikaty mogą być filtrowane na podstawie identyfikatora nadawcy i/lub etykiety. Dane są przesyłane w postaci niezależnej od architektury, chyba, że użytkownik zażąda inaczej. Środowisko PVM zapewnia kolejność FIFO wiadomości pomiędzy każdymi dwoma komunikującymi się zadaniami. Dzięki mechanizmowi filtrowania wiadomości kolejność ta może być zmieniana. Koncepcja programu Aby zademonstrować mechanizmy komunikacji w środowisku PVM, zmodyfikujemy poprzednio utworzoną parę programów master-slave. Program master będzie tworzył pewną liczbę programów typu slave, a następnie będzie im wysyłał swój identyfikator i kolejne liczby poczynając od 0. Następnie będzie oczekiwał na odebranie wiadomości od programów typu slave. Aby przekonać się, że faktycznie programy są uruchamiane na różnych węzłach, każdy slave będzie odsyłał nazwę maszyny, na której jest uruchomiony, oraz swój identyfikator. Przed dalszą pracą, uruchom środowisko pvm i dodaj do niego kilka węzłów. Sprawdź za pomocą polecenia conf konfigurację maszyny wirtualnej. Wyjdź z konsoli PVM za pomocą komendy quit. Przygotowanie programu Nasz program składać się będzie z trzech plików: def.h, master.c, slave.c. Pierwszy z tych plików będzie zawierał definicje wspólne dla programów master oraz slave. Dwie pierwsze linijki to załączenie plików nagłówkowych pvm3.h oraz stdlib.h. Następnie są zdefiniowane stałe określające nazwę programu wykonywalnego programu slave, liczbę zadań slave oraz rozmiar maksymalny przewidywany na nazwę maszyny, a także określimy nazwy symboliczne dla liczb wyznaczających typy wiadomości (pojęcie wyjaśnione w dalszej części ćwiczenia).
2 Program def.h 1. #include "pvm3.h" 2. #include <stdlib.h> 3. #define SLAVENAME "slave" 4. #define SLAVENUM 4 5. #define NAMESIZE #define MSG_MST 1 7. #define MSG_SLV 2 W programie master.c pierwsze linijki są identyczne niemal jak ostatnio. Uruchamiane jest kilka programów typu slave. Następnie w linijce 9 master pobiera własny identyfikator za pomocą funkcji pvm_mytid. Kolejne kilka linijek omówimy dokładniej, gdyż zawierają one przygotowanie i wysłanie komunikatu. Program master.c 1. #include "def.h" 2. main() 3. { 4. int mytid; 5. int tids[slavenum];/* identyfikatory zadań slave */ 6. char slave_name[namesize]; 7. int nproc, i, who; 8. nproc=pvm_spawn(slavename, NULL, PvmTaskDefault, \ "", SLAVENUM, tids); 9. mytid = pvm_mytid(); 10. printf("master: Moj identyfikator to %d \n", mytid); Jak pamiętamy, funkcja pvm_spawn zwraca liczbę faktycznie utworzonych procesów typu slave. Tak więc pętla obejmująca linijki wysyła komunikaty do wszystkich utworzonych procesów. Na początku należy przygotować bufor komunikacyjny za pomocą funkcji pvm_initsend. Funkcja ta tworzy bufor, o ile on wcześniej nie istniał, lub też opróżnia bufor komunikacyjny, jeżeli był on już wcześniej przygotowany. Flaga PvmDataDefault określa, że dane przy wkładaniu do bufora mają być konwertowane do postaci niezależnej od architektury. Po przygotowaniu bufora, można zacząć umieszczać w nim dane za pomocą funkcji z rodziny pvm_pk*. Nazwa każdej z takich funkcji składa się z przedrostka pvm_pk oraz nazwy typu: np. pvm_pkint, pvm_pkbyte czy też pvm_pkstr. W linijce 4 zapakowany jest 1 element typu int do bufora, tak samo w linijce 5. Argumenty funkcji pvm_pkint to kolejno adres, pod którym znajduje się element, liczba element, i tzw. odstęp (co który element ma być pakowany: np. można kazać wybierać tylko parzyste elementy tablic) w wszystkich naszych programach ostatni parametr zawsze będzie równy 1 (za wyjątkiem specjalnego przykładu ilustrującego jego użycie pod koniec obecnego ćwiczenia). Wreszcie tak przygotowany komunikat jest wysyłany za pomocą funkcji pvm_send. Pierwszy argument tej funkcji to adresat wiadomości tutaj kolejny element tablicy tids, która, jak pamiętamy, zawiera identyfikatory zadań uruchomionych przez wywołanie funkcji pvm_send w linijce 8 - a drugi to znacznik wiadomości, liczba określająca jej typ. Typ wiadomości ma znaczenie dla programisty i umożliwia następnie filtrowanie nadchodzących wiadomości według ich typów. Można bufor traktować jako pudełko. Funkcja pvm_initsend daje nam takie pudełko, lub wyrzuca jego poprzednią zawartość, a funkcje z rodziny pvm_pk* wkładają do tego przygotowanego pudełka kolejne elementy do wysłania.
3 11. for( i=0 ; i<nproc ; i++ ) 12. { 13. pvm_initsend(pvmdatadefault); 14. pvm_pkint(&mytid, 1, 1); 15. pvm_pkint(&i, 1, 1); 16. pvm_send(tids[i], MSG_MSTR); 17. } Kolejną czynnością mastera, jak już wspomnieliśmy wcześniej, ma być odebranie komunikatów od zadań potomnych. Dzieje się to w pętli w linijkach W linijce 20 zadanie blokuje się tak długo, dopóki nie nadejdzie komunikat od dowolnego nadawcy (-1 jako pierwszy argument funkcji pvm_recv) oraz o typie MSG_SLV (drugi argument tej funkcji). Przesłane elementy są wypakowane z wiadomości za pomocą funkcji pvm_upkint, która wyciąga jeden element typu int i umieszcza go w zmiennej who. W linijce 21 następuje wypakowanie nadesłanego łańcucha. W tym wypadku nie podaje się liczby elementów ani odstępu; każdy łańcuch zawsze kończy się zerem, więc to jednoznacznie określa, co ma zawierać wypakowany łańcuch. Należy tutaj podkreślić, że to od programisty zależy, czy w wiadomości faktycznie znajdują się elementy tego typu (i w takiej kolejności), jak tego oczekują wywoływane funkcje z rodziny pvm_upk*. W przypadku używania wielu różnych wiadomości różnych typów należy używać znaczników wiadomości. Wreszcie program opuszcza środowisko pvm (z pomocą pvm_exit w linijce 24), po czym kończy swoje działanie. 18. for( i=0 ; i<nproc ; i++ ) 19. { 20. pvm_recv( -1, MSG_SLV ); 21. pvm_upkint(&who, 1, 1 ); 22. pvm_upkstr(slave_name ); 23. printf("master: proces t%x jest na hoscie \ 24. } 25. pvm_exit(); 26. } %s\n",who, slave_name); Przyjrzyjmy się teraz strukturze programu slave. Będzie on odbierał wiadomość od mastera, a następnie odsyłał mu nazwę maszyny (hostname) na której został uruchomiony razem z własnym identyfikatorem. Pierwsze linijki zasadniczo nie wymagają wyjaśnienia są to załączenie pliku nagłówkowego def.h, deklaracje zmiennych oraz przydział miejsca w sposób dynamiczny dla zmiennej łańcuchowej str. Program slave.c 1. #include "def.h" 2. int main() 3. { 4. int ptid, my2; 5. int mytid; 6. char *str = malloc( 64 );
4 Następnie w linijce 7 slave blokuje się w oczekiwaniu na nadejście dowolnej wiadomości o znaczniku MSG_MSTR. Gdy taka wiadomość nadejdzie, wypakowuje z niej dwie liczby typu int i wypisuje je na standardowym wyjściu. W linijce 16 pobiera swój własny identyfikator i przypisuje go do zmiennej mytid. Następnie tworzy bufor komunikacyjny, pakuje do niego swój identyfikator, pobiera nazwę maszyny na której się znajduje w linijce 19 i pakuje go do bufora (linijka 21). W funkcji pvm_pkstr nie jest potrzebne określenie rozmiaru łańcucha jest on określany automatycznie, gdyż, jak pamiętamy, łańcuchy w języku C są kończone zerem. Funkcja gethostbyname właściwie kończy łańcuch zerem, za wyjątkiem przypadku specjalnego, gdy nie mieści się on w podanej długości znaków 64 w podanym przykładzie. Z uwagi na ten przypadek specjalny dodana jest linijka 20. Następnie tak przygotowany komunikat wysyłany jest do ojca. Identyfikator ojca znamy, gdyż został on nadesłany w odebranym wcześniej komunikacie. Na końcu proces slave wychodzi z środowiska PVM i kończy pracę. 7. int i = pvm_recv( -1, MSG_MSTR); 8. if ( i < 0 ) 9. { 10. perror("nieoczekiwany błąd."); 11. exit(0); 12. } 13. pvm_upkint( &ptid, 1, 1); 14. pvm_upkint( &my2, 1, 1); 15. printf("slave: Otrzymałem %x %d \n", tid, my2); 16. mytid = pvm_mytid(); 17. pvm_initsend( PvmDataDefault); 18. pvm_pkint( &mytid, 1, 1); 19. gethostname( str, 64 ); 20. str[64] = 0; 21. pvm_pkstr( str ); 22. pvm_send(mynumber, MSG_SLV); 23. pvm_exit(); 24. } Należy teraz skompilować oba programy i umieścić pliki wykonywalne w odpowiednim katalogu: gcc master.c o master lpvm3 gcc slave.c o slave lpvm3 cp master slave $PVM_HOME Następnie można je uruchomić za pomocą polecenia konsoli PVM spawn -> master. Wynik uruchomienia może wyglądać na przykład tak:
5 pvm> spawn -> master [1] 1 successful t40020 pvm> [1:t40021] Slave: Otrzymałem [1:t40021] EOF [1:tc0019] Slave: Otrzymałem [1:tc0019] EOF [1:t80018] Slave: Otrzymałem [1:t80018] EOF [1:t40020] Master: Moj identyfikator to [1:t40020] Master: proces t40021 jest na hoscie lab [1:t40020] Master: proces tc0019 jest na hoscie lab [1:t40020] Master: proces t80018 jest na hoscie lab [1:t40020] Master: proces t80019 jest na hoscie lab [1:t40020] EOF [1:t80019] Slave: Otrzymałem [1:t80019] EOF [1] finished Dla celów czysto edukacyjnych zmodyfikujemy teraz nieco programy master.c oraz slave.c. Mianowicie w pliku master.c wywołanie funkcji pvm_initsend z linijki 13 przeniesiemy przed pętlę for. Odpowiedni fragment kodu wyglądać będzie więc tak: 11. pvm_initsend(pvmdatadefault); 12. for( i=0 ; i<nproc ; i++ ) 13. { 14. pvm_pkint(&mytid, 1, 1); 15. pvm_pkint(&i, 1, 1); 16. pvm_send(tids[i], MSG_MSTR); 17. } Wydawałoby się na pierwszy rzut oka nieuważnej osoby, że zmiana ta jest dość niewielka. Wprowadźmy więc równie niewielką zmianę w kodzie programu slave. Zmiany te to wprowadzenie definicji trzech potrzebnych zmiennych w linijce 6 oraz dodanie wywołania funkcji pvm_bufinfo w linijce 13, za pomocą której uzyskamy informacje o rozmiarze odebranego komunikatu. 1. int main() 2. { 3. int ptid, my2; 4. int mytid; 5. char *str = malloc( 64 ); 6. int size,tag,tid; 7. int i = pvm_recv( -1, MSG_MSTR); 8. if ( i < 0 ) 9. { 10. perror("nieoczekiwany błąd."); 11. exit(0); 12. } 13. pvm_bufinfo( i, &size, &tag, &tid ); 14. printf("slave: Rozmiar wiadomosci %d\n",size); Po skompilowaniu oraz uruchomieniu programu (w przykładzie dla zwiększenia czytelności pominięto część informacji wypisywanych przez program slave), wynik może wyglądać tak:
6 pvm> spawn -> master [1] 1 successful tc001b pvm> [1:t40026] Slave: Rozmiar wiadomosci 8 [1:t40026] EOF [1:t40027] Slave: Rozmiar wiadomosci 16 [1:t40027] EOF [1:tc001c] Slave: Rozmiar wiadomosci 32 [1:tc001c] EOF [1:tc001b] Master: Moj identyfikator to [1:tc001b] Master: proces tc001c jest na hoscie lab [1:tc001b] Master: proces t40026 jest na hoscie lab [1:tc001b] Master: proces t40027 jest na hoscie lab [1:tc001b] Master: proces t8001c jest na hoscie lab [1:t8001c] Slave: Rozmiar wiadomosci 24 [1:tc001b] EOF [1:t8001c] EOF [1] finished Widać tutaj wyraźnie, że każdy kolejny proces slave otrzymuje coraz większy komunikat (rozmiary kolejno to 8, 16, 24, 32). Wynika to z faktu, że ponieważ przenieśliśmy funkcję pvm_initsend przed pętlę for, bufor komunikacyjny jest tworzony tylko raz, a następnie nie jest czyszczony. Każda iteracja pętli powoduje dołożenie dwóch kolejnych elementów typu int, których rozmiar wynosi 4 bajty. Przykład wykorzystania pozostałych argumentów funkcji pvm_pkint Funkcja pvm_pkint posiada trzy argumenty. Do tej pory wartość dwóch ostatnich z nich zawsze wynosiła 1. Obecnie przedstawimy sposób użycia tych argumentów. Przypomnijmy, że pierwszy argument to adres, spod którego mają być pobierane elementy do umieszczenia w buforze, drugi argument oznacza liczbę tych elementów, a trzeci tzw. odstęp. Przeanalizujmy kod przedstawiony poniżej: Program master.c 1. #include "def.h" 2. #include <stdio.h> 3. int main(int argc, char **argv) 4. { 5. int tids[slavenum]; 6. int i; 7. int tab[10]={0,1,2,3,4,5,6,7,8,9}; 8. pvm_spawn(slavename,0,0,".",slavenum,tids); W linijce 7-mej znajduje się definicja tablicy 10-elementowej. Każdy z elementów tej tablicy to kolejny numer od 0 do 9 czyli element drugi ma wartość 3, element trzeci ma wartość 2 i tak dalej. Ułatwi to później zrozumienia sensu trzeciego argumentu funkcji pvm_pkint. Proces master tworzy następnie SLAVENUM procesów potomnych.
7 9. for (i=0;i<slavenum;i+=2) 10. { 11. pvm_initsend( PvmDataRaw ); 12. pvm_pkint(tab,5,2); 13. pvm_send(tids[i],msg_mstr); 14. } Zobacz teraz co się dzieje w pętli w linijkach Do co drugiego procesu ( i+=2 ) procesu wysyłana jest teraz część tablicy tab (liczba elementów wynosi pięć) odstęp jednak (trzeci argument funkcji pvm_pkint) wynosi 2. W efekcie wysyłane są parzyste elementy tablicy tab: 0, 2, 4, 6 i for (i=1;i<slavenum;i+=2) 16. { 17. pvm_initsend( PvmDataRaw ); 18. pvm_pkint(tab+1,5,2); 19. pvm_send(tids[i],msg_mstr); 20. } 21. pvm_exit(); 22. } W kolejnej pętli do co drugiego procesu (poczynając od tids[1]) wysyłanych jest pięć nieparzystych elementów tablicy tab (1,3,5,7,9). Proces slave odbiera wysłane do siebie elementy i wypisuje je na ekranie: Program slave.c 1. #include "def.h" 2. #include <stdio.h> 3. int main() 4. { 5. int i; 6. int tab[5]; 7. pvm_recv(-1,msg_mstr); 8. pvm_upkint( tab, 5, 1); 9. printf("slave: "); 10. for (i=0;i<5;i++) 11. { 12. printf("tab[%d]=%d ", i, tab[i]); 13. } 14. printf("\n"); 15. pvm_exit(); 16. } Zauważ, że w linijce 8-mej trzeci argument funkcji pvm_upkint wynosi 1. Chcemy wypakować wszystkie pięć przysłanych elementów, a nie tylko co drugi z nich. Należy teraz skompilować oba programy i umieścić pliki wykonywalne w odpowiednim katalogu: gcc master.c o master lpvm3 gcc slave.c o slave lpvm3 cp master slave $PVM_HOME
8 Następnie można je uruchomić za pomocą polecenia konsoli PVM spawn -> master. Wynik uruchomienia (dla czterech procesów typu slave) może wyglądać na przykład tak: pvm> spawn -> master [1] 1 successful t4000a pvm> [1:t4000a] EOF [1:t80005] Slave: tab[0]=0 tab[1]=2 tab[2]=4 tab[3]=6 tab[4]=8 [1:tc0005] Slave: tab[0]=1 tab[1]=3 tab[2]=5 tab[3]=7 tab[4]=9 [1:t100005] Slave: tab[0]=0 tab[1]=2 tab[2]=4 tab[3]=6 tab[4]=8 [1:t80005] EOF [1:t140006] Slave: tab[0]=1 tab[1]=3 tab[2]=5 tab[3]=7 tab[4]=9 [1:tc0005] EOF [1:t100005] EOF [1:t140006] EOF [1:t4000b] Slave: tab[0]=0 tab[1]=2 tab[2]=4 tab[3]=6 tab[4]=8 [1:t4000b] EOF [1] finished Po zakończeniu ćwiczenia nie zapomnij zatrzymać środowisko PVM za pomocą komendy konsoli halt. Poznane funkcje biblioteki PVM int bufid = pvm_initsend(int encoding) Jeśli użytkownik używa tylko jednego bufora, co jest najczęstszym przypadkiem, funkcja pvm_initsend jest jedyną potrzebną do zarządzania buforami. Funkcja ta czyści dotychczasowy bufor nadawczy i tworzy nowy dla kolejnego komunikatu. Zwracany jest identyfikator nowego bufora. Możliwe jest zdefiniowanie kodowania i dekodowania używanego przy przesyłaniu komunikatów pomiędzy potencjalnie heterogenicznymi węzłami. Możliwe są trzy warianty parametru encoding: PvmDataDefault: używana jest konwersja w standardzie XDR. Operacje te są nadmiarowe w przypadku wysyłania komunikatu na maszynę o takim samym formacie danych. PvmDataRaw: nie jest wykonywana żadna konwersja. Komunikat przesyłany jest w takiej samej postaci jak został umieszczony w buforze. Może to skutkować niewielką poprawą wydajności. Należy tej opcji używać wtedy, gdy posiada się pewność, że adresat wiadomości znajduje się na maszynie o identycznym formacie danych. PvmDataInPlace: przesyłane dane pozostają na miejscu w celu zmniejszenia narzutu czasowego spowodowanego kopiowaniem i konwersją danych. Bufor zawiera tylko rozmiar i wskaźnik do przesyłanych danych. Przy wywołaniu funkcji pvm_send dane pobierane są bezpośrednio z pamięci użytkownika. int errno = pvm_pkint(int &element, int no, int stride) int errno = pvm_upkint(int &element, int no, int stride)... Każda z powyżej wymienianych funkcji umieszcza w aktywnym buforze nadawczym tablicę wartości o określonym typie, bądź kopiuje tablicę z bufora do wskazywanego przez programistę obszaru pamięci. Należy zaznaczyć, że komunikat może się składać z wielu tablic różnego typu. Poniższa tabela przedstawia typ danych, odpowiadającą mu funkcję umieszczającą dane w buforze i wyczytujące je z niego.
9 Tabela 1 Funkcje do pakowania i wypakowywania danych z bufora komunikacyjnego Typ danych Funkcja pakująca Funkcja rozpakowująca byte pvm_pkbyte pvm_upkbyte complex pvm_pkcplx pvm_upkcplx double complex pvm_pkdcplx pvm_upkdcplx double pvm_pkdouble pvm_upkdouble float pvm_pkfloat pvm_upkfloat int pvm_pkint pvm_upkint long pvm_pklong pvm_upklong short pvm_pkshort pvm_upkshort string pvm_pkstr pvm_upkstr PVM dostarcza również funkcję pakującą używającą formatu funkcji printf do określenia typu umieszczanych w buforze danych. int info = pvm_send(int tid, int tag) int info = pvm_mcast(int *tids, int ntask, int msgtag) Funkcja pvm_send dodaje do danych w buforze nadawczym etykietę numeryczną tag i wysyła je do zadania z identyfikatorem tid. Różnica w przypadku polecenia pvm_mcast polega na tym, że po dodaniu etykiety komunikat wysłany zostaje do wszystkich zadań wyszczególnionych w tablicy tids. int bufid = pvm_recv(int tid, int msgtag) Jest to funkcja powodująca blokujący odbiór komunikatu, tzn. sterowanie wraca do procesu dopiero po umieszczeniu komunikatu w buforze odbiorczym. Możliwe jest filtrowanie odbieranych komunikatów według identyfikatora nadawcy tid i/lub etykiety msgtag. Wartość -1 oznacza wszystkie możliwe wartości. Odebrany komunikat znajduje się w nowoutworzonym aktywnym buforze odbiorczym. Poprzedni aktywny bufor odbiorczy jest zwalniany, chyba, że został zapamiętany poleceniem pvm_setrbuf. int tid = pvm_mytid(void) Funkcja ta zwraca identyfikator tid wywołującego ją procesu i może być wywoływana wielokrotnie. Przy czym przy pierwszym wywołaniu funkcja rejestruje proces w maszynie wirtualnej nadając mu unikalny identyfikator. int tid = pvm_parent (void) Funkcja pvm_parent zwraca tid procesu, który wywołał polecenie pvm_spawn uruchamiające proces wywołujący pvm_parent. Możliwe jest zwrócenie stałej PvmNoParent jeśli proces nie był utworzony poleceniem pvm_spawn. int info = pvm_bufinfo(int bufid, int *bytes, int *msgtag, int *tid) Funkcja pvm_bufinfo zwraca etykietę, identyfikator nadawcy i rozmiar w bajtach komunikatu znajdującego się w wyspecyfikowanym buforze odbiorczym. Funkcja ta jest pomoca przy określaniu pochodzenia komunikatu odebranego przy użyciu tzw. dzikiej karty (czyli któregoś z parametrów funkcji pvm_recv ustawionego na 1). Zadanie do samodzielnego wykonania W opisie funkcji biblioteki PVM zwróciłeś na pewno uwagę na dwie, których nie wykorzystywaliśmy dotąd w ćwiczeniu: pvm_mcast oraz pvm_parent. Samodzielnie wskaż miejsca, gdzie w napisanym przez nas programie można wykorzystać te funkcje. Zmodyfikuj oba programy (zarówno slave jak i master) oraz skompiluj je i uruchom. Gotowe przykłady demonstrujące rozwiązanie znajdują się wśród materiałów kursu, ale nie zaglądaj do nich, dopóki samemu nie wykonasz tego zadania.
10 Wreszcie, w celu uzyskania większego obycia z biblioteką PVM, poeksperymentuj z możliwością filtrowania wiadomości podczas odbioru, ustawiając odpowiednio parametry (filtry) określającego możliwych nadawców i możliwy typ odbieranych komunikatów. Podsumowanie W wyniku tego ćwiczenia stworzyłeś pierwszą aplikację, której poszczególne elementy komunikowały się między sobą za pomocą środowiska PVM. Co powinieneś wiedzieć: W jaki sposób następuje utworzenie i wysłanie komunikatów za pomocą funkcji bibliotecznych PVM (pvm_initsend, pvm_pkint, pvm_pkstr, pvm_send) Jakie funkcje biblioteczne służą do blokującego odbierania komunikatów (pvm_recv) i wyciągania ich zawartości (pvm_upkint, pvm_upkstr). Co to są i jaką pełnią funkcję znaczniki wiadomości (drugi parametr funkcji pvm_send oraz pvm_recv) W jaki sposób pobierać informację o własnym identyfikatorze zadania (pvm_mytid) oraz identyfikatorze zadania ojca (pvm_parent)
Zegary logiczne. Zakres ćwiczenia. Problem rozbieżności czasów. Koncepcja programu. Przygotowanie programu
Zegary logiczne Zakres ćwiczenia W obecnym ćwiczeniu nie zostaną wprowadzone żadne nowe funkcje biblioteki PVM. Zobaczysz za to program demonstrujący zagrożenia niesione przez używanie zegarów fizycznych
Mechanizmy komunikacji grupowej w bibliotece PVM
Mechanizmy komunikacji grupowej w bibliotece PVM Zakres ćwiczenia Celem ćwiczenia jest demonstracja funkcji komunikacji grupowej dostępnych w bibliotece PVM, a także zrozumienie konieczności mechanizmów
r 2r Rysunek 1 Koło wpisane w kwadrat
Obliczanie liczby π metodą Monte-Carlo Zakres ćwiczenia Ćwiczenie obecne podzielone jest na dwie części. Celem pierwszej części ćwiczenia podniesienie umiejętności w zakresie stosowania dotąd nabytej wiedzy.
Środowiska przetwarzania rozproszonego
Środowiska przetwarzania rozproszonego 1 Parallel Virtual Machine PVM (ang. Parallel Virtual Machine) powstał w 1989 roku w Oak Ridge National Laboratory, w celu ułatwienia programowania równoległego w
Łamanie haseł. Zakres ćwiczenia. Przedstawienie problemu. Zadanie do samodzielnego wykonania
Łamanie haseł Zakres ćwiczenia Celem ćwiczenia jest podniesienie umiejętności w zakresie stosowania dotąd nabytej wiedzy. Poznasz kilka nowych funkcji biblioteki PVM oraz napiszesz samodzielnie program,
Zaawansowane operacje grupowe
Zaawansowane operacje grupowe Zakres ćwiczenia Celem ćwiczenia jest zapoznanie się z zaawansowanymi funkcjami biblioteki PVM wspierającymi tworzenie aplikacji rozproszonych. Przedstawienie problemu W tworzeniu
Detekcja zakończenia i obraz stanu globalnego
Detekcja zakończenia i obraz stanu globalnego Zakres ćwiczenia Celem ćwiczenia jest utrwalenie umiejętności zdobytych w czasie poprzednich zajęć oraz zwiększenie znajomości funkcji biblioteki PVM. Przedstawienie
WWW. http://www.netlib.org/pvm3/book/pvm-book.html. http://www.netlib.org/pvm3/index.html. http://www.netlib.org/pvm3/pvm3.4.5.tgz
WWW http://www.netlib.org/pvm3/book/pvm-book.html http://www.netlib.org/pvm3/index.html http://www.netlib.org/pvm3/pvm3.4.5.tgz PVM p. 1 instalowanie 1. Sprowadzić: http://www.netlib.org/pvm3/pvm3.4.5.tgz
Pierwsze kroki w środowisku PVM
Pierwsze kroki w środowisku PVM Zakres ćwiczenia W tym ćwiczeniu dowiesz się, w jaki sposób utworzyć maszynę wirtualną, jak napisać swój pierwszy program wykorzystujący środowisko PVM i jak taki program
Aplikacja Sieciowa wątki po stronie klienta
Aplikacja Sieciowa wątki po stronie klienta Na ostatnich zajęciach zajmowaliśmy się komunikacją pomiędzy klientem a serwerem. Wynikiem naszej pracy był program klienta, który za pomocą serwera mógł się
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Wstęp do Programowania, laboratorium 02
Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite
Parallel Virtual Machine
Parallel Virtual Machine Co to jest? Konfigurowanie maszyny wirtualnej Tworzenie procesów Buforowanie danych Przesyłanie danych Operacje na grupach procesów Komunikacja kolektywna Przykład 1 Pakiet PVM
Tablice, funkcje - wprowadzenie
Tablice, funkcje - wprowadzenie Przemysław Gawroński D-10, p. 234 Wykład 5 25 marca 2019 (Wykład 5) Tablice, funkcje - wprowadzenie 25 marca 2019 1 / 12 Outline 1 Tablice jednowymiarowe 2 Funkcje (Wykład
RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )
III RPC Zdalne wywoływanie procedur (ang. Remote Procedure Calls ) 1. Koncepcja Aplikacja wywołanie procedury parametry wyniki wykonanie procedury wynik komputer klienta komputer serwera Zaletą takiego
Wskaźniki w C. Anna Gogolińska
Wskaźniki w C Anna Gogolińska Zmienne Zmienną w C można traktować jako obszar w pamięci etykietowany nazwą zmiennej i zawierający jej wartość. Przykład: kod graficznie int a; a a = 3; a 3 Wskaźniki Wskaźnik
Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40
Programowanie w C++ Wykład 5 Katarzyna Grzelak 26 marca 2018 9 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40 Pojęcia z poprzedniego wykładu Podział programu na funkcje podział na niezależne
Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
Część 4 życie programu
1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część
ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje
Funkcje (podprogramy) Mianem funkcji określa się fragment kodu, który może być wykonywany wielokrotnie z różnych miejsc programu. Ogólny zapis: typ nazwa(argumenty) ciało funkcji typ określa typ danych
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Języki i metodyka programowania. Wprowadzenie do języka C
Literatura: Brian W. Kernighan, Dennis M. Ritchie Język Ansi C, Wydawnictwa Naukowo - Techniczne, 2007 http://cm.bell-labs.com/cm/cs/cbook/index.html Scott E. Gimpel, Clovis L. Tondo Język Ansi C. Ćwiczenia
Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1
Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Biblioteka standardowa - operacje wejścia/wyjścia
Biblioteka standardowa - operacje wejścia/wyjścia Przemysław Gawroński D-10, p. 234 Wykład 6 15 stycznia 2019 (Wykład 6) Biblioteka standardowa - operacje wejścia/wyjścia 15 stycznia 2019 1 / 14 Outline
Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:
Ćwiczenie nr 6 Temat: Operacje na łańcuchach znaków. Zagadnienia: Zasady pracy z łańcuchami tekstowymi (tablice wartości typu char). funkcje standardowe operacji na łańcuchach, funkcje I/O dla operacji
Wywoływanie procedur zdalnych
Mechanizm wywołania Wywoływanie procedur zdalnych main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) int zabij_proces (int pid){ int stat; stat = kill(pid,
76.Struktura oprogramowania rozproszonego.
76.Struktura oprogramowania rozproszonego. NajwaŜniejsze aspekty obiektowego programowania rozproszonego to: Współdziałanie (interoperability) modułów programowych na róŝnych maszynach. Wielokrotne wykorzystanie
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy Laboratorium 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Komentarze Funkcja printf() Zmienne Łańcuchy
Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1
Programowanie w modelu przesyłania komunikatów specyfikacja MPI Krzysztof Banaś Obliczenia równoległe 1 Model przesyłania komunikatów Paradygmat send receive wysyłanie komunikatu: send( cel, identyfikator_komunikatu,
Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.
Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Wywoływanie procedur zdalnych
Wywoływanie procedur zdalnych Mechanizm wywołania main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) }... int zabij_proces (int pid){ int stat; stat
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Podstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:
5. Model komunikujących się procesów, komunikaty
Jędrzej Ułasiewicz str. 1 5. Model komunikujących się procesów, komunikaty Obecnie stosuje się następujące modele przetwarzania: Model procesów i komunikatów Model procesów komunikujących się poprzez pamięć
Tryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla
Tryby komunikacji między procesami w standardzie Message Passing Interface Piotr Stasiak 171011 Krzysztof Materla 171065 Wstęp MPI to standard przesyłania wiadomości (komunikatów) pomiędzy procesami programów
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).
Zarządzanie pamięcią Pamięć: stos i sterta Statyczny i dynamiczny przydział pamięci Funkcje ANSI C do zarządzania pamięcią Przykłady: Dynamiczna tablica jednowymiarowa Dynamiczna tablica dwuwymiarowa 154
Wywoływanie procedur zdalnych
Mechanizm wywołania Wywoływanie procedur zdalnych main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) }... int zabij_proces (int pid){ int stat; stat
ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje
Funkcje (podprogramy) Mianem funkcji określa się fragment kodu, który może być wykonywany wielokrotnie z różnych miejsc programu. Ogólny zapis: typ nazwa(argumenty) ciało funkcji typ określa typ danych
Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:
Program 6 Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje: Funkcja pobierz_osobe wczytuje dane osoby podanej jako argument. Funkcja wypisz_osobe
Podstawy technologii WWW
Podstawy technologii WWW Ćwiczenie 14 AJAX, czyli jak odświeżyć bez odświeżania, część trzecia Na dzisiejszych zajęciach będziemy kontynuować realizację serwisu do wymiany wiadomości z wykorzystaniem technologii
61 Topologie wirtualne
61 Topologie wirtualne pozwalają opisać dystrybucję procesów w przestrzeni z uwzględnieniem struktury komunikowania się procesów aplikacji między sobą, umożliwiają łatwą odpowiedź na pytanie: kto jest
Wprowadzenie do języka Java
WSNHiD, Programowanie 2 Lab. 1 [ część 1 ] Wprowadzenie do języka Java Wprowadzenie Język programowania Java jest obiektowym językiem programowania. Powstał w 1995 i od tej pory był intensywnie rozwijany.
2 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 2 1/7 Język C Instrukcja laboratoryjna Temat: Wprowadzenie do języka C 2 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do języka C. Język C jest językiem programowania ogólnego zastosowania
Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego
Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego 1 /24 Pisanie pojedynczych znaków z klawiatury do pliku #include void main(void) { FILE *fptr; // wkaznik do pliku, tzw. uchwyt
Argumenty wywołania programu, operacje na plikach
Temat zajęć: Argumenty wywołania programu, operacje na plikach Autor: mgr inż. Sławomir Samolej Zagadnienie 1. (Zmienne statyczne) W języku C można decydować o sposobie przechowywania zmiennych. Decydują
INFORMATYKA Studia Niestacjonarne Elektrotechnika
INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl
Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH
Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Ćwiczenie 1 Podstawy Wprowadzenie do programowania w języku C Kraków 2010 Twój pierwszy program w C Program w języku C, jak i w wielu innych językach
Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.
Laboratorium Podstaw Informatyki Strona 1 Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Ćwiczenie 4 Obsługa plików Kraków 2010 Laboratorium Podstaw Informatyki Strona 2 Obsługa plików Zanim
PVM Parallel Virtual Machine
PVM Parallel Virtual Machine Sławomir civic Białek 22 września 2002 roku Czym jest PVM? PVM Parallel Virtual Machine jest rozwiązaniem pozwalającym wykorzystać heterogeniczny kluster
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
PHP: bloki kodu, tablice, obiekty i formularze
1 PHP: bloki kodu, tablice, obiekty i formularze SYSTEMY SIECIOWE Michał Simiński 2 Bloki kodu Blok if-else Switch Pętle Funkcje Blok if-else 3 W PHP blok if i blok if-else wyglądają tak samo i funkcjonują
/*W tym miejscu funkcja system wywołuje systemową komendę PAUSE tj.czeka tak długo, aż zostanie wciśnięty dowolny znak z
Języki i metodyka Programowania Zajęcia 1. 1. Spróbujmy uruchomić pierwszy program. Otwórzmy okno dosowe (polecenie cmd) i po przejściu do katalogu projektu uruchamiamy z linii poleceń nasz program wielokrotnie.
Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji
Podstawy informatyki Informatyka stosowana - studia niestacjonarne - Zajęcia nr 5 Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą
Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady
Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4 Dr inż. Dariusz JĘDRZEJCZYK Wskaźniki Dynamiczna alokacja pamięci Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Wskaźnik to
Podstawy programowania komputerów
Podstawy programowania komputerów Wykład 10: Sterowanie pamięcią w C Pamięć na stosie!każdy program napisany w języku C ma dostęp do dwóch obszarów pamięci - stosu i sterty, w których może być przechowywana
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji
IPC: Kolejki komunikatów
IPC: Kolejki komunikatów Systemy Operacyjne 2 laboratorium Mateusz Hołenko 7 listopada 2011 Plan zajęć 1 Mechanizmy IPC kolejki komunikatów pamięć współdzielona semafory 2 Kolejki komunikatów kolejka komunikat
Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17
Wskaźniki Przemysław Gawroński D-10, p. 234 Wykład 2 8 marca 2019 (Wykład 2) Wskaźniki 8 marca 2019 1 / 17 Outline 1 Wskaźniki 2 Tablice a wskaźniki 3 Dynamiczna alokacja pamięci (Wykład 2) Wskaźniki 8
Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest
Pętle Pętla to pewien fragment kodu, który jest wykonywany wielokrotnie. Wyobraź sobie taką sytuację. Piszesz program do szyfrowania danych. Dane są szyfrowane kolejno bajt po bajcie. Załóżmy, że plik
Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.
Typy, operatory, wyrażenia. Wejście i wyjście. Typy, operatory, wyrażenia Zmienna: [] [ '[' ']' ] ['=' ]; Zmienna to fragment pamięci o określonym
Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1
Tablice i struktury czyli złożone typy danych. Programowanie Proceduralne 1 Tablica przechowuje elementy tego samego typu struktura jednorodna, homogeniczna Elementy identyfikowane liczbami (indeksem).
KURS C/C++ WYKŁAD 6. Wskaźniki
Wskaźniki KURS C/C++ WYKŁAD 6 Każda zmienna ma unikalny adres wskazujący początkowy obszar pamięci zajmowany przez tą zmienną. Ilość pamięci zajmowanej przez zmienną zależy od typu zmiennej. Adres można
Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.
Wykład 3 ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors. Waldi Ravens J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 75 / 146 deklaracje zmiennych instrukcja podstawienia
Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1 Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie
// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.
Wykład 10 Przykłady różnych funkcji (cd) - przetwarzanie tablicy tablic (tablicy "dwuwymiarowej") - sortowanie przez "selekcję" Dynamiczna alokacja pamięci 1 // Liczy srednie w wierszach i kolumnach tablicy
TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;
Ogólna postać definicji tablicy: TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ; np. int tablica [ 10 ]; // 10-cio elementowa tablica liczb całkowitych char tekst
Programowanie obiektowe
Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć
Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach
Laboratorium Systemów Operacyjnych Ćwiczenie 4. Operacje na plikach Wykonanie operacji wymaga wskazania pliku, na którym operacja ma zostać wykonana. Plik w systemie LINUX identyfikowany jest przez nazwę,
Wskaźniki. Informatyka
Materiały Wskaźniki Informatyka Wskaźnik z punktu widzenia programisty jest grupą komórek pamięci (rozmiar wskaźnika zależy od architektury procesora, najczęściej są to dwa lub cztery bajty ), które mogą
Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR
Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR Zadanie polega na napisaniu pierwszego programu w języku C, jego poprawnej kompilacji i wgraniu na mikrokontroler. W tym celu należy zapoznać
external Data Representation
Remote Procedure Call external Data Representation Opis standardu RFC 1014 Kanoniczna reprezentacja danych oparta na formacie IEEE Deklaratywny język opisu struktur danych (zbliżony do języka C) Koncepcja
utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,
Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz
Stałe, tablice dynamiczne i wielowymiarowe
Stałe, tablice dynamiczne i wielowymiarowe tylko do odczytu STAŁE - CONST tablice: const int dni_miesiaca[12]=31,28,31,30,31,30,31,31,30,31,30,31; const słowo kluczowe const sprawia, że wartość zmiennej
Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013
Laboratorium Podstaw Informatyki Strona 1 Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Obsługa plików Kraków 2013 Laboratorium Podstaw Informatyki Strona 2 Obsługa plików Zanim będziemy mogli
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy Laboratorium 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Dyrektywy preprocesora #include #define Interakcja
Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej
Podstawy informatyki Informatyka stosowana - studia niestacjonarne Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie, rok
Jak napisać program obliczający pola powierzchni różnych figur płaskich?
Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy
Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.
Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Wskaźnik do pliku Dostęp do pliku: zapis, odczyt,
Programowanie strukturalne i obiektowe. Funkcje
Funkcje Często w programach spotykamy się z sytuacją, kiedy chcemy wykonać określoną czynność kilka razy np. dodać dwie liczby w trzech miejscach w programie. Oczywiście moglibyśmy to zrobić pisząc trzy
Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.
Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy Wykład 4 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Tablice Wskaźniki Adresy pamięci Operator adresu
Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady
Pętle i tablice. Spotkanie 3 Dr inż. Dariusz JĘDRZEJCZYK Pętle: for, while, do while Tablice Przykłady 11/26/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Pętla w największym uproszczeniu służy
5 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 5 1/6 Język C Instrukcja laboratoryjna Temat: Funkcje, parametry linii poleceń, typ wyliczeniowy. 5 Przygotował: mgr inż. Maciej Lasota 1) Parametry linii poleceń. Język C oprócz wprowadzania
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Stałe i zmienne znakowe. Stała znakowa: znak
Stałe i zmienne znakowe. Stała znakowa: znak Na przykład: a, 1, 0 c Każdy znak jest reprezentowany w pamięci przez swój kod. Kody alfanumerycznych znaków ASCII to liczby z przedziału [32, 127]. Liczby
tablica: dane_liczbowe
TABLICE W JĘZYKU C/C++ tablica: dane_liczbowe float dane_liczbowe[5]; dane_liczbowe[0]=12.5; dane_liczbowe[1]=-0.2; dane_liczbowe[2]= 8.0;... 12.5-0.2 8.0...... 0 1 2 3 4 indeksy/numery elementów Tablica
int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania
Rok akademicki 2013/2014, Pracownia nr 10 2/20 Informatyka 1 Tablica elementów ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu Politechnika Białostocka - Wydział Elektryczny Elektrotechnika,
Funkcja (podprogram) void
Funkcje Co to jest funkcja? Budowa funkcji Deklaracja, definicja i wywołanie funkcji Przykłady funkcji definiowanych przez programistę Przekazywanie argumentów do funkcji Tablica jako argument funkcji
Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski
Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski 7 kwietnia 2014 1. Wprowadzenie Pierwsza część instrukcji zawiera informacje
Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.
Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411b Plan wykładu Operacje wejścia-wyjścia Dostęp do plików Struktury
7. Pętle for. Przykłady
. Pętle for Przykłady.1. Bez użycia pętli while ani rekurencji, napisz program, który wypisze na ekran kolejne liczby naturalne od 0 do pewnego danego n. 5 int n; 6 cin >> n; 8 for (int i = 0; i
Język C zajęcia nr 11. Funkcje
Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji
Podstawy programowania
Podstawy programowania I rok Automatyka i Robotyka Eka PWr Ćwiczenia Zestaw 4 Zakres materiału Analiza poprawności konstrukcji, wyliczanie wyrażeń z wskaźnikami i tablicami, ręczna symulacja, opracowywanie
Języki programowania obiektowego Nieobiektowe elementy języka C++
Języki programowania obiektowego Nieobiektowe elementy języka C++ Roman Simiński roman.siminski@us.edu.pl www.programowanie.siminskionline.pl Przetwarzanie tablic znaków Łańcuchy znakowe jako tablice znaków
Podział programu na moduły
Materiały Podział programu na moduły Informatyka Szczegółowe informacje dotyczące wymagań odnośnie podziału na moduły: http://www.cs.put.poznan.pl/wcomplak/bfiles/c_w_5.pdf Podział programu na moduły pozwala