niedziela, 13 stycznia 2008

Tajemniczy kod

Michał usłyszał stukot szpilek Dusi. Dusia przyniosła kubek gorącej herbaty. Michał spojrzał na nią. Miała na sobie czarną satynową suknię przepasaną czarnym pasem. Długi jasny warkocz spoczywał na jej piersiach. Spuścił wzrok z niej. Dusia postawiła kubek obok monitora. I usiadła obok Michała
--- Przyniosłam Ci herbatę
--- Dziękuję bardzo miła Dusiu.
Michał przypomniał że że obiecał jej że będzie uczył ją programowania. Uruchomił Carbide.c++
--- Dusiu możemy zacząć?
--- Dobrze, niech Ci będzie, aczkolwiek wolałabym poplotkować z Tobą.
--- O Dodzie? - zdziwiony -- Myślę że ciekawsze były czasy przed wojną, gdy było coś takiego jak burleska.
--- Michał wiem, że lubisz historię, ale nie wiem co to burleska.
--- Teraz to można by nazwać erotyczną sztuką teatralną.
Dusia  zarumieniła  się.
--- Miałeś mi wyjaśnić ten kod który robił to  niebieskie  okienko.
--- Świetnie Dusiu. już Ci wyjaśniam
Michał otworzył projekt Witaj
--- Dusiu Carbide.c++ wygenerował nam kod w języku programowania  C++ ,  ale przy tej okazji  wygenerował nam  sporo  plików.  Najważniejsze  to są  pliki  Witaj.h, Witaj.cpp   oraz pliki specyficzne dla Symbiana bld.inf, Witaj.mmp, ABLD.bat, Witaj_EKA2.pkg
--- Widzę że jest sporo tych plików. A do czego one są?
--- W języku C++ są tak zwane pliki nagłówkowe. One  zawierają  deklaracje  co  będzie  w  kodzie  źródłowym. Właściwy kod w języku C++ jest w pliku Witaj.cpp. Ale zanim kod zostanie zamieniony w postać zrozumiałą dla systemu operacyjnego Symbian trzeba przygotować plik bld.inf Ten plik zawiera informacje o tym jak zamienić kod w jeżyku C++ do postaci pliku wykonywalnego najczęściej  z  rozszerzeniem  *.exe Plik bld.inf wymaga też pliku konfiguracyjnego który poinformuje z jakich bibliotek Symbiana na korzystać nasz programik. Tym plikiem jest plik Witaj.mmp. Dwa ostatne pliki są potrzebne Carbide.c++ żeby uruchomił emulator czy przygotował pliki *.sis do wysłania na komórkę.
--- Ale mnie to przytłacza Michale
--- Na początku każdego to przytłacza Dusiu. W miarę upływu czasu wszystko stanie się zrozumiałe.
--- Wierze jednak że mnie tego nauczysz Michale.
--- Na początku nauki trzymaj się zasady "Wierzę w to aby zrozumieć" a jak się nauczysz będziesz mogła hołdować zasadzie "Trzeba zrozumieć aby uwierzyć" powiedział z filozoficzną nutka w głosie
--- Ty na wszystko masz odpowiedz - odpowiedziała z zazdrością
--- Więc zobaczymy co mamy w pliku Witaj.h


#ifndef __WITAJ_H__
#define __WITAJ_H__


//  Include Files

#include <e32base.h>


//  Function Prototypes

GLDEF_C TInt E32Main();


#endif  // __WITAJ_H__


--- Wygląda tajemniczo Michale
--- Tak naprawdę zadaniem plików nagłówkowych jest informowanie co ma być w kodzie i jakie inne pliki nagłówkowe maja być załadowane. Program który czyta pliki nagłówkowe *.h  i kod źródłowy w plikach *.cpp aby zamienić to na postać zrozumiałą nazywa się kompilatorem. Program Carbide.c++ wie jak wywołać kompilator więc w tej chwili wiedza na temat tego jak działa kompilator nie jest konieczna. W tym kodzie najważniejsze dla nas jest funkcja GLDEF_C TInt E32Main(); do której kod zobaczymy w pliku Witaj.cpp. To informuje że program jak zacznie pracę to musi naipierw wywołać tą funkcję E32Main();
--- A co to jest funkcja?
--- Dla ciebie wystarczy żebyś wiedziała że to jest takie polecenie które ma wykonać program. Programista może tworzyć wiele róznych funkcji w programie czyli tak naprawdę tworzy różnego rodzaju polecenia. Niektóre polecenia są jakby narzucone nam i my musimy stosować takie nazwy funkcji
--- Czyli w tym pliku deklarujemy polecenia jakie będziemy uzywać?
--- Brawo że załapałaś zauważ ze mamy też #include <e32base.h> to oznacza że będziemy też używać funkcji i poleceń jakie są w pliku e32base.h.
--- A gdzie jest ten plik?
--- Dusiu nie martw się Carbide.c++ wie gdzie ten plik jest. A tak poważnie on jest na dysku E:\Symbian\9.1\S60_3rd_MR\Epoc32\include\e32base.h.
--- Michale napij się mojej herbatki - rzekła zalotnie     
Michał z uśmiechem pije herbatkę z kubka. Po wypiciu pocałował Dusię w policzek.
--- Dziękuję za smaczną herbatkę malinową.
--- A teraz mi pokażesz ten drugi kod?
--- Plik Witaj.cpp będzie jeszcze bardziej tajemniczy, więc omówimy go kawałku oto pierwszy kawałek - tajemniczo spojrzał na Dusię

//  Include Files 

