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… :)