Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при удалении динамической кнопки, Access violation at address 00440D4E in  
V
    Опции темы
RDC
  Дата 8.6.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Вылетает ошибка Access violation at address 00440D4E in .....
Подозреваю что проблема в динамических кнопках. Вот код
Код

void ButShow(int n, bool q) {
                static TButton **p = NULL;
                static int PrevCount = 0;
                if(p) {
                        for(int i = 0; i < PrevCount; ++i)
                                delete p[i];
                        delete []p;
                        p = NULL;
                }
                if(n == 0)
                        return;
                p = new TButton *[n];
                PrevCount = n;
                for(int i=0; i<n; i++) {
                        p[i] = new TButton(Panel1->Owner);
                        p[i]->Parent = Panel1;
                        p[i]->Top = 8;
                        p[i]->Left=(i*80)+8;
                        p[i]->Caption="Variant "+IntToStr(i+1);
                        p[i]->OnClick=NewClick;
                        p[i]->Tag=i;
                        p[i]->Visible=q;
                }
        }
 
--------------------
Живопись
PM MAIL   Вверх
586
Дата 9.6.2008, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(RDC @  8.6.2008,  22:31 Найти цитируемый пост)
Access violation at address 00440D4E in .....

В какой строчке? Приведи полное сообщение об ошибке.
PM   Вверх
RDC
Дата 9.6.2008, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 00440D36 in module 'Project2.exe'. Read of address FFFFFFEE'. Process stopped. Use Step or Run to continue.

