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

[C++, WinAPI] Wielokrotne użycie funkcji gcvt

Ostatnio zmodyfikowano 2012-12-01 23:03
Autor Wiadomość
miadko
Temat założony przez niniejszego użytkownika
[C++, WinAPI] Wielokrotne użycie funkcji gcvt
» 2012-12-01 20:56:05
Witajcie

Mam pytanie: czy w jednym miejscu, np. funkcji IF-ELSE można użyć parokrotnie funkcji gcvt do zamiany liczb zmiennoprzecinkowych na typ LPSTR? Gdy używam tej funkcji raz, program który napisałem działa bez zarzutu. Ja potrzebuję jednak zamienić na LPSTR co najmniej dwie zmienne FLOAT, i gdy tylko wpiszę funkcję gcvt drugi raz, program się kompiluje, ale podczas uruchamiania pojawia sie, że przestał działać.

Miejsce problemu zaznaczyłem w poniższym kodzie całego mojego napisanego programu komentarzami. Wiem to, bo kiedy usunę jedną funkcję gcvt, program działa bez zarzutu.

C/C++
#include <windows.h>
#include <stdlib.h>
#include <string>
#include <tchar.h>
#include <math.h>
#include <cstdlib>                                 
#define ID_PRZYCISK1 5301
#define ID_PRZYCISK2 5302
#define ID_PRZYCISK3 5303
#define ID_PRZYCISK4 5304
#define ID_PRZYCISK5 5305
#define ID_POLETEKSTOWE1 4801
#define ID_POLETEKSTOWE2 4802
#define ID_POLETEKSTOWE3 4803
#define ID_HSTATIC0 4900
#define ID_HSTATIC1 4901
#define ID_HSTATIC2 4902
#define ID_HSTATIC3 4903
using std::string;
LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND g_hPrzycisk;
TCHAR * Bufor;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
    // WYPEŁNIANIE STRUKTURY
    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 + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Okno nie zostało zarejestrowane. Przepraszamy", "Niestety...", MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    HWND hwnd;
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Trójmiany kwadratowe", WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 100, 100, 500, 330, NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Wystąpił błąd uniemożliwiający uruchomienie programu. Przepraszamy!", "Niestety...", MB_ICONEXCLAMATION | MB_OK | MB_DEFBUTTON1 );
        return 1;
    }
    ////////////////////////
    // GŁOWNY KOD PROGRAMU//
    ////////////////////////
    HWND hStatic = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 10, 333, 37, hwnd,( HMENU ) ID_HSTATIC0, hInstance, NULL );
    SetWindowText( hStatic, "Czy chciałbyś uruchomić program\ndo obliczania rozwiązań trójmianu kwadratowego?" );
    HWND g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Tak", WS_CHILD | WS_VISIBLE, 351, 13, 57, 30, hwnd,( HMENU ) ID_PRZYCISK1, hInstance, NULL );
    HWND h_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Nie", WS_CHILD | WS_VISIBLE, 414, 13, 57, 30, hwnd,( HMENU ) ID_PRZYCISK2, hInstance, NULL );
    HWND h1Static = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 80, 154, 17, hwnd,( HMENU ) ID_HSTATIC1, hInstance, NULL );
    SetWindowText( h1Static, "Podaj współczynnik A:" );
    HWND pole_tekstowe_1 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 9, 100, 100, 25, hwnd,( HMENU ) ID_POLETEKSTOWE1, hInstance, NULL );
    SetWindowText( pole_tekstowe_1, "" );
    SendMessage( pole_tekstowe_1, EM_LIMITTEXT, 3, 0 );
    HWND h2Static = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 130, 154, 17, hwnd,( HMENU ) ID_HSTATIC2, hInstance, NULL );
    SetWindowText( h2Static, "Podaj współczynnik B:" );
    HWND pole_tekstowe_2 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 9, 150, 100, 25, hwnd,( HMENU ) ID_POLETEKSTOWE2, hInstance, NULL );
    SetWindowText( pole_tekstowe_2, "" );
    SendMessage( pole_tekstowe_2, EM_LIMITTEXT, 3, 0 );
    HWND h3Static = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 180, 154, 17, hwnd,( HMENU ) ID_HSTATIC3, hInstance, NULL );
    SetWindowText( h3Static, "Podaj współczynnik C:" );
    HWND pole_tekstowe_3 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 9, 200, 100, 25, hwnd,( HMENU ) ID_POLETEKSTOWE3, hInstance, NULL );
    SetWindowText( pole_tekstowe_3, "" );
    SendMessage( pole_tekstowe_3, EM_LIMITTEXT, 3, 0 );
    HWND i_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Oblicz", WS_CHILD | WS_VISIBLE, 10, 240, 102, 30, hwnd,( HMENU ) ID_PRZYCISK3, hInstance, NULL );
    HWND j_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Pomoc", WS_CHILD | WS_VISIBLE, 120, 240, 102, 30, hwnd,( HMENU ) ID_PRZYCISK4, hInstance, NULL );
    HWND k_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Zakończ", WS_CHILD | WS_VISIBLE, 230, 240, 102, 30, hwnd,( HMENU ) ID_PRZYCISK5, hInstance, NULL );
    i_hPrzycisk = GetDlgItem( hwnd, 5303 ); EnableWindow( i_hPrzycisk, FALSE );
    j_hPrzycisk = GetDlgItem( hwnd, 5304 ); EnableWindow( j_hPrzycisk, FALSE );
    k_hPrzycisk = GetDlgItem( hwnd, 5305 ); EnableWindow( k_hPrzycisk, FALSE );
    pole_tekstowe_1 = GetDlgItem( hwnd, 4801 ); EnableWindow( pole_tekstowe_1, FALSE );
    pole_tekstowe_2 = GetDlgItem( hwnd, 4802 ); EnableWindow( pole_tekstowe_2, FALSE );
    pole_tekstowe_3 = GetDlgItem( hwnd, 4803 ); EnableWindow( pole_tekstowe_3, FALSE );
    h1Static = GetDlgItem( hwnd, 4901 ); EnableWindow( h1Static, FALSE );
    h2Static = GetDlgItem( hwnd, 4902 ); EnableWindow( h2Static, FALSE );
    h3Static = GetDlgItem( hwnd, 4903 ); EnableWindow( h3Static, FALSE );
    //////////////////////////////////
    // KONIEC GŁOWNEGO KODU PROGRAMU//
    //////////////////////////////////
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
   
}



