szinkron: "Vissza? Soha!"
http://www.imdb.com/title/tt1217613/
Battle Los Angeles
Választott címünk arra utal, hogy ha már felvettük a "válogatott képzést", akkor ne adjuk le, sőt teljesítsük sikerrel! Ez az első labor posztja, ahol
- beszedjük az első hallgatói laborkártyát
- megnézzük a gcc használata parancssorból
- a forráskód indentálását
- a manuál lapok használatát
- egy forrást kipróbálunk a PP 25-31. oldal példái közül (letöltés, kipróbálás, megbeszélés)
a második laboron:
- karakterhegyezés (lásd majd alább)
- PP 41.
- Beárazzuk a 2. labort, elmélet 55-63.
[norbert@matrica ~]$ svn co svn://hallg.inf.unideb.hu:2005 elso
A elso/bevezetes
A elso/bevezetes/elsoOpenMP
A elso/bevezetes/elsoOpenMP/pmandel
A elso/bevezetes/elsoOpenMP/pmandel/mandelpngt.c++
A elso/bevezetes/elsoOpenMP/pmandel/pmandelpngt.c++
A elso/bevezetes/elsoOpenMP/pmandel/ompmandelpngt.c++
A elso/bevezetes/C[norbert@matrica ~]$ cd elso/bevezetes/elsoC
Ki celebrálja a szóhossz.c-t?
[norbert@matrica elsoC]$ ls -l
total 12
-rw-rw-r--. 1 norbert norbert 194 Feb 15 11:31 atlag.c
-rw-rw-r--. 1 norbert norbert 223 Feb 15 11:31 rszamok.c
-rw-rw-r--. 1 norbert norbert 214 Feb 15 11:31 szohossz.c
[norbert@matrica elsoC]$ gcc szohossz.c -o szohossz
[norbert@matrica elsoC]$ ./szohossz
Trófeák
Az előadáson megjelentektől fogadom csak el az alábbiakat:
- tetsz./1 trófea: Levénez-féle idővonal (lásd. a megfelelő "robbanó" fóliát)
- 3/1 trófea: lex-es szó, szám, sor, betű számláló (ugyancsak lásd. a megfelelő "robbanó" fóliát)
Labortrófeák
- laboron 3/1 Írj C-ben két végtelen ciklust: az egyik alig használja a procit, a másik pörgesse, ahogy belefér (1. alkalom, feb. 13-i hét)
- laboron 3/1 A lenti "Karakterhegyezés" pont két ellenőrző kérdése (2. alkalom, feb. 20-i hét)
Egyéb trófeák
- 3/1 trófea: egy Qt-s példa felélesztése, kipróbálása a Qt SDK-ból
- 3/1 trófea: egy Qt-s példa felélesztése, kipróbálása parancssorból
- tetsz./1 trófea: a kommentben szereplő videó otthoni saját elkészítése, jó hanggal :) (ezt lehet halmozni, azaz amennyit elkészítesz, annyiszor 1 trófea, YouTube-ra kérem)
- 2/5 trófea: nehéz feladat, hogy kicsit nyújtsuk a mezőnyt :) De ne ess pánikba: megoldása jóval megelőzi a kurzus normál haladási sebességét, a main stream-ben, azaz a "tömegnek" majd a 6. előadásban jön: a szálakat is használó Qt-s példák valamelyikében az osztályok kommunikációját írd át a "callback" helyett a Qt slot-signal mechanizmusára. Ez a feladat teljesen önálló OO tervezést feltételez! Ha kezdő vagy Qt-ben: itt a slot-signal (157. o.) pl. vagy megtalálod a könyvtárban.
- 10/2.5 trófea: legyen egy kisebb ugrás is: a 3. előadás 03-15glibc-s "printf meghekkelése", ez remek móka és tanulságos, ezért 10-et fogadok el, s +1 pont, ha van YouTube-os bemutató videó
A megoldásokat a blogon kommentként kérem megmutatni, screenshot+forrás formában tipikusan. Ha külön nem mondjuk, mindig az első hármat fogadjuk el. A saját trófeák nyilvántartását minden kapcsolódó hallgató önmaga végzi. Ha saját (mikor, mire, mennyit) kimutatása nem egyezik a blogon lévő (csakis összpontszámával), akkor két hetes ablakon belül a saját kimutatása elküldésével jelzi ezt nekem.
Blogoljunk!
Szórakoztatásodra a tavalyi posztokból összevágok egy kis montázst. Íme, élvezzük:
Az első kisbajnokság
Futtassuk a PP 27. oldalának for(;;); végtelen ciklusát "vegtelen" néven és ennek
for(;;)
módosítását "vegtelen2" néven. Majd egy ps axu|grep vegt parancs 3. (CPU) oszlopát hasonlítsuk össze és világítsuk meg a helyzetet a man 3 sleep alapján!
sleep(1);
A laborkártya kipróbálása, például a karakterhegyezés
Forrás celebrálása
Ellenőrző kérdések
- Mi történik, ha a saját függvényt a valódi könyvtári #include <string.h> / strncpy-al helyettesíted? A válaszod ellenőrzéséhez a forrás elejére illeszd be a #include <string.h> sort, illetve a string_masolo_man_pl_alapjan függvény két hívásánál ezt a nevet egyszerűen írd át strncpy-ra, az aktuális paraméterlistához nem is nyúlva.
- Mi történik, ha a string_masolo_man_pl_alapjan saját függvényed implementációjában az első ciklusban felcseréled a dest[i] = src[i]; sort a src[i] = dest[i]; új sorral? Tehát, ha ez van a forrásodban:
for (i = 0; i < n && src[i] != '\0'; i++)
A konklúzió: mivel a string_masolo_man_pl_alapjan függvényünk első ciklusából mindkét hívásunk alkalmával az i < n feltétel meghiúsulása miatt lépünk ki, így a \0 karakter sztring után írása (azaz a karekterlánc lezárása) egyik esetben sem következik be. Ez tudjuk jól elkapni a 2. hívásnál, mert amikor a printf írja ki az eredményt, akkor ő egy \0 karakterig ír és az előző hívásból ott "maradt" a betűt is kiírja.
//dest[i] = src[i];
src[i] = dest[i
Módosítgassuk az első előadásban felvillantott, az strncpy könyvtári függvény manuáljabeli példa alapján megírt implementációnkat, hogy a forrásban kezdjen úgy kinézni néhány sor, mint amilyenek a C programok szoktak lenni!
Például az Androidos telefonok Linux kernelében előfordul ilyesmi: *src++? Lássuk, hozzuk le a forrást:
[norbi@sgu Android]$ git clone git://android.git.kernel.org/kernel/common.git
s keressük benne az említett mintát:
[norbi@sgu Android]$ find . -name '*'|xargs grep "*src++"|wc
nem vitás, a profik is írnak ilyeneket, esetleg pillantsunk is bele a common/include/linux/fb.h forrásába, 1026. sor.
174 804 10699
Második kisbajnokság
Nyeri, aki a fenti string_masolo_man_pl_alapjan függvényt rövidebben megírja egy kommentben, február 26-ig. A hossz a függvény testének nyitózárójelétől a bezáróig, őket nem beleértve a felhasznált nem szóköz betűk száma. Így az enyém most 75:
int i;
char *p = d;
for (i = 0; i < n && (*d++ = *s++); i++)
;
for (; i < n; i++)
p[i] = '\0';
return p
A szappanoperák nyelve
A szappanoperák nyelve nem a C. Mert bár Javában már lehet olyan programokat írni/olvasni a kislámpánál, amik felérnek egy korlátozott szókincsű regény olvasgatásával, ez azért C-ben nem megy. Ám egy-két sort megpróbálhatunk szépen olvasni. Erre mutat egy példát az a laborkártya, ami az alábbi két utasítás összehasonlítását írja elő.
Forráskódok celebrálása
I.)
if(signal(SIGINT, utolso_tennivalo) == SIG_IGN)
II.)
signal(SIGINT, SIG_IGN
if(signal(SIGINT, SIG_IGN) != SIG_IGN)
signal(SIGINT, utolso_tennivalo);
Ez a laborkártya nem könnyű annak, aki most ismerkedik a programozással. Leginkább őket segíti a jelen poszt, mely alábbi „webcast”-ja a PP egy olyan példájának a kipróbálását mutatja, amiben szerepel az egyik kérdéses kódcsipet. (Ne hagyjuk magunkat azzal megrémiszteni, hogy a signal() egy rendszerhívás, a mi szintünkön rendszerhívás vagy könyvtári függvény, akár saját programbeli hello() függvény: egyelőre egyre megy. De a haladóknak sincs okuk az aggodalomra, a 4. előadásban írunk saját rendszerhívást és saját glibc könyvári függvényt is.)
A videó feldolgozása után annyi a hallgató feladata, hogy értelmezi a II. kódcsipetet.
Harmadik kisbajnokság
Itt az első három kommentben érkezett helyes választ adó viszi el a kisbajnokságot.
A következő kis progi (hátterét lásd majd a 2. előadásban) kapcsán kell helyesen megválaszolni ezt a két kérdést:
- ki a szülő folyamat szülője
- mi lesz a gyermek folyamat
ha futtatod ezt a programot?
Lásd PP 36! Ez a téma már elővetíti a 2. előadást, amelybe szerintem bele tudunk majd kezdeni szerdán.