И указывает на строчку 10... почему то.
Код

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->Title = "Client";
                 Application->CreateForm(__classid(TfrmClient), &frmClient);
                 Application->CreateForm(__classid(TfrmSettings), &frmSettings);
                 Application->Run();
        }
        catch (Exception &exception)
        {

--------------------
Живопись
PM MAIL   Вверх
ama_kid
Дата 9.6.2008, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



RDC, показывай код, где вызывается ButShow. И еще непонятно - как у тебя из обычной функции (ButShow) видно Panel1...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
586
Дата 9.6.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(ama_kid @  9.6.2008,  09:51 Найти цитируемый пост)
И еще непонятно - как у тебя из обычной функции (ButShow) видно Panel1... 

В прототипе класса.  smile 
Цитата(RDC @  8.6.2008,  22:31 Найти цитируемый пост)
void ButShow(int n, bool q) {

Бессмысленный параметр. Если вызвать ButShow(0) все кнопки будут уничтожены.
У меня функция нормально работает. Когда возникает ошибка?
PM   Вверх
Aline
Дата 9.6.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Подключи CodeGuard и пройдись отладчиком. CodeGuard дает больше информации при таких ошибках

Это сообщение отредактировал(а) Aline - 9.6.2008, 12:33
PM MAIL   Вверх
RDC
Дата 9.6.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Вот код где вызывается ShowBut
Код

void QuestNext(int Next)
{
        AnsiString q;
        if (i==MaxQuest+1) {
                frmClient->ButShow(0);
                AnsiString End=ExtractFilePath(Application->ExeName);
                End=End + "end.html";
                frmClient->CppWebBrowser1->Navigate(End.WideChar(NameQue,100),0,NULL,NULL,NULL);
        } else {
                q=TestDir + IntToStr(Next) + ".html";
                TrueAnswer=XOR_Crypt(ReturnCode(LastS(q)),"TESTPASS");
                frmClient->ButShow(StrToInt(TrueAnswer[5]));
                frmClient->CppWebBrowser1->Navigate(q.WideChar(NameQue,100),0,NULL,NULL,NULL);
                i++;
        }
}


Добавлено через 5 минут и 6 секунд
Ещё бывает в том же месте выскакивает ошибка Abstract Error.

--------------------
Живопись
PM MAIL   Вверх
ama_kid
Дата 9.6.2008, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



Цитата(RDC @  9.6.2008,  19:10 Найти цитируемый пост)
Вот код где вызывается ShowBut
Хм... А где вызывается QuestNext? Случаем не в OnCreate формы? Есть подозрение, что панель к тому моменту еще не создана, чтобы обращаться к её свойству Owner...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
RDC
Дата 9.6.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Цитата(ama_kid @  9.6.2008,  19:23 Найти цитируемый пост)
Хм... А где вызывается QuestNext? Случаем не в OnCreate формы? Есть подозрение, что панель к тому моменту еще не создана, чтобы обращаться к её свойству Owner...

Нет не в OnCreate. По кнопочке вызывается.
--------------------
Живопись
PM MAIL   Вверх
RDC
Дата 9.6.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Вот в этом коде поставил 5 строку в конец if и ошибка исчезла. Но теперь то редко появляется Abstract Error... Мучаю компилятор.
Код

void QuestNext(int Next)
{
        AnsiString q;
        if (i==MaxQuest+1) {
                frmClient->ButShow(0);
                AnsiString End=ExtractFilePath(Application->ExeName);
                End=End + "end.html";
                frmClient->CppWebBrowser1->Navigate(End.WideChar(NameQue,100),0,NULL,NULL,NULL);
        } else {
                q=TestDir + IntToStr(Next) + ".html";
                TrueAnswer=XOR_Crypt(ReturnCode(LastS(q)),"TESTPASS");
                frmClient->ButShow(StrToInt(TrueAnswer[5]));
                frmClient->CppWebBrowser1->Navigate(q.WideChar(NameQue,100),0,NULL,NULL,NULL);
                i++;
        }
}

--------------------
Живопись
PM MAIL   Вверх
RDC
Дата 10.6.2008, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Ошибка Abstract Error изредка появляется, заметил, когда большее кол-во кнопок меняется на меньшее (например было 5 кнопок, они стираются и выводится три кнопки). В принципе тема закрыта, всем спасибо.
--------------------
Живопись
PM MAIL   Вверх
RDC
Дата 11.6.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Сегодня общался со своим предадом. Он сказал следующее: 
1. 6 сроку надо заменить на p[i]->Free();
2. Что она никогда не выполниться!!!
Код

void ButShow(int n, bool q) {
                static TButton **p = NULL;
                static int PrevCount = 0;
                if(p) {
                        for(int i = 0; i < PrevCount; ++i)
                                delete p[i];
                        delete []p;
                        p = NULL;
                }
                if(n == 0)
                        return;
                p = new TButton *[n];
                PrevCount = n;
                for(int i=0; i<n; i++) {
                        p[i] = new TButton(Panel1->Owner);
                        p[i]->Parent = Panel1;
                        p[i]->Top = 8;
                        p[i]->Left=(i*80)+8;
                        p[i]->Caption="Variant "+IntToStr(i+1);
                        p[i]->OnClick=NewClick;
                        p[i]->Tag=i;
                        p[i]->Visible=q;
                }
        }


Добавлено через 21 секунду
А что такое delete []p; он ваще не знает. Кто объяснит?
--------------------
Живопись
PM MAIL   Вверх
HappyLife
Дата 11.6.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



RDC, Ошибка случаем возникает не при закрывании формы?
Все просто. Если ты даешь родителя объекту, Родитель сам заботится об удалении, а ошибка может возникать из-за двойного удаления обекта. Так что ты либо, создавай кноку так 
Код
new TButton(0);
 любо не удаляй.
PM MAIL   Вверх
586
Дата 11.6.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(RDC @  11.6.2008,  12:46 Найти цитируемый пост)
1. 6 сроку надо заменить на p[i]->Free();

Можно.
Цитата(RDC @  11.6.2008,  12:46 Найти цитируемый пост)
2. Что она никогда не выполниться!!!

В отладчике Break Point срабатывает. Кто прав? Отладчик или препод? smile
Цитата(RDC @  11.6.2008,  12:46 Найти цитируемый пост)
А что такое delete []p; он ваще не знает. Кто объяснит? 

Освобождение массива указателей.
У меня код нормально работает. Вызываю несколько раз следующий код:
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ButShow(rand()%9+1);
}

Нигде ошибка не появляется.

Добавлено через 4 минуты и 32 секунды
У тебя какой билдер? Я на 6 тестировал.
PM   Вверх
586
Дата 11.6.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



При создании нескольких экземпляров формы они будут конфликтовать из-за статических переменных. Переделал.
Код
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TPanel *Panel1;
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
    void ButShow(UINT n);

    std::vector<TButton*> Buttons;
};


__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    srand(GetTickCount());
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ButShow(rand()%10);
}

void TForm1::ButShow(UINT n)
{
    if(Buttons.size() < n) {
        for(UINT i = Buttons.size(); i < n; ++i) {
            TButton *b = new TButton(Panel1->Owner);
            b->Parent = Panel1;
            b->Top = 8;
            b->Left=(i*80)+8;
            b->Caption="Variant "+IntToStr(i+1);
            //b->OnClick=NewClick;
            b->Tag=i;
            Buttons.push_back(b);
        }
    } else {
        for(UINT i = Buttons.size(); i > n; --i)
        {
            Buttons.back()->Free();
            Buttons.pop_back();
        }
    }
}

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.