// OBSŁUGA ZDARZEŃ
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:
        LPSTR str;
        LPSTR sts;
        double x1;
        double x2;
        int x5;
        int x3;
        int x4;
        int a;
        int b;
        int c;
        int delta;
       
        {
            switch( wParam )
            {
            case ID_PRZYCISK4:
                {
                    MessageBox( hwnd, "Program oblicza rozwiązania trójmianu kwadratowego zapisanego w postaci: ax^2+bx+c.\nJest to postać ogólna, a zadaniem użytkownika jest podanie współczynników a, b oraz c. \nPo ich podaniu należy nacisnąć przycisk oblicz, a rozwiązania zostają wyświetlone w komunikacie.", "Pomoc", MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1 );
                }; break;
            case ID_PRZYCISK2:
                {
                    if( MessageBox( hwnd, "Jeżeli nie chcesz załadować programu do obliczania rozwiązań\ntrójmianu kwadratowego, zostanie on zamknięty.\n\nKontynuować?", "Potwierdź", MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON1 ) == IDYES )
                    {
                        DestroyWindow( hwnd );
                    }
                }; break;
            case ID_PRZYCISK1:
                {
                    if( MessageBox( hwnd, "Gotowe\nNaciśnij OK, aby kontynuować.", "Aplikacja załadowana", MB_ICONINFORMATION | MB_OK ) == IDOK )
                    {
                        HWND h_hPrzycisk = GetDlgItem( hwnd, 5302 ); EnableWindow( h_hPrzycisk, FALSE );
                        HWND g_hPrzycisk = GetDlgItem( hwnd, 5301 ); EnableWindow( g_hPrzycisk, FALSE );
                        HWND i_hPrzycisk = GetDlgItem( hwnd, 5303 ); EnableWindow( i_hPrzycisk, TRUE );
                        HWND j_hPrzycisk = GetDlgItem( hwnd, 5304 ); EnableWindow( j_hPrzycisk, TRUE );
                        HWND k_hPrzycisk = GetDlgItem( hwnd, 5305 ); EnableWindow( k_hPrzycisk, TRUE );
                        HWND hStatic = GetDlgItem( hwnd, 4900 ); EnableWindow( hStatic, FALSE );
                        HWND h1Static = GetDlgItem( hwnd, 4901 ); EnableWindow( h1Static, TRUE );
                        HWND h2Static = GetDlgItem( hwnd, 4902 ); EnableWindow( h2Static, TRUE );
                        HWND h3Static = GetDlgItem( hwnd, 4903 ); EnableWindow( h3Static, TRUE );
                        HWND pole_tekstowe_1 = GetDlgItem( hwnd, 4801 ); EnableWindow( pole_tekstowe_1, TRUE );
                        HWND pole_tekstowe_2 = GetDlgItem( hwnd, 4802 ); EnableWindow( pole_tekstowe_2, TRUE );
                        HWND pole_tekstowe_3 = GetDlgItem( hwnd, 4803 ); EnableWindow( pole_tekstowe_3, TRUE );
                       
                    }
                }; break;
            case ID_PRZYCISK3:
                {
                   
                   
                    HWND handle1 =( HWND ) lParam;
                    DWORD dlugosc1 = GetWindowTextLength( handle1 );
                    LPSTR Bufora =( LPSTR ) GlobalAlloc( GPTR, dlugosc1 + 1 );
                    GetWindowText( handle1, Bufora, dlugosc1 + 1 );
                    GetDlgItemText( hwnd, ID_POLETEKSTOWE1, Bufora, 24 );
                    int a;
                    HWND handle2 =( HWND ) lParam;
                    DWORD dlugosc2 = GetWindowTextLength( handle2 );
                    LPSTR Buforb =( LPSTR ) GlobalAlloc( GPTR, dlugosc2 + 1 );
                    GetWindowText( handle2, Buforb, dlugosc2 + 1 );
                    GetDlgItemText( hwnd, ID_POLETEKSTOWE2, Buforb, 24 );
                    int b;
                    HWND handle3 =( HWND ) lParam;
                    DWORD dlugosc3 = GetWindowTextLength( handle3 );
                    LPSTR Buforc =( LPSTR ) GlobalAlloc( GPTR, dlugosc3 + 1 );
                    GetWindowText( handle3, Buforc, dlugosc3 + 1 );
                    GetDlgItemText( hwnd, ID_POLETEKSTOWE3, Buforc, 24 );
                    int c;
                    int delta;
                    a = atoi( Bufora );
                    b = atoi( Buforb );
                    c = atoi( Buforc );
                    delta =(( b * b ) -( 4 * a * c ) );
                    if( delta == 0 )
                    {
                        float x1;
                        x1 =(( - 1 ) * b / 2 * a );
                        gcvt( x1, 10, str );
                        std::string message = "Wpisales: " +( std::string ) str + "";
                        MessageBox( NULL, message.c_str(), "Odpowiedźx", MB_ICONINFORMATION | MB_OK );
                        return 0;
                    }
                    else if( delta > 0 )
                    {
                        float x2;
                        x2 =(( - 1 ) * b - sqrt( delta ) ) /( 2 * a );
                        gcvt( x2, 10, str ); // TU JEST PIERWSZE GCVT, Z TYM PROGRAM DZIAŁA
                        float x3;
                        x3 =(( - 1 ) * b + sqrt( delta ) ) /( 2 * a );
                        gcvt( x3, 10, sts ); // PO DOPISANIU TEGO JAK WŁĄCZE PROGRAM WYSWIETLA SIE ŻE PRZESTAŁ ON DZIALAĆ i SIE ZAWIESZA!
                        std::string message = "Rozwiązaniem jest: " +( std::string ) str + " oraz " +( std::string ) sts + "";
                        MessageBox( NULL, message.c_str(), "Odpowiedź:", MB_ICONINFORMATION | MB_OK );
                        return 0;
                    }
                    else
                    {
                        MessageBox( hwnd, "Trójmian nie posiada rozwiązań", "Odpowiedź", MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1 );
                        return 0;
                    }
                }; break;
            case ID_PRZYCISK5:
                {
                    DestroyWindow( hwnd );
                }
            }
           
           
        }
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}

Z góry dzięki za odpowiedź
P-70225
DejaVu
» 2012-12-01 22:28:43
gcvt wymaga podania istniejącego bufora na tekst, a nie wskaźnika wskazującego na losowy adres pamięci.
P-70234
miadko
Temat założony przez niniejszego użytkownika
» 2012-12-01 22:42:55
Aha...
A mógłbyś jeszcze podpowiedzieć, jak takiego bufora na tekst dołączyć?
Z góry wielkie dzięki
P-70235
DejaVu
» 2012-12-01 22:47:46
hm? Nie rozumiem? Jeżeli nie wiesz jak powinien wyglądać poprawny kod to zobacz sobie » standard Citoa.
P-70236
miadko
Temat założony przez niniejszego użytkownika
» 2012-12-01 23:03:46
dejavu
jesteś geniuszem
P-70240
« 1 »
  Strona 1 z 1