Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z aplikacją winapi - błąd przy sprawdzaniu funkcją bool.

Ostatnio zmodyfikowano 2013-12-01 18:12
Autor Wiadomość
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ł.

C/C++
#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, /*uchwyt do naszej aplikacji*/
HINSTANCE hPrevInstance, /*Argument hPrevInstance powinien zawieraæ uchwyt poprzedniego
                                                      wyst¹pienia aplikacji, ale od wersji systemu Windows 95 wynosi on zawsze NULL.*/
LPSTR lpCmdLine, /*zawiera liniê poleceñ, z jakiej zosta³ uruchomiony nasz program.   COKOLWIEK TO ZNACZY*/
int nCmdShow ) /* To ju¿ wiem, typ okna w jakim otwieramy nasza aplikacje*/
{
    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, /* hWnd - uchwyt naszego okna aplikacji z ktorej jest wywolany komunikat, jezeli nie mamy to 0 czyli z pulpitu*/
    "To jest komunikat.", /* lpText - tekst wyswietlany w komunikacie*/
    "Komunikat.", /* lpCaption - tytul komunikatu*/
    MB_OK | MB_ICONINFORMATION ); /* uType - style naszego komunikatu*/
   
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX ); /*Rozmiar struktury w bajtach. Należy tu wpisać sizeof (WINDOWCLASSEX).*/
    wc.style = 0; /*Style klasy - NIE okna. Zazwyczaj 0*/
    wc.lpfnWndProc = WndProc; /*Wskaźnik do procedury obsługującej okno*/
    wc.cbClsExtra = 0; /*Dodatkowe bajty pamięci dla klasy - zazwyczaj 0*/
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance; /*Identyfikator aplikacji, która ma być właścicielem okna*/
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); /*Ikona aplikacji*/
    wc.hCursor = LoadCursor( NULL, IDC_ARROW ); /*Kursor aplikacji*/
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW ); /*Kolor tla okna*/
    wc.lpszMenuName = NULL; /*Identyfikator menu aplikacji*/
    wc.lpszClassName = NazwaKlasy; /*Nazwa klasy, którą tworzymy. Możesz wpisać, co chcesz (prawie ;-)).*/
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); /*Mala ikonka*/
   
    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, /*dwExStyle - Rozszerzone parametry stylu okna*/
    NazwaKlasy, /*lpClassName - Nazwa klasy okna, którą właśnie zarejestrowaliśmy*/
    "Napisek", /*lpWindowName - Napis na pasku tytułowym okienka*/
    WS_OVERLAPPEDWINDOW, /*dwStyle - "Zwykłe" style okienka*/
    CW_USEDEFAULT, /*x,y - Pozycja okna. Można ustawić na CW_USEDEFAULT, czyli na domyślną pozycję*/
    CW_USEDEFAULT,
    640, /*nWidth - Szerokosc okna*/
    200, /*nHeight - Wysokosc okna*/
    0, /*hWndParent - Uchwyt okna rodzicielskiego - zazwyczaj 0*/
    0, /*hMenu - Uchwyt menu dla naszego okna. Na razie żadnego nie mamy, więc NULL*/
    hInstance, /*hInstance - Uchwyt aplikacji, której przypisujemy okienko*/
    0 ); /*lpParam - Teoretycznie jest to wskaźnik do dodatkowych parametrów, ale jeszcze nie wiem co to do konca*/
    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.

C/C++
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 :)
P-97611
pekfos
» 2013-11-26 20:48:41
Nie zwalniasz pamięci i tworzysz niepotrzebne tablice. Dlaczego wkleiłeś swój kod do pętli komunikatów..?
P-97615
Soberowy
Temat założony przez niniejszego użytkownika
» 2013-11-26 21:17:09
Które tablice są niepotrzebne? Jestem dosyć świeży w tym temacie jeszcze nie do końca rozumiem jak to wszystko działa, a w kursie winapi nie jest to dobrze wyjaśnione. Gdzie mam wkleić kod żeby się wykonywał?
P-97620
pekfos
» 2013-11-26 21:43:09
Które tablice są niepotrzebne?
Wszystkie, poza los (nie licząc alokowanych).

Gdzie mam wkleić kod żeby się wykonywał?
Do procedury okna
P-97623
Soberowy
Temat założony przez niniejszego użytkownika
» 2013-11-26 22:18:52
Eee.. A gdzie jest procedura okna? I w jaki sposób wywołam edity bez tablic?
P-97626
pekfos
» 2013-11-27 12:56:43
A gdzie jest procedura okna?
WndProc.

I w jaki sposób wywołam edity bez tablic?
A, no to jeszcze hText. Reszta jest niepotrzebna.
P-97645
Soberowy
Temat założony przez niniejszego użytkownika
» 2013-11-27 14:19:15
Czyli wszystkie dane mam zbierać do jednego buforu?
P-97651
pekfos
» 2013-11-27 14:22:31
A po co do kilku? Dodatkowo niepotrzebnie tworzysz zmienne globalne. Wystarczą lokalne i kod będzie dużo czytelniejszy. Jak ten kod prawidłowo poskładasz i uporządkujesz, problem albo sam się rozwiąże, albo będzie łatwy do znalezienia.
P-97652
« 1 » 2
  Strona 1 z 2 Następna strona