Co zrobić, aby strumienie oraz funkcje z stdio współpracowały poprawnie?
Strumienie cin oraz cout są buforowane, co oznacza, że dane nie są wypisywane/wczytywane za każdym razem, gdy sobie tego zażyczymy, lecz hurtem - gdy danych się troche nazbiera. Powoduje to nieprawidłowe współdziałanie funkcji z stdio ze strumieniami, gdyż używając printf/scanf dane są wypisywane od razu. Może dojść do sytuacji, gdy np. przeplatasz wyświetlanie danych na ekranie za pomocą strumieni i funkcji z stdio, że dane będą wypisywane w niepoprawenej kolejności.

Jeżeli chcesz, aby nie było problemów, na początku programu dodaj linijkę:
[crayon-5f335a1e8add9487488027/]
Dzięki czemu dane będą wypisywane przez strumienie od razu, w każdym momencie, gdy sobie tego zażyczysz. Tracimy jednak tym sposobem szybkość strumieni.

Autor: Spine
pl
Co zrobić, aby za każdym uruchomieniem programu losowane liczby różniły się od siebie?
Aby losowane liczby nie powtarzały się, należy przed rozpoczęciem losowania wywołać funkcję srand, do której paremetr otrzymamy z funkcji time(NULL) - zwraca ona ilość sekund, jakie upłynęły od 1 stycznia 1970 roku:
[crayon-5f335a1e8ab4d076084427/]
Autor: Iskar
pl
Jak dostać ścieżkę do folderu, w który znajduje się plik exe aplikacji?
Sprawa prosta i łatwa, wystarczy wiedzieć, że zawsze pierwszy parametr programu to ścieżka do pliku exe, wystarczy więc wyciąć nazwe pliku i rozszerzenie:
[crayon-5f335a1e8a8a1540661159/]
Jeżeli nasza aplikacja nie jest konsolowa tylko typu Win32, to jako pierwszy parametr nie dostaniemy ścieżki do exeka, musimy ją dostać w inny sposób, oto kod:
[crayon-5f335a1e8a8a4847332626/]
Jak widać, korzystamy z funkcji WinAPI GetModuleFileName (dzięki za info Firen :>), która w drugim parametrze umieszcza ścieżkę do exeka, do którego należy aktualny proces.

Autor: Iskar
pl
Jak pobrać parametry z linii komend?
Jak pobrać parametry z linii komend?

Najpierw należy dodać do funkcji main() dwa argumenty:
[crayon-5f335a1e8a5ef714075403/]
nazwy zmiennych są dowolne:
argc - określa ile parametrów zostało przekazanych do programu z linii komend.
argv - jest tablicą stringów przechowujących parametry.

Na przyklad wywolanie programu:

> my_prog -arg1 -arg2 arg3

spowoduje, że zmienna argc przyjmie wartość 4, a potem kolejno:
[crayon-5f335a1e8a5f3188997808/]
Z powyższego wynika, że pierwszym parametrem programu jest zawsze jego nazwa, a co za tym idzie argc jest zawsze większy lub równy jeden.

Autor: Firen
pl
Jak pobrać uchwyt do przycisku Start?
Na początku musimy otrzymać uchwyt do paska zadań, na którym znajduje się przycisk Start. Jego klasa to Shell_TrayWnd. Do uzyskania jego uchwytu posługużymy się funkcją FindWindow, który jako pierwszy argument przyjmuje nazwę klasy okna, a jako drugi - jego tytuł:
[crayon-5f335a1e8a340412636938/]
Następnie musimy otrzymać uchwyt do przycisku Start. Używamy w tym celu funkcji GetWindow, której przekazujemy uchwyt TaskBar i, podając jako drugi argument wartość GW_CHILD, oznajmiamy, że chcemy otrzymać uchwyt do okna potomnego:
[crayon-5f335a1e8a343658180260/]
Autor: Iskar
pl
Jak przesunąć programowo scroll?
Jak przesunąć programowo scroll?

Należy wysłać do okna odpowiedni komunikat:

- WM_VSCROLL - aby przesunąć pionowy scroll,
- WM_HSCROLL - aby przesunąć poziomy scroll,

za pomocą funkcji SendMessage:
[crayon-5f335a1e89dc4389517585/]
Pierwszy parametr to uchwyt okna, do którego ma zostać wysłany komunikat, następny - identyfikator komunikatu, kolejne dwa parametry to wartości, jakie będą wraz z komunikatem przesłane. W wParam prześlemy informację o tym, o ile chcemy przesunąć scroll, lParam nie będziemy używać. W przypadku komunikatów WM_VSCROLL i WM_HSCROLL przydatne będą takie opcje:



