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

[C++] Problem z wypełnieniem struktury, porgram wyrzuca buffer overrun.

Ostatnio zmodyfikowano 2013-08-21 21:51
Autor Wiadomość
Mitu
Temat założony przez niniejszego użytkownika
[C++] Problem z wypełnieniem struktury, porgram wyrzuca buffer overrun.
» 2013-08-21 21:26:47
Chciałbym zebrać wartości pobrane z okienka dialogowego i przekazać je dalej. W tym celu zadeklarowałem odpowiednią strukturę, następnie w funkcji do obsługi okna dialogowego utworzyłem wskaźnik do takiej struktury.

Błąd: A buffer overrun has occurred in Win32Project2.exe which has corrupted the program's internal state. Press Break to debug the program or Continue to terminate the program.

C/C++
struct ANISODIFFSTRUCT
{
    double lambda,
    beta,
    iter;
    bool select;
};

INT_PTR CALLBACK anisoDiff( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
    char cstr[ 10 ];
    bool select = FALSE;
    int fC1, fC2;
    double iter, beta, lambda;
   
    ANISODIFFSTRUCT * valuePtr = new ANISODIFFSTRUCT;
    ZeroMemory( & valuePtr, sizeof( ANISODIFFSTRUCT ) );
   
    UNREFERENCED_PARAMETER( lParam );
    switch( message )
    {
    case WM_INITDIALOG:
        return( INT_PTR ) TRUE;
       
    case WM_COMMAND:
        switch( LOWORD( wParam ) )
        {
        case IDC_BUTTON1:
           
            HWND hIter = GetDlgItem( hDlg, IDC_EDIT1 );
            HWND hBeta = GetDlgItem( hDlg, IDC_EDIT2 );
            HWND hLambda = GetDlgItem( hDlg, IDC_EDIT3 );
            HWND hButC1 = GetDlgItem( hDlg, IDC_RADIO1 );
            HWND hButC2 = GetDlgItem( hDlg, IDC_RADIO2 );
           
            GetWindowTextA( hIter, cstr, 10 );
            iter = atof( cstr );
           
            GetWindowTextA( hBeta, cstr, 10 );
            beta = atof( cstr );
           
            GetWindowTextA( hLambda, cstr, 10 );
            lambda = atof( cstr );
            if(( lambda > 0.25 ) ||( lambda <= 0 ) )
            {
                MessageBoxA( hDlg, "Lambda value must be higher than 0 and no bigger than 0.25", "Wrong lambda value", MB_ICONWARNING );
                break;
            }
           
            fC1 = IsDlgButtonChecked( hDlg, IDC_RADIO1 );
            fC2 = IsDlgButtonChecked( hDlg, IDC_RADIO2 );
           
            if( fC1 == BST_CHECKED ) select = FALSE;
            else if( fC2 == BST_CHECKED ) select = TRUE;
            else { MessageBoxA( hDlg, "Function C1 or C2 must be choosen", "C function not selected", MB_ICONWARNING ); break; }
           
            valuePtr->beta = beta;
            valuePtr->iter = iter;
            valuePtr->lambda = lambda;
            valuePtr->select = select;
        }
        break;
    case WM_CLOSE:
        EndDialog( hDlg, 0 );
        break;
    }
   
    return( INT_PTR ) FALSE;
}

Program działa poprawnie, jeśli nie próbuję ustawić któregoś z elementów struktury tym kodem:

C/C++
valuePtr->beta = beta;
valuePtr->iter = iter;
valuePtr->lambda = lambda;
valuePtr->select = select;

Jeżeli zakomentuję ten fragment, wszystko działa jak należy.

Dodatkowa informacja - program wywala się w miejscu tworzenia wskaźnika, nie w miejscu przypisywania wartości do struktury. Tzn. przypisywanie wartości odbywa się po kliknięciu przycisku. Błąd pojawia się od razu po uruchomieniu okienka dialogowego. Jeśli przeniosę definicję wskaźnika do struktury do wewnątrz case IDC_BUTTON_1, to błąd wystąpi po kliknięciu przycisku.
P-90716
Monika90
» 2013-08-21 21:30:26
C/C++
ZeroMemory( & valuePtr, sizeof( ANISODIFFSTRUCT ) );
To zeruje wskaźnik i kawałek przyległej pamięci, a nie alokowaną strukturę.

Po co w ogóle ją zerować? I dlaczego tworzysz ją za pomocą new?
P-90717
Mitu
Temat założony przez niniejszego użytkownika
» 2013-08-21 21:38:32
Dzięki, niby coś nie pasowało, ale korzystałem z tego tutoriala i założyłem że powinno być tak jak tam... :)

C/C++
LOGINDIALOGRESULT * ldr = new LOGINDIALOGRESULT;
ZeroMemory( & ldr, sizeof( LOGINDIALOGRESULT ) );
P-90718
Mitu
Temat założony przez niniejszego użytkownika
» 2013-08-21 21:44:22
I dlaczego tworzysz ją za pomocą new?

W czymś to przeszkadza?
P-90719
Monika90
» 2013-08-21 21:51:26
W tutorialu jest błąd.


I dlaczego tworzysz ją za pomocą new?
W czymś to przeszkadza?
Za każdym razem kiedy procedura okna dialogowego jest wywoływana tworzona jest nowa instancja tej struktury. Nie widzę żeby te dzisiątki (setki?) struktur były gdzieś usuwane.
P-90720
« 1 »
  Strona 1 z 1