#include "Witaj.h"
#include <e32base.h>
#include <e32std.h>
#include <e32cons.h>            // Console


//  Constants

_LIT(KTextConsoleTitle, "Console");
_LIT(KTextFailed, " failed, leave code = %d");
_LIT(KTextPressAnyKey, " [press any key]\n");


//  Global Variables

LOCAL_D CConsoleBase* console;  // write all messages to this


--- Rzeczywiście programiści powariowali pisząc coś takiego. Jak to można normalnie czytać? - powiedziała z żalem
--- Nie dziw się Dusiu. Kiedyś kapłani i skrybowie w starożytnym Egipcie umieli pisać i czytać hieroglify. Dzisiaj tylko garstka naukowców. Podobnie jest z programowaniem dzisiaj tylko twórcy systemu Symbian i Ci którzy tworzą oprogramowanie do tego systemu. A miliony ludzi nie zna się na tym, pomimo że używają komórek.
--- Masz rację. Jak to poznam to będę wyjątkowa dzięki Tobie Michale.
--- Jak widzisz kod w Witaj.cpp jest długi ale bardzo charakterystyczny. Najpierw trzeba wskazać pliki nagłówkowe które informują z czego będziemy korzystać. widać w tym też nasz Witaj.h  Potem mamy coś charakterystycznego dla Symbiana sposób w jaki używa sie tekstu. To jest taka funkcja _LIT() jej zadaniem jest przypisywanie zmiennej do jakiegoś ciągu znaków.
--- Co to jest zmienna?
--- Jak sama nazwa wskazuje jest to coś co możesz zmieniać.  ---  roześmiał  się  ---  a tak  poważnie zmienna to jest coś co możesz przechować w pamięci podczas działania programu.
--- No tak mamy wiedzieć jak to się zmienia?
--- Oczywiście   Widzisz coś takiego CConsoleBase* console; , to informuje o tym że załadowałaś do pamięci zmienną o nazwie console która zawiera w sobie polecena typu CConsoleBase. Typ CConsoleBase to jest informacja dla programu z czym zmienną console ma kojarzyć.
--- Och czy te typy są podejrzane? - spytała się przestraszona
--- Nie bój się Dusiu. My programiści mówimy typ w kontekście  takim  jakiego  rodzaju  ma być informacja.
--- To już jestem spokojna o te typy.
--- Cieszę się, pokażę Ci dalszy kod.

//  Local Functions

LOCAL_C void MainL()
    {
    //
    // add your program code here, example code below
    //
    console->Write(_L("Hello, world!\n"));
    }


LOCAL_C void DoStartL()
    {
    // Create active scheduler (to run active objects)
    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
    CleanupStack::PushL(scheduler);
    CActiveScheduler::Install(scheduler);

    MainL();

    // Delete active scheduler
    CleanupStack::PopAndDestroy(scheduler);
    }

--- Ojejku wszystko jest po angielsku. Na dodatek ten angielski jest bardzo dziwny.
--- Mamy tutaj 2 funkcje pierwsza z nich MainL() pisze na konsoli Hello, world!. Druga  funkcja DoStartL() napierw uruchamia zasoby komórki które są potrzebne, wykonuje pierwsza funkcję a potem zwalnia zasoby.
--- Niewiele z tego zrozumiałam Michale
--- Komórki tak naprawdę  zaprojektowano tak  żeby  były  bardzo  oszczędne  i do  programisty  należy to jak będzie zarządzał pamięcią komórki. Stąd jest wielka troska żeby optymalnie zarządzać pamięcią i zasobami. Dlatego na moment wykonania napisu angażuje sie zasoby komórki a jak napisze to się zwalnia.
--- Jakie to mogą być zasoby?
--- w komórce masz przeważnie mało pamięci i wolny procesor a także to że trzeba szanować prąd z komórki. W tej sytuacji ważne jest to żeby szybko zwalniać zasoby które w danej chwili są nie potrzebne.
--- Trochę już mnie to nuży Michale ile jeszcze zostało? -- spytała się z nutką rezygnacji
--- Została jeszcze ta główna  funkcja  E32Main()

GLDEF_C TInt E32Main()
    {
    // Create cleanup stack
    __UHEAP_MARK;
    CTrapCleanup* cleanup = CTrapCleanup::New();

    // Create output console
    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(KConsFullScreen,KConsFullScreen)));
    if (createError)
        return createError;

    // Run application code inside TRAP harness, wait keypress when terminated
    TRAPD(mainError, DoStartL());
    if (mainError)
        console->Printf(KTextFailed, mainError);
    console->Printf(KTextPressAnyKey);
    console->Getch();
   
    delete console;
    delete cleanup;
    __UHEAP_MARKEND;
    return KErrNone;
    }

---- Michale to już ponad moje siły.
--- Dusiu powiem Ci tyle że ta funkcja ma na celu otwarcie konsoli, wywołanie funkcji DoStartL() i obsługę błędów w przypadku gdyby coś nieoczekiwanego działo np: zabrakło prądu w baterii. Ale to tylko tyle na dziś
Dusia popatrzyła na kod i posmutniała
--- Sporo  nauki przede mną Michale  jestem na to wkurzona
--- Tak trzeba się nauczyć języka  programowania  C++ pod kątem Symbiana. - odpowiedział spokojnym głosem
--- Wiem - łzy pociekły z jej oczu
Michał objął ją ramieniem, co Dusię uspokoiło. Dusia  zdjęła  pas, rozpuściła włosy. i  wstała. Michał objął jej biodra Dusia pociągnęła suknię do góry aż przeszedł dreszcz podniecenia.

Brak komentarzy: