Wybrałem się z kumplem na zakupy. Mam co czytać… :)

Zakupy związane są z jednym z przedświątecznych postanowień: wgryźć się dobrze w C++, później, za jakiś czas, w C#. Daje sobie pół roku, może ciut więcej, na opanowanie tego w stopniu pozwalającym na dość swobodne operowanie językiem, żebym nie musiał zastanawiać się nad podstawami etc. Mam nadzieję, że przez ten czas mój zapał nie wygaśnie. Jak siebie znam, to nie powinien… :)

A po co to wszystko? Bo po więzieniu mam zamiar znaleźć dobrą robotę. Satysfakcjonującą, i w miarę dobrze płatną. Niekoniecznie jako webprogrammer (choć nie narzekałbym na to), ale między innymi po prostu jako programista. Poza tym, trzeba poszerzać swoje horyzonty ;) A ja lubię być pod jednym względem podobnym do papieru toaletowego: rozwijać się

Trzymajcie za mnie kciuki :)


Zacząłem się bawić trochę w prostą aplikację wykorzystującą sqlite. Powody 2:

  1. chciałem poznać co nieco sqlite;
  2. muszę sobie wymyślać jakieś zadania jeśli chcę się tego języka jako tako nauczyć :)

No i wczoraj miałem niezłą zagwozdkę. W pliku .cpp stało jak byk:

#include <sqlite3.h>

a ten przy kompilacji gotowca z dokumentacji sqlite wywala błędy, że nie znajduje funkcji sqlite3_open() i innych. Porażka. Spędziłem nad tym ponad godzinę dzień wcześniej, i dopiero wczoraj wieczorem udalo mi sie dojść do tego, że poza dodaniem pliku nagłówkowego w żródłach, trzeba powiedzieć kompilatorowi (w moim przypadku gcc), że ma użyć biblioteki, w której zawarte są potrzebne funkcje. Wywołanie kompilatora wobec tego wyglądało tak:

% g++ t1.cpp -o t1 -lsqlite3

i od tego momentu zaczęło działać jak należy.

Dziś, uzbrojony w nową wiedzę, spróbowałem tego samego na Windowsie w Sądzie więzieniu. Do diabła, znów spędziłem godzinę na tym, żeby sie doszukać jak tam ma to wyglądać. Najpierw buszując w opcjach używanego przeze mnie IDE (co mi się w końcu udało), a później ręcznie, wykorzystując wspomniane wczesniej gcc. Teoretycznie proste, nie ? W domu się udało, też gcc, więc co za problem ? Heheh, w sumie proste, jak sie już wie… najpierw trzeba zapodać mu gdzie szukać pliku nagłówkowego do sqlite (w moim wypadku było to: c:\Programy\Dev-Cpp\include\M), a później, oczywiście innym parametrem niż pod Linuksem (bo jakżeż by to mogłoby być inaczej) wskazać ścieżkę do .dll sqlite3. W sumie całość, wrzucona przeze mnie do .bata, wygląda mniej więcej tak:

g++ note.cpp -o note.exe -Ic:\Programy\Dev-Cpp\include\M -Wl,lsqlite3

albo podobnie, mam to w pracy, więc nie mogę teraz podejrzeć jak to tam wygląda ;) jeśli nakłamałem, to postaram się jutro to uaktualnić.

PS. W gotowcu, którego adres dałem powyżej, jest jeden błąd: brakuje odwołania do pliku nagłówkowego stdlib.h, który zawiera definicję funkcji exit(). Bez tego kompilator, oczywiście słusznie, wywala błędy. Linijka, którą trzeba dodać, wygląda tak:

#include <stdlib.h>

ucze sie od kilku dni nowego jezyka programowania: c++. nowego dla mnie, nie w ogole ;) jest wzglednie prosty do nauczenia, przynajmniej podstawy. podejrzewam ze bardziej zaawansowane rzeczy beda mniej proste. ale to szczegol.

jestem do przodu o to, ze znam calkiem niezle php. skladniowo sa bardzo podobne, choc sa znaczne roznice miejscami. ostatnio zacielem sie na funkcji sprintf(). w php zwraca ona nowy obiekt:

$a = sprintf("tresc %d cos %s tralala", 5, "tam; ");
echo $a;

zwroci nam:

tresc 5 cos tam; tralala

natomiast w c++ sprintf dziala przez referencje:

char bufor[256];
sprintf(bufor, "2 * %d = %d", 5, 10);

spowoduje ze zawartoscia zmiennej bufor bedzie ciag znakow (a dokladniej tablica znakow): 2 * 5 = 10. jako, ze w miejscu w ktorym ucze sie c++ nie mam dostepu do netu, zajelo mi dojscie do tego blisko godzine… ale sie udalo ;). notabene, uwagi wyrzucane przez kompilator sa jak dla mnie, na ta chwile, malo zrozumiale. moze kiedys to sie zmieni ;)

notabene, uzycie sprintf() jest najprostsza metoda do przekonwertowania zmiennej typu liczbowego (integer, float etc) na ciag znakow. uzycie:

char bufor[5];
sprintf(bufor, “%d”, 567);

spowoduje to ze zmienna buforbedzie zawierac napis (tablice znakow) "567".

moze ktos napisac, ze przeciez jest funkcja w stdlib.h itoa(). owszem, jest, ale:

  1. jest rownie niewygodna w uzyciu co sprintf() (a nawet ciut bardziej);
  2. nie nalezy do standardu ansi c++, co oznacza, ze np pod linuksem nie jest ona dostepna.

co jak dla mnie powoduje nieistnienie jej (czyli funkcji itoa()).

c++ spodobalo mi sie w miare takze dlatego, ze do tej pory sadzilem (blednie oczywiscie) ze tak jak w c, trzeba recznie deklarowac dlugosci stringow (konkretnie wymiarow tablic znakowych), pilnowac sie zeby po utworzeniu tablicy nie przekroczyc jej zakresu etc. ale w c++ zostala wprowadzona zarowno obsluga typu string (#include <string>), jak i vectorow, list, stosow (stack) jak i wielu innych usprawniaczy. no i oczywiscie mozliwosc programowania obiektowego… :)