"C++ vs VB" w przykładowych funkcjach.   strona główna:
A po co ten Excel ;-)
 
    No i już słyszę te głosy: "C++ na stronce o Excelu??" no właśnie tak :-) z przynajmniej dwóch powodów:  
Pytanie: "a po co ten Excel?" możemy potraktować np. tak: "Czy znajomość VBA będzie mi pomagała czy przeszkadzała w nauce c++?" No i krótka odpowiedź:   
POMAGA :-) Rozumienie pojęć: pętla, tablica, czy choćby typ danych nie może zaszkodzić więc kwestia wziąć do ręki którykolwiek kurs i po dosłownie paru dziesięciu   
stronach zacząć pisać :D  
    No ale zapytacie "po co mi to?" Chcąc zachęcić odrobinę powiem co mnie lekko zmotywowało. Chciałbym napisać bibliotekę dll której funkcje można by wywoływać   
poprzez Declare (znane nam z zastosowania funkcji API). Na razie musi wam to wystarczyć (sorka ;-P) Powód jest zupełnie prozaiczny. Mam z tą biblioteką jeszcze  
trochu problemów, a to nie ma EntryPoint, a to problem z DllRegisterSerwer, prościutkie przykłady dodające dwie liczby działają a jak chciałbym żeby funkcja zwróciła  
typ boolean… byk :-|… nie będę Wam pokazywał dokładnie bo nie o to chodzi. Przewalczę to pokażę jak - może się komuś przyda.  
 
    Napisałem że koniecznym jest jakiś kurs i dla kogoś znającego VBA (czy VB6) innego wyjścia nie widzę. Na szczęście pomocy w sieci jest po prostu masa! Tutoriale,  
literatura, przykłady… Ja dopadłem książeczkę "Od zera do gier kodera" jednak, o czym jestem przekonany, żeby nauczyć się c++ (czy jakiegokolwiek innego języka   
programowania) trzeba po prostu usiąść i pisać :D Na początku… tragedia :)) nic się nie chce skompilować nawet z jednej linijki kodu kompilator potrafi wypluć  
5 błędów i ze 3 ostrzeżenia :-)) ale po jakimś czasie zaczyna być coraz bardziej potulny ;) Ale najważniejsze - PISAĆ!!.  
 
    No to piszę :) i jest/są dwie funkcje sprawdzające poprawność nr'ów PESEL i NIP. Napisze w obu wersjach: c++ i vb. Niby inne a jednak jak się człowiek przyjrzy…  
no właśnie.. W sumie to są całkiem podobne ;-)  
 
 
bool PESEL(string strNr) Function PESEL(strNr As String) As Boolean  
{    
     unsigned aWagi[4] = {1,3,7,9};     Dim aWagi As Variant: aWagi = VBA.Array(1, 3, 7, 9)  
     unsigned sSum = 0;     Dim sSum As Integer  
      Dim i As Byte  
     for (unsigned i = 0; i < strNr.length()-1; i++)       
     {     For i = 1 To Len(strNr) - 1  
          sSum += static_cast<int> ((strNr[i])-48) * aWagi[i % 4];         sSum = sSum + (aWagi((i - 1) Mod 4) * CInt(Mid(strNr, i, 1)))  
     }     Next  
     
     return (10 - (sSum % 10)) == static_cast<int>((strNr[10])-48);     PESEL = (10 - (sSum Mod 10) = CInt(Mid(strNr, 11, 1)))  
} End Function  
     
bool NIP(string strNr)    
{    
     unsigned aWagi[9] = {6, 5, 7, 2, 3, 4, 5, 6, 7};     
     unsigned sSum = 0;    
  analogicznie ;)  
     for (unsigned i = 0; i < strNr.length()-1; i++)    
     {    
          sSum += static_cast<int> ((strNr[i])-48) * aWagi[i];    
     }    
     
     return (sSum % 11) == static_cast<int>((strNr[9])-48);    
}    
 
 
Dwa słowa o tym co dla piszących w vb jest zupełnie obce..  
 
typ unsigned   
Typy ze znakiem i bez znaku
Typ liczbowy int może nam przechowywać zarówno liczby dodatnie, jak i ujemne. Dosyć często jednak nie potrzebujemy wartości mniejszych od zera. (..)
Możemy rzecz jasna zwyczajnie zignorować obecność liczb ujemnych i korzystać jedynie z wartości dodatnich. Wadą tego rozwiązania jest marnotrawstwo: tracimy wtedy połowę miejsca zajmowanego w pamięci przez zmienną.(..)
Należałoby zatem powiedzieć kompilatorowi, że nie potrzebujemy liczb ujemnych i w zamian za nie chcemy zwiększenia przedziału liczb dodatnich. Czynimy to poprzez dodanie do typu zmiennej int modyfikatora unsigned (‘nieoznakowany’, czyli bez znaku; zawsze dodatni).
  Megatutorial
"Od zera do gier kodera"
str. 78
 
Rzutowanie  
rzutować (ang. cast)
przypisywaną wartość na docelowy typ – na przykład int. Rzutowanie działa trochę na zasadzie umowy z kompilatorem,
która w naszym przypadku mogłaby brzmieć tak:
„Wiem, że naprawdę jest to liczba zmiennoprzecinkowa, ale właśnie tutaj chcę, aby stała się liczbą całkowitą typu int, bo muszę ją przypisać do zmiennej tego typu”. 
  Megatutorial
"Od zera do gier kodera"
str. 83
 
Operator static_cast  
static_cast (‘rzutowanie statyczne’)
nie ma nic wspólnego z modyfikatorem static i zmiennymi statycznymi. Operator ten służy do przeprowadzania najbardziej pospolitych konwersji,
które jednak są spotykane najczęściej. (..) Wyrażenie poddawane rzutowaniu musimy ująć w nawiasy okrągłe.(..)
Znaki < i >, oprócz tego że są operatorami mniejszości i większości, tworzą parę nawiasów ostrych. Pomiędzy nimi wpisujemy określenie docelowego typu.
  Megatutorial
"Od zera do gier kodera"
str. 87
 
Po co mi ten static_cast ?  
   Może kiedyś będę się śmiał z tego fragmentu kodu jednak teraz nie widzę innego wyjścia ;-P. Wyciągam z nr Pesel pojedyncze cyfry i mnożę je przez elementy tablicy  
aWagi jednak strNr[i] to znak (nie liczba) więc mam np.: "8" i mam to przemnożyć przez 1. W VB użyłbym funkcji konwersji Cint (co zresztą robię w wersji vb funkcji)  
jednak w c++ takiej magii (jeszcze) nie znam a jakoś poradzić sobie trzeba. Działa to więc (w tłumaczeniu na vb) tak: ASC("8")-48 :P   
a więc: rzutuję znak na typ liczbowy jednak manewr zwraca numer tego znaku w kodowaniu ASCii gdzie 0 (zero) to znak 48'smy. Reszty łatwo się domyśleć :-)  
 
 
    Powiecie: "nauka "czegoś takiego" mi się nie przyda". Może i macie rację. Mnie jednak trochu do tego ciągnie :-). Już wcześniej miałem dwie przygody z   
wykorzystaniem JavaScript w WebBrowser w Arkuszu Excela i muszę przyznać że satysfakcja z faktu że to działa jest naprawdę duża :D Zanim powstanie owa  
biblioteka funkcji napisana w c++ którą będzie można wykorzystywać w vb/vba to pewnie jeszcze trochu czasu upłynie jednak jestem pewien że powstanie.