Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24

Помогите выловить баг, сил моих больше нету(((

06.04.2011, 11:06. Показов 2103. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа глючит при добавлении больших структурированных каталогов, раньше думал, что ошибка выделения памяти, оказалось нет...Очень надо помощь спеца, СРОЧНО!!!
Конструктор класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CStorage::CStorage()
{
    CoInitialize(NULL);
    GetTempPath(MAX_PATH,szTMP);
    GetShortPathName(szTMP,szTMP,MAX_PATH);
    lpszW = (WCHAR *)malloc(sizeof(WCHAR));
    lpBuf = malloc(sizeof(char));
    //MEM_TOP_DOWN
/*  pDATA = (WIN32_FIND_DATA *)VirtualAlloc
                        (
                            (void *)&pDATA,
                            sizeof(WIN32_FIND_DATA),
                            MEM_COMMIT  ,
                            PAGE_READWRITE
                        );*/
    pDATA = (WIN32_FIND_DATA *)malloc(sizeof(WIN32_FIND_DATA));
    pFile = NULL;
    m_hWnd= NULL;
    nStgElm= 0;
    uStgLen= 0;
    pDATA[nStgElm].dwReserved1 = 0;
    iINDENT = 0;
}
Рекурсивный поиск каталогов, ошибка вылетает в try - catch блоке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
WIN32_FIND_DATA * CStorage::MkPathList(LPCTSTR szPath)
{
    WIN32_FIND_DATA pFILE_DATA;ULONG uIND = nStgElm; 
    pDATA[nStgElm].dwFileAttributes = GetFileAttributes(szPath);
    pDATA[nStgElm].dwReserved1      = iINDENT;
    HANDLE hFile = CreateFile(
        strcpy(pDATA[nStgElm].cFileName,szPath), 
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL, 
            OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        uStgLen += (pDATA[nStgElm].nFileSizeLow = GetFileSize(hFile,NULL));
        CloseHandle(hFile);
    }
    else
    {
        if(strcmp(pDATA[nStgElm].cFileName,"") == 0)
           strcpy(pDATA[nStgElm].cFileName,"+");
        sprintf(pFILE_DATA.cFileName,"%s\\*.*",pDATA[nStgElm].cFileName);
        hFile = FindFirstFile(pFILE_DATA.cFileName,&pFILE_DATA);
        if(hFile != INVALID_HANDLE_VALUE)
        {
            iINDENT++;
            pDATA[(uIND = nStgElm)].nFileSizeLow = uStgLen;
            pDATA = (WIN32_FIND_DATA *)realloc
                        (
                            (void *)pDATA,
                            sizeof(WIN32_FIND_DATA)*(1 + (nStgElm = nStgElm + 1))
                        );
            do
            {
                if(strcmp(pFILE_DATA.cFileName,".")  == 0 ||
                   strcmp(pFILE_DATA.cFileName,"..") == 0)
                    continue;
                else
                {
                    pFILE_DATA.dwReserved1 = iINDENT;
                    pDATA[nStgElm] = pFILE_DATA;
                    sprintf(pDATA[nStgElm].cFileName,"%s\\%s",szPath,pFILE_DATA.cFileName);
                    if(FILE_ATTRIBUTE_DIRECTORY & pFILE_DATA.dwFileAttributes)
                    try
                    {
                        MkPathList(pDATA[nStgElm].cFileName);
                    }
                    catch(...)
                    {
                        iINDENT--;
                        //MessageBox(m_hWnd,strerror(GetLastError()),"ERROR",MB_OK);
                    }
                    else
                    {
                        uStgLen += pFILE_DATA.nFileSizeLow;
                        pDATA = (WIN32_FIND_DATA *)realloc
                                    (
                                        (void *)pDATA,
                                        sizeof(WIN32_FIND_DATA)*(2 + (nStgElm = nStgElm + 1))
                                    );
                    }
                    PumpMessages(m_hWnd);
                }
            }
            while(FindNextFile(hFile,&pFILE_DATA) != 0);
            FindClose(hFile);
            pDATA[uIND].nFileSizeLow = uStgLen - pDATA[uIND].nFileSizeLow;
            iINDENT--;
        }
    }
    return pDATA;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.04.2011, 11:06
Ответы с готовыми решениями:

Перевод из си в ассемблер.Сил моих больше нет.
Вообщем,задача состоит в следующем перевести сишный код в ассемблерный. Часть кода есть,но т.к. писался он в ускоренном темпе,то есть...

Огненная обезьяна WebBrowser (нет сил моих больше)
Уважаемые программисты! Взываю к Вашей любви к искусству программировать. Столкнулся (и бьюсь об неё до сих пор) с одной проблемой,...

Сил моих больше нет учиться в колледже на программиста
Здравствуйте, ищу совета. Учусь в колледже на программиста, но с каждым днём там у меня буквально физически отбивают это желание. Доучился...

15
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.04.2011, 07:54
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ошибка вылетает в try - catch блоке
Ты б его хоть показал, а то телепат всего то один, да и тот на форуме игроделов.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.04.2011, 09:06
taras atavin, 45-52 строчка во втором листинге
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.04.2011, 09:24
Вылетает конкретно на 51-й? Если кач вообще сработал, то ищи, откуда выплыло само исключение. И iINDENT где то объявлен и мне просто опять не по глазам? Какой у него тип?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.04.2011, 09:39  [ТС]
taras atavin, программа вылетает при рекурсивном вызове функции MkPathList и то при большой вложенности подкаталогов, это сначало наталкнуло меня на мысль что realloc не справляется с выделением памяти, но если бы происходили косяки с выделением памяти блок-памяти отведенный под pDATA обнулялся, а так с трай кэтч прога работает дальше. Я специально не хочу вводить в СStorage лист-контрол куда и осуществляю выгрузку результатов поиска, этот класс хочу юзать как для консолей так и диалоговых приложений. Параметр iINDENT отвечает за сдвиг иконок в листбоксе, т.е. указывает на вложенность подкаталога, вот привожу скриншот работы проги
Миниатюры
Помогите выловить баг, сил моих больше нету(((  
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.04.2011, 09:44
Так с отловленным исключением всё работает? Тогда сделай лог и вывод максимально расширенного сообщения об исключении и ищи, откуда оно лезет.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.04.2011, 09:46  [ТС]
PS: iINDENT = 0; - 22-ая строчка в конструкторе, в объяве мог не показать, вырезал класс с проги
ну и сокращал
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.04.2011, 09:47
Каков полный путь к тому файл/подкаталогу, на котором выскакивает исключение? Какой он длины, сколько в нём уровней? Допустимо ли это с точки зрения как системы в целом, так и конкретно используемых функций.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.04.2011, 09:49  [ТС]
Та пишет i/o error и всё - мне этого мало чтобы выявить баг. Ввёл рапорт об ошибке, но тоже мало чем помогло(((

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CString CStgMakerDlg::StrWinError(HRESULT hRes)
{
    CString str;
    str.Format("\r\nHRESULT : 0x%p\r\n(int)hRes : %d\r\n",hRes,hRes);
    str+="ERRMSG  : ";
    LPSTR errString = NULL;  // will be allocated and filled by FormatMessage
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM, // use windows internal message table
        0,       // 0 since source is internal message table
        hRes,    // this is the error code 
                          // Could just as well have been an error code from generic
                          // Windows errors from GetLastError()
        0,       // auto-determine language to use
        (LPSTR)&errString,
        0,       // min size for buffer
        0 ); 
    return str += errString;
}
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.04.2011, 09:50
Может быть ты просто влез в ограничение?

Добавлено через 55 секунд
А i/o егор - это ошибка обращения к диску.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.04.2011, 17:22  [ТС]
taras atavin я перепаял прогу вобщем прога вылетает в try_catch который приведен в коде ниже, причём для каждого каталог в одном конкретном месте, в некоторых каталогах вообще исключения нет,
strerror пишет Improper link. Моё предположение что FindFirstFile обнуляет pFILE_DATA и вот здесь
C++
1
pDATA[nStgElm] = pFILE_DATA;
мы делаем
C++
1
 pDATA[nStgElm] = NULL
Помоги как можно исключение обрабоать???
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
do
            {
                if(strcmp(pFILE_DATA.cFileName,".")  == 0 ||
                   strcmp(pFILE_DATA.cFileName,"..") == 0)
                    continue;
                else
                {
                    pFILE_DATA.dwReserved1 = iINDENT;
                    try
                    {
                    pDATA[nStgElm] = pFILE_DATA;
                    sprintf(pDATA[nStgElm].cFileName,"%s\\%s",szPath,pFILE_DATA.cFileName);
                    }
                    catch(...)
                    {
                        sprintf
                            (
                                chERR,
                                "do-while: begin\r\n%s\r\n%s\r\n%s\r\n%s",
                                strerror(GetLastError()),
                                pDATA[nStgElm - 2].cFileName,
                                pDATA[nStgElm - 1].cFileName,
                                pFILE_DATA.cFileName
                            );
                        MessageBox(m_hWnd,chERR,strerror(GetLastError()),MB_OK);
                    }
                    if(FILE_ATTRIBUTE_DIRECTORY & pFILE_DATA.dwFileAttributes)
                        MkPathList(pDATA[nStgElm].cFileName);
                    else
                    {
                        uStgLen += pFILE_DATA.nFileSizeLow;
                        pDATA = (WIN32_FIND_DATA *)realloc
                                    (
                                        (void *)pDATA,
                                        sizeof(WIN32_FIND_DATA)*(1 + (nStgElm = nStgElm + 1))
                                    );
                    }
                    PumpMessages(m_hWnd);
                }
            }
            while(FindNextFile(hFile,&pFILE_DATA) != 0);
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
12.04.2011, 08:22
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
обнуляет pFILE_DATA
То есть файл просто не найден? В сообщении об исключении выведи значение pFILE_DATA для проверки, потом сделай проверку ифом.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
12.04.2011, 08:38
Может срабатывает ограничение на длину имени файла???
макрос есть MAXPACH по моему.
определен в 255
попробуй добавить.
где то писал рекурсивный поиск файлов
найду исходник вышлю

Добавлено через 2 минуты
GetLastError() что пишет
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
12.04.2011, 09:47  [ТС]
Баг уже выловил - как оказалось при определённой структуре внутренних подкаталогов добавляемой дирректории, происходит перекрытие блока памяти в котором содержится LPCTSTR szPath, в резулльтате szPath == NULL, об этом говорит указанный скриншот, проблемму решил введением дополнительной строковой переменной для хранения пути к каталогу, все проблеммы исчезли!
Ребят спасибо всем за участие!
Миниатюры
Помогите выловить баг, сил моих больше нету(((  
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
12.04.2011, 19:40
C++
1
2
3
4
5
6
7
8
9
10
11
12
typedef struct _WIN32_FIND_DATA {  
DWORD dwFileAttributes; 
 FILETIME ftCreationTime; 
 FILETIME ftLastAccessTime; 
 FILETIME ftLastWriteTime; 
 DWORD nFileSizeHigh;
  DWORD nFileSizeLow; 
 DWORD dwReserved0; 
 DWORD dwReserved1;
 TCHAR cFileName[MAX_PATH]; 
TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA
TCHAR cFileName[MAX_PATH]; !!!!
WinDef.h
C++
1
#define MAX_PATH          260
о чем я и писал
преопредели MAX_PATH
сделай 1024 и ошибка должна исчезнуть
хотя наверно можно найти и более длинное имя файла
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.04.2011, 10:26  [ТС]
ValeryS, пасибо за участие, но как уже говорил выше я нашёл решение и даже без ввода доп строковой переменной, вот оно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
WIN32_FIND_DATA * CStorage::MkPathList(LPCTSTR szPath)
{
    WIN32_FIND_DATA pFILE_DATA;ULONG uIND = nStgElm; 
    pDATA[nStgElm].dwFileAttributes = GetFileAttributes(szPath);
    pDATA[nStgElm].dwReserved1      = iINDENT;
    HANDLE hFile = CreateFile(
        strcpy(pDATA[nStgElm].cFileName,szPath), 
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL, 
            OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        uStgLen += (pDATA[nStgElm].nFileSizeLow = GetFileSize(hFile,NULL));
        CloseHandle(hFile);
        pDATA = (WIN32_FIND_DATA *)realloc
            (
                    (void *)pDATA,
                    sizeof(WIN32_FIND_DATA)*(1 + (nStgElm = nStgElm + 1))
            );
    }
    else
    {
        pFILE_DATA.cFileName[0] = '\0';
        if(strcmp(pDATA[nStgElm].cFileName,"") != 0)
            sprintf(pFILE_DATA.cFileName,"%s\\*.*",pDATA[nStgElm].cFileName);
        hFile = FindFirstFile(pFILE_DATA.cFileName,&pFILE_DATA);
        if(hFile != INVALID_HANDLE_VALUE)
        {
            iINDENT++;
            pDATA[(uIND = nStgElm)].nFileSizeLow = uStgLen;
            pDATA = (WIN32_FIND_DATA *)realloc
                        (
                            (void *)pDATA,
                            sizeof(WIN32_FIND_DATA)*(1 + (nStgElm = nStgElm + 1))
                        );
            do
            {
                if(strcmp(pFILE_DATA.cFileName,".")  == 0 ||
                   strcmp(pFILE_DATA.cFileName,"..") == 0)
                    continue;
                else
                {
                    //GetShortPathName(pDATA[uIND].cFileName,pDATA[nStgElm].cFileName,MAX_PATH);
                    sprintf
                        (
                            pDATA[nStgElm].cFileName,
                            "%s\\%s",
                            pDATA[uIND].cFileName,
                            pFILE_DATA.cFileName
                        );
                    pDATA[nStgElm].dwReserved1 = iINDENT;
                    pDATA[nStgElm].nFileSizeLow = pFILE_DATA.nFileSizeLow;
                    if(FILE_ATTRIBUTE_DIRECTORY & pFILE_DATA.dwFileAttributes)
                        MkPathList(pDATA[nStgElm].cFileName);
                    else
                    {
                        uStgLen += pFILE_DATA.nFileSizeLow;
                        pDATA = (WIN32_FIND_DATA *)realloc
                                    (
                                        (void *)pDATA,
                                        sizeof(WIN32_FIND_DATA)*(1 + (nStgElm = nStgElm + 1))
                                    );
                    }
                    PumpMessages(m_hWnd);
                }
            }
            while(FindNextFile(hFile,&pFILE_DATA) != 0);
            FindClose(hFile);
            pDATA[uIND].nFileSizeLow = uStgLen - pDATA[uIND].nFileSizeLow;
            iINDENT--;
        }
    }
    return pDATA;
}
В заключение скажу что сама XP поддерживает имена в 256 символовов и имя длинней 256 символов дать файлу не удасться, ну как например дать новому каталогу имя conЕщё раз всем спасибо за участие
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.04.2011, 10:26
Помогаю со студенческими работами здесь

Сложный запрос, нету сил больше
Есть таблица в которой много полей, выбрать нужно все. Есть 2 поля с помощью которых нужно сформировать ответ - code (название,...

С++Builder сил моих не хватает
Задача. В одномерном массиве, состоящем из 14 вещественных элементов, вычислить: 1) минимальный элемент массива; 2) сумму элементов,...

Сил моих нет Денвер постоянно ругается на рабочие коды
Warning: session_start() : Cannot send session cookie - headers already sent by (output started at...

Сил больше нет!
Всем привет! Комп - мать asus p8p67 rex1.xx, i5, gtx650, 8gb оперативки Проблема следующая: 1. Высокая температура ЦП - почистил...

Виснет компьютер, сил больше нет
Здравствуйте, видел уже много подобных ситуаций, но ни один из советов мою проблему не решил. Начну с начала, купил компьютер.Windows XP...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru