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

Stack around the variable was corrupted

Ostatnio zmodyfikowano 2010-01-28 00:35
Autor Wiadomość
Mapet
Temat założony przez niniejszego użytkownika
Stack around the variable was corrupted
» 2010-01-27 21:31:49
Witam.
Mam mały problem z programem który testuje funkcje wirtualne oraz RTTI.

C/C++
// s.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class figura
{
protected:
    double s;
public:
    virtual void area() = 0;
    virtual void disp();
};

void figura::disp()
{
    cout << s << endl;
}

class circle
    : public figura
{
private:
    double r;
public:
    circle( double rr ) { r = rr; }
    void area();
    void disp();
};

void circle::area()
{
    const double PI = 3.14;
    s = 3.14 * r * r;
}

void circle::disp()
{
    cout << "Circle : ";
    figura::disp();
}

class trojkat
    : public figura
{
private:
    double a, h;
public:
    void setdata( double aa, double hh ) { a = aa; h = hh; }
    trojkat( double aa, double hh ) { a = aa; h = hh; }
    void area();
    void disp();
};

void trojkat::area()
{
    s = a * h / 2;
}

void trojkat::disp()
{
    cout << "trojkat : ";
    figura::disp();
}

class prostokat
    : public figura
{
private:
    double a, b;
public:
    prostokat( double aa, double bb ) { a = aa; b = bb; }
    void setdata( double aa, double bb ) { a = aa; b = bb; }
    void disp();
    void area();
};

void prostokat::disp()
{
    cout << "prostokat : ";
    figura::disp();
}

void prostokat::area()
{
    s = a * b;
}

//########################################################################


int _tmain( int argc, _TCHAR * argv[] )
{
    //obiekty klas pochodnych
    trojkat t1( 2, 4 );
    circle c1( 10, 5 );
   
    prostokat p1( 2, 6 );
   
    //wskaznik do typu klasy bazowej
    figura * ptr_fig[] = { & t1, & p1, & c1 };
    prostokat * ptr_prostokat;
    trojkat * ptr_trojkat;
   
    int i, imax = 10, ind;
    for( i = 0; i < imax; i++ )
    {
        ind = rand() % 3;
        cout << "Wskaznik ptr_fig pokazuje teraz na : " << typeid( * ptr_fig[ ind ] ).name() << endl;
        ptr_fig[ ind ]->area();
        ptr_fig[ ind ]->disp();
       
        //tu wstawic swoj kod
        if( ptr_prostokat = dynamic_cast < prostokat *>( ptr_fig[ ind ] ) )
        {
            ptr_prostokat->setdata( 10, 12 );
            ptr_fig[ ind ]->area();
            ptr_fig[ ind ]->disp();
        }
       
        ptr_trojkat =( trojkat * ) ptr_fig[ ind ];
        ptr_trojkat->setdata( 20, 30 );
       
    }
   
    system( "pause" );
    return 0;
}

Niby działa ale na podczas zamykania programu programu wywala blad


Run-Time Check Failure #2 - Stack around the variable 'c1' was corrupted.

Blad uszkodzenia obiektu c1:<
Google mówią ze przekroczyłem dozwolony obszar na stosie, lecz za chiny nie wiem jak to poprawić.

Z góry dzięki za pomoc.
P-13335
Elaine
» 2010-01-27 21:50:25
Po chamsku rzutujesz figurę na trójkąt - a co, jeśli figura trójkątem nie jest? Tutaj kończy się to nadpisaniem pamięci innego obiektu.
P-13337
Mapet
Temat założony przez niniejszego użytkownika
» 2010-01-27 22:06:45
Wielkie dzięki.
Część programu była narzucona od nauczyciela, błędu szukałem usilnie w mojej części nie pomyślałem ze profesor przyszykuje nam taka niemiła niespodziankę. Jeszcze raz ślicznie dziękuje.
P-13340
DejaVu
» 2010-01-28 00:35:38
Skoro problem rozwiązany, temat zamykam. Patrząc na kod mimo wszystko myślę, że Ty dopisałeś błędny kod, tj.
C/C++
ptr_trojkat =( trojkat * ) ptr_fig[ ind ];
ptr_trojkat->setdata( 20, 30 );

Jeśli ten kod natomiast był, a nie było tego z dynamic_cast'em to błąd leżał po stronie prowadzącego. Być może był on celowy i zadanie polegało na jego usunięciu.

PS. Czy moderatorzy mogą poprawiać takie pierdoły jak kolorowanie kodu? Chyba nie muszę wszystkiego sam poprawiać...
P-13342
« 1 »
  Strona 1 z 1