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

Dziwne zachowanie programu

Ostatnio zmodyfikowano 2016-03-05 19:19
Autor Wiadomość
C-Objective
» 2016-03-05 09:57:34
No to anarchia jak null zniknęło... Czemu użyłeś referencji przy tych tablicach?
P-145568
carlosmay
» 2016-03-05 10:31:04
Czemu użyłeś referencji przy tych tablicach?

Chyba jakaś chwila otępienia, a potem tego nie widziałem. Początkujący chyba tak mają
P-145573
Gage
Temat założony przez niniejszego użytkownika
» 2016-03-05 19:19:29
Wszystkie uwagi (wydaje mi się) wcieliłem w życie, program poprawiłem. Dodałem również operator=, new[], delete[], żeby zrobić zadanie "dla ambitnych":
Zdefiniuj dla tej klasy także podobnie działające operatory new[] i delete[].

Mam wrażenie, że teraz wszystko jest w porządku i moje amatorskie testy sprawiają wrażenie, że wszystko działa bezbłędnie. Jeśli się mylę, albo ktoś ma jakieś techniczne uwagi - proszę o podzielenie się nimi. Klasę i funkcję zaprzyjaźnioną dla zainteresowanych wrzucam poniżej.


C/C++
#include <iostream>
using namespace std;


class obiekty
{
    static int wywolan;
    static int wywolan_tablic;
    string przedstawienie;
    static bool zarezerwowane[ 100 ];
    static bool zarezerwowane_tablice[ 100 ];
public:
    static char * tablica[ 100 ];
    static char * tablica_tablic[ 100 ];
    static void * operator new( size_t );
    static void operator delete( void * );
    static void * operator new[]( size_t );
    static void operator delete[]( void * );
    string operator =( string );
    obiekty( string dane = "Brak danych" )
        : przedstawienie( dane )
    { }
    static void wyzeruj_zarezerwowane();
    friend ostream & operator <<( ostream &, obiekty & );
}; //class obiekty


/*************************************************************************************************/

char * obiekty::tablica[ 100 ];
int obiekty::wywolan = 0;
bool obiekty::zarezerwowane[ 100 ];
char * obiekty::tablica_tablic[ 100 ];
int obiekty::wywolan_tablic = 0;
bool obiekty::zarezerwowane_tablice[ 100 ];


void obiekty::wyzeruj_zarezerwowane()
{
    for( int i = 0; i < 100; i++ )
    {
        zarezerwowane[ i ] = false;
        zarezerwowane_tablice[ i ] = false;
    }
   
} //wyzeruj_tablice;



void * obiekty::operator new[]( size_t rozmiar )
{
    static int a;
    if( wywolan_tablic == 0 )
    for( int i = 0; i < 100; i++ )
         tablica_tablic[ i ] = new char[ rozmiar ];
   
    if( wywolan_tablic < 100 )
    {
        zarezerwowane_tablice[ wywolan_tablic ] = true;
        return tablica_tablic[ wywolan_tablic++ ];
    } //if
   
    else if( wywolan_tablic >= 100 )
    {
        int i;
        for( i = 0; i < 100; i++ )
        {
            if( zarezerwowane_tablice[ i ] == false )
                 break;
           
            else if(( i == 99 ) &&( zarezerwowane_tablice[ i ] == true ) )
            {
                cout << "Nie ma wiecej miejsca w tablicy tablic!!!" << endl;
                throw bad_alloc();
            } //else if
           
        } //for
       
        zarezerwowane_tablice[ i ] = true;
        return tablica_tablic[ i ];
       
    } //else if
   
   
} //operator new[]



void obiekty::operator delete[]( void * roboczy )
{
    for( int i = 0; i < 100; i++ )
    if( roboczy == tablica_tablic[ i ] )
    {
        zarezerwowane_tablice[ i ] = false;
    }
   
   
    for( int i = 0; i < 100; i++ )
    {
       
        if( zarezerwowane_tablice[ i ] == true )
        {
            break;
        }
        else if(( i == 99 ) &&( zarezerwowane_tablice[ i ] == false ) )
        {
            for( int p = 0; p < 100; p++ )
                 delete[] tablica_tablic[ p ];
           
        } //else if
       
    } //for
   
} //operator delete[]




void * obiekty::operator new( size_t rozmiar )
{
   
    if( wywolan == 0 )
    for( int i = 0; i < 100; i++ )
         tablica[ i ] = new char[ rozmiar ];
   
    if( wywolan < 100 )
    {
        zarezerwowane[ wywolan ] = true;
        return tablica[ wywolan++ ];
    } //if
   
   
    else if( wywolan >= 100 )
    {
        int i;
        for( i = 0; i < 100; i++ )
        {
            if( zarezerwowane[ i ] == false )
                 break;
           
            else if( i == 99 )
            {
                cout << "Nie ma wiecej miejsca!!!" << endl;
                throw bad_alloc();
            } //else if
           
        } //for
        zarezerwowane[ i ] = true;
        return tablica[ i ];
    } //else if
   
   
} //operator new


void obiekty::operator delete( void * roboczy )
{
   
    for( int i = 0; i < 100; i++ )
    if( roboczy == tablica[ i ] )
    {
        zarezerwowane[ i ] = false;
    }
   
    for( int i = 0; i < 100; i++ )
    {
        if( zarezerwowane[ i ] == true )
             return;
       
        else if(( i == 99 ) &&( zarezerwowane[ i ] == false ) )
        {
            for( int p = 0; p < 100; p++ )
                 delete[] tablica[ p ];
           
        } //else if
       
    } //for
   
} //delete



string obiekty::operator =( string dane )
{
    this->przedstawienie = dane;
    return dane;
}



/*******************************************************************************/

ostream & operator <<( ostream & ekran, obiekty & roboczy )
{
    ekran << "Nazywasz sie: " << roboczy.przedstawienie << endl;
    return ekran;
} //operator<<
P-145589
1 « 2 »
Poprzednia strona Strona 2 z 2