Мистическая ошибка памяти Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Мистическая ошибка памяти

Post by SmileGobo » Wed Mar 25, 2009 8:34 pm

Как вы могли заметить я пишу архиватор, в учебных целях.
В обработчике события распаковки архива валиться ошибка, причем валиться она, если распаковываю в корень диска, если распаковывать в директорию то вроде все норм.
файл archivatorMain.cpp

Code: Select all

void MyFrame1::OnUnpackFiles(wxCommandEvent& event){
    if(!m_grid1->GetNumberRows()>0){
        //Запись в лог
        return;
    }

    Zip arhiv(m_grid1->GetFiles());
    //wxMessageBox(wxEmptyString);
    arhiv.Unpack(m_dirPicker1->GetPath(),*m_statusBar1);
}
Но самая главная мистика заключается в том, что если раскоменить строку wxMessageBox(wxEmptyString); то все нормально.
ЗЫ файлы распаковываются нормально.
Уверен что я где-то глупо ошибся. Но я не как не могу понять где. :evil:
архив не прилепляется больно большой =\
http://webfile.ru/3303596

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Mar 26, 2009 8:11 am

Что за Zip это твой класс? А что там внутри достопочтенное собрание должно угадать?

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Post by SmileGobo » Thu Mar 26, 2009 8:14 am

не был уверен что стоит выкладывать весь код в сообщение, поэтому выложил архив с файлами где и класс Zip и все остальные классы есть.
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Mar 26, 2009 8:40 am

Ну во первых ты бы рассказал что говорит отладчик на какой конкретно строе валиться. Не обижайся, но ради праздного любопытства твой код вряд ли кто-то станет компилировать и потом отлаживать за тебя.

Ну и второе угадаю... раз валиться на корне (видимо в винде) ты к буковке диска, наверно, забыл добавить + wxT("\\") прежде чем передать этот путь компилятору.

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Post by SmileGobo » Thu Mar 26, 2009 8:51 am

Да вообще здорово, что хоть кто-то отвечает. Предпочитаю пользоваться отладочной печатью, и судя по ней валиться по выходу из функции, видимо что-то с потоками не так, может закрыть их не получается из-за не корректного пути.

В любом случае попробую слеш добавить в путь.
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Mar 26, 2009 8:59 am

Ты ведь прежде чем что-то с файликом делать проверяешь что он существует?
wxFile::Exists
static bool Exists(const char* filename)

Returns true if the given name specifies an existing regular file (not a directory or a link)

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Post by SmileGobo » Thu Mar 26, 2009 9:33 am

Я использую потоки:

Code: Select all

wxString Zip::Unpack(const wxString& path,wxStatusBar& info){
    wxZipEntry *entry;
    for(int i=0;i<to_arhive.Count();i++){
        wxFileInputStream in(to_arhive[i]);
        wxZipInputStream zip(in);
        //wxMessageBox(wxString::Format("%s%d_comment.txt",path,i));
        //wxFileOutputStream(wxString::Format("%s%d_comment.txt",path,i));
        int j=zip.GetTotalEntries();

        while (j-->0){
            static unsigned char buf[1024];
            entry=zip.GetNextEntry(); //получить следующий вложенный файл
            wxString name = entry->GetName(); //Получить имя
            size_t byte_left=entry->GetSize();       //Получить размер
            zip.OpenEntry(*entry);
            wxFileOutputStream unpack_file(path+name);
            while (byte_left > 0){
                //wxMessageBox(wxString::Format("%d",byte_left));
                size_t bytes_read=min((size_t) sizeof(buf),byte_left);
                zip.Read((void*)buf,bytes_read);
                unpack_file.Write((void*)buf,bytes_read);
                //unpack_file.SeekO(0,wxFromEnd);
                //Вычесть прочитанное
                byte_left-=bytes_read;
            }
        }
    }
}

wxArrayString to_arhive; //Хранит список имен файлов.
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

SmileGobo
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jul 30, 2008 8:01 am
Location: Russia/MO
Contact:

Post by SmileGobo » Thu Mar 26, 2009 10:51 pm

Вобщем от части догадка о добавлении к пути файла wxT("\\") оказалась верной. Помимо был косяк в не аккуратном использовании указателей и ссылок (пошел учить матчасть ) :oops: .
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax

User avatar
T-Rex
Moderator
Moderator
Posts: 1188
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Fri Mar 27, 2009 12:38 am

И кстати не wxT("\\"), а wxFILE_SEP_PATH

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Fri Mar 27, 2009 5:38 am

Ну если на то пошло то и у wxFileInputStream есть с-во IsOK чтобы проверить загрузил поток что-то или нет.

Post Reply