Soberowy Temat założony przez niniejszego użytkownika |
Problem z aplikacją winapi - błąd przy sprawdzaniu funkcją bool. » 2013-11-26 20:11:42 Od jakiegoś czasu uczę się programować w c++ i ostatnio postanowiłem spróbować swych sił w winapie. Sam sobie wymyśliłem program do napisania w ramach ćwiczeń i już jest prawie gotowy natomiast mam z nim bardzo poważny problem. Otóż aplikacja losuje liczby 6 z 42 (jak w totku). My wpisujemy nasze liczby do edit'ów i klikamy przycisk "PORÓWNAJ". I w tym momencie nasz program wyświetla wylosowane liczby oraz liczbę naszych trafień. I tu właśnie leży mój problem. Liczba trafień jest zawsze równa 0 choćbym nie wiem jak się starał. #include <windows.h> #include<iostream> #include<cstdlib> #include<ctime> #include<sstream> #include<string> using namespace std; LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); LPSTR NazwaKlasy = "Klasa Okienka"; LPSTR Bufor[ 6 ]; DWORD dlugosc[ 6 ]; MSG Komunikat; HWND Przycisk, Przycisk_zamknij, hText[ 6 ], Wyniki; LPSTR Wynik; int czybyla; int los[ 6 ]; int ile = 0; string czybyla_str; bool CzyBylaLosowana( int Liczba, int tab[], int ile ) { if( ile <= 0 ) { return false; } int i = 0; do { if( Liczba == tab[ i ] ) { return true; } i++; } while( i < ile ); return false; } INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow ) { srand( time( 0 ) ); int liczba; do { liczba =( rand() % 42 ) + 1; if( CzyBylaLosowana( liczba, los, ile ) == false ) { los[ ile ] = liczba; ile++; } } while( ile < 6 ); ile = 0; stringstream przel[ 6 ], strim; string chwila[ 6 ], ile_traf; ile_traf = "Moje liczby to: "; do { przel[ ile ] << los[ ile ]; przel[ ile ] >> chwila[ ile ]; ile_traf = ile_traf + chwila[ ile ] + ", "; ile++; } while( ile < 6 ); MessageBox( 0, "To jest komunikat.", "Komunikat.", MB_OK | MB_ICONINFORMATION ); WNDCLASSEX wc; wc.cbSize = sizeof( WNDCLASSEX ); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground =( HBRUSH )( COLOR_WINDOW ); wc.lpszMenuName = NULL; wc.lpszClassName = NazwaKlasy; wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); if( !RegisterClassEx( & wc ) ) { MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...", MB_ICONEXCLAMATION | MB_OK ); return 1; } HWND hwnd; hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Napisek", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 200, 0, 0, hInstance, 0 ); int ile_okien = 0; int gdzie = 50; Przycisk = CreateWindowEx( 0, "BUTTON", "Porownaj", WS_CHILD | WS_VISIBLE, 450, 10, 150, 30, hwnd, NULL, hInstance, NULL ); Przycisk_zamknij = CreateWindowEx( 0, "BUTTON", "Zamknij", WS_CHILD | WS_VISIBLE, 450, 120, 150, 30, hwnd, NULL, hInstance, NULL ); do { hText[ ile_okien++ ] = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, gdzie += 30, 80, 25, 25, hwnd, NULL, hInstance, NULL ); } while( ile_okien < 6 ); HWND hStatic = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 50, 20, 350, 50, hwnd, NULL, hInstance, NULL ); Wyniki = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 50, 110, 350, 50, hwnd, NULL, hInstance, NULL ); SetWindowText( hStatic, "Program wylosowal 6 liczb z 42. Sprobuj trafic w te liczby :)" ); if( hwnd == NULL ) { MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION ); return 1; } ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); while( GetMessage( & Komunikat, NULL, 0, 0 ) ) { TranslateMessage( & Komunikat ); DispatchMessage( & Komunikat ); ile_okien = 0; int co; do { dlugosc[ ile_okien ] = GetWindowTextLength( hText[ ile_okien ] ); Bufor[ ile_okien ] =( LPSTR ) GlobalAlloc( GPTR, dlugosc[ ile_okien ] + 1 ); GetWindowText( hText[ ile_okien ], Bufor[ ile_okien ], dlugosc[ ile_okien ] + 1 ); co = atoi( Bufor[ ile_okien ] ); if( CzyBylaLosowana( co, los, 6 ) ) czybyla++; ile_okien++; } while( ile_okien < 6 ); if( czybyla_str.empty() ) { strim << czybyla; strim >> czybyla_str; ile_traf += "\nTrafiles " + czybyla_str + " razy."; } Wynik = const_cast < char *>( ile_traf.c_str() ); } return Komunikat.wParam; return 0; } LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_CLOSE: DestroyWindow( hwnd ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; case WM_COMMAND: if(( HWND ) lParam == Przycisk ) SetWindowText( Wyniki, Wynik ); if(( HWND ) lParam == Przycisk_zamknij ) DestroyWindow( hwnd ); break; default: return DefWindowProc( hwnd, msg, wParam, lParam ); } return 0; }
Wydaje mi się, że problem leży gdzieś w wywołaniu funkcji CzyBylaLosowana ponieważ dla poprzedniego wywołania w losowaniu problem ten się nie pojawia. GetWindowText( hText[ ile_okien ], Bufor[ ile_okien ], dlugosc[ ile_okien ] + 1 ); co = atoi( Bufor[ ile_okien ] ); if( CzyBylaLosowana( co, los, 6 ) ) czybyla++;
ile_okien++; } while( ile_okien < 6 );
if( czybyla_str.empty() ) { strim << czybyla; strim >> czybyla_str; ile_traf += "\nTrafiles " + czybyla_str + " razy."; }
Wynik = const_cast < char *>( ile_traf.c_str() ); Staram się sam rozwiązywać problemy i szukam zawsze w googlach ale z tym nie potrafię sobie poradzić więc proszę o pomoc :) |