SB_BOTTOM
Przesuwa scroll do samego końca.


SB_LINELEFT
Przesuwa scroll o jedną linię w lewo (lub w górę).


SB_LINERIGHT
Przesuwa scroll o jedną linię w prawo (lub w dół).


SB_PAGELEFT
Przesuwa scroll o jedną stronę w lewo (lub w górę).


SB_PAGERIGHT
Przesuwa scroll o jedną stronę w prawo (lub w dół).


SB_THUMBPOSITION
Przesuwa scroll do podanego miejsca.


SB_TOP
Przesuwa scroll na sam początek.



Przykład:
[crayon-5f335a1e89dc8664715748/]
lub:
[crayon-5f335a1e89dc9645531704/]
Jak widać, jeżeli chcemy przesunąć scroll do danego miejsca, musimy 'skleić' za pomocą MAKELONG dwie wartości ze sobą: SB_THUMBPOSITION oraz nową pozycję scrolla.

Jeżeli chcemy otrzymać aktualną pozycję scrolla, należy skorzystać z funkcji GetScrollPos:
[crayon-5f335a1e89dca233987040/]
Autor: Iskar
pl
Jak przesłać obiekt typu string do funkcji przyjmującej jako argument const char*?
Jeżeli probowałeś przesłać do jakieś funkcji, która wymagała jako argumentu char* obiekt typu string, to zapewne spotkałeś się z błędem typów:
[crayon-5f335a1e8a096445015677/]
W takim wypadku musisz się posłużyć specjalną funkcją składową klasy string c_str(), która zwraca wskaźnik do stałego łańcucha tekstowego umieszczonego w obiekcie typu string:
[crayon-5f335a1e8a099680686519/]
Autor: Iskar
pl
Jak sprawdzić rozmiar pliku otworzonego strumieniem?
Sprawa jest prosta - wystarczy po otworzeniu pliku przesunąć się (seekg) na jego koniec (drugim parametrem będzie flaga end) a potem odczytać aktualną pozycję w pliku (tellg), która zwróci nam pozycję w bajtach. Potem z powrotem przesuwamy się na początek pliku (seekg z drugim parametrem beg). Przykład:
[crayon-5f335a1e89b25884799765/]
U mnie pojawił się tekst: Rozmiar pliku (w bajtach): 1440054, w kilobajtach: 1406

Autor: Iskar
pl
Jak wyświetlić w konsoli polskie znaki?
Trzeba je ręcznie wpisywać za pomocą odpowiednich kodów (muszą być poprzedzone backslashem ''):

206 - ć
210 - ł
230 - ś
242 - ó
245 - ą
251 - ę
253 - ź
276 - ż
344 - ń

Przykład:
[crayon-5f335a1e89884770162075/]
Autor: Iskar
pl
Jak zainicjować tryb OpenGL na staticu (coś w stylu komponentu Panel z VCL - Delphi, BCB)?
Na początku zadeklarujmy zmienne których użyjemy:
[crayon-5f335a1e892f6337108980/]
W kodzie dla zdarzenia WM_CREATE należy wpisać:
[crayon-5f335a1e892fc959302626/]
by stworzyć obiekt.

Potem normalnie inicjujemy OpenGL'a, tyle, że kontekst graficzny przypisujemy dla hstat, o taki kod był w szablonie, tylko dół dodałem:
[crayon-5f335a1e892fd945686426/]
Użyjemy tej funkcji z procedurze okienkowej po pokazaniu się okna, czyli po funkcji ShowWindow w taki sposób:
[crayon-5f335a1e892fe872660216/]
Przed zakończeniem programu (w WM_DESTROY przed funkcją PostQuitMessage(0)) użyjemy takiej funkcji:
[crayon-5f335a1e89301410699384/]
No i jeszcze ostatecznie coś narysujmy na naszym staticu
[crayon-5f335a1e89302650115240/]
Użyjemy to w ten sposób:
[crayon-5f335a1e89303512556128/]
W razie watpliwości, przejrzyj kod przykładowy:
[crayon-5f335a1e89304965795006/]
należy nie zapomnieć o podlinkowaniu libów opengl32 i glu32.

Autor: Spine
pl