Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

кто умный, скажите дураку, что не так...

76K
21 ноября 2011 года
schtirner
2 / / 19.11.2011
структура - циклическая очередь structer, представленная массивом указателей на динамические массивы object*** mass , хранящая объекты абстрактного базового класса object, производными классами являются классы matr и Integer .
Теперь вопрос. Ниже представлен код удаления элемента из данной структуры. при удалении mass у меня возникает ошибка. Напротив последней строки выполнения комментарий ОШИБКА!!!. По каким причинам это происходит? уже почти 2 недели пытаюсь исправить, но ничего не выходит...

elem - кол-во элементов в структуре
max_size - длина "строки"
scount - кол-во "строк"
mass - двумерный массив указателей.
параметр метода num - номер удаляемого.

Код:
bool structer::del(int num){
        if(num<0 || num>elem || !elem) return false;
        int xx,yy;
        xx=(num-1) / max_size;
        yy=(num-1) % max_size;
        //если последний  
        if(num==elem){
            delete mass[xx][yy];
            if((elem-1)%max_size==0)delete mass[--scount];
            elem--;pysto++;
            return true;
            }
        //иначe
        object*** tmp;
        int ii=0,kk=0,i=0,k=0;
        int n=elem-1,pp=scount;
       
        if((elem-1)%max_size==0)tmp = new object**[--scount];
        else tmp = new object**[scount];

        for(; i<scount; i++){
            tmp = new object*[max_size];
            for(k=0; k < max_size && n; k++, n--){
                if(i==xx && k==yy)break;
                if(mass[k]->get_ident()==0)tmp[k]=new matr(*(matr*)mass[k]);
                else tmp[k]=new Integer(*(Integer*)mass[k]);
                }
            if(i==xx && k==yy) break;
            }
        //копируем остальное
        bool flagc;
        if(k==0)flagc=false;
        else flagc=true;
        for(ii=i; ii<scount;ii++){
            if(flagc) flagc=false;
            else tmp[ii] = new object*[max_size];
            for(kk=k; kk<max_size && n; kk++,n--)
                if(kk+1!=max_size){
                    if(mass[ii][kk+1]->get_ident()==0)tmp[ii][kk]=new matr(*(matr*)mass[ii][kk+1]);
                    else tmp[ii][kk]=new Integer(*(Integer*)mass[ii][kk+1]);
                    }
                else{
                    if(mass[ii+1][0]->get_ident()==0)tmp[ii][kk]=new matr(*(matr*)mass[ii+1][0]);
                    else tmp[ii][kk]=new Integer(*(Integer*)mass[ii+1][0]);
                    }
                }
        //удаляем
        n=elem;
        for(int i=0;i<pp;i++){
            for(int ii=0;ii<max_size && n;ii++){
                if(mass[ii]){delete mass[ii];n--;}
                }
            delete mass;   // ОШИБКА!!!!!
            }
        delete mass;
        //копируем в новый
        n=elem-1;
        mass=new object**[scount];
        for(int l=0;l<scount;l++){
            mass[l]=new object*[max_size];
            for(int m=0;m<max_size && n; m++, n--){
                if(tmp[l][m]->get_ident()==0)mass[l][m]=new matr(*(matr*)tmp[l][m]);
                else mass[l][m]=new Integer(*(Integer*)tmp[l][m]);
                }
            }
        for(i=scount-1;i>=0;i--)delete tmp;
        delete tmp;
       
        elem--;pysto++;
        return true;
    }
76K
21 ноября 2011 года
schtirner
2 / / 19.11.2011
Извиняюсь, что побеспокоил... Тема уже не актуальна, я нашел другой выход... однако если кто-то объяснит что не так, буду очень рад!
14
22 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
ну во-первых delete для массивов пишется по другому: delete[]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог