Форум программистов, компьютерный форум, киберфорум
Наши страницы

Run-Time Chack Failure #2 - Stack around the variable "lpBuf" was corrupted - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ A star алгоритм (A*) http://www.cyberforum.ru/cpp-beginners/thread586583.html
Вот уже несколько часов ищу рабочий код алгоритма А*, информации действительно море. Но почти вся, что нашел, содержит описание самого алгоритма, как он действует, и как увеличить его скорость и...
C++ Хешированный список Все привет! Как реализовать в основной памяти хешированный список? http://www.cyberforum.ru/cpp-beginners/thread586566.html
C++ Смоделировать бросание каждым из двух игроков трех игральных кубиков
Смоделировать бросание каждым из двух игроков трех игральных кубиков.Определить ,кто из игроков получил большую сумму очков. ПОМОГИТЕ!
Много файловая программа ошибки при компиляции C++
Вроде всё правильно делаю но не работает. Ниже интерфейсы приведены! func.cpp #include"resurse.h" void put(int x) { std::cout<<x<<std::endl;
C++ Массивы: найти сумму, произведение, среднее арифметическое всех чисел массива http://www.cyberforum.ru/cpp-beginners/thread586545.html
1.Задано число X.Сформировать массив, состоящий из Х элементов по правилу Ai=x/i. Найти сумму, произведение, среднее арифметическое всех чисел массива. Вывести на экран контрольные значения....
C++ Найти в текстовом файле одинаковые слова и вывести количество повторений каждого в другой файл Найти в текстовом файле одинаковые слова и вывести количество повторений каждого в другой файл подробнее

Показать сообщение отдельно
tytus
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15

Run-Time Chack Failure #2 - Stack around the variable "lpBuf" was corrupted - C++

25.05.2012, 16:38. Просмотров 262. Ответов 0
Метки (Все метки)

Имеется проецируемый в память файл ( - размер от 1,5 до > 3 Гб).
Проецирую кусками по 64Кб (как советует Рихтер).
Вот кусок кода, где компилятор ругается на повреждение стека переменной:

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
// Объявим переменные для пропуска первой строки в файле, 
    // нахождения поля и конца записи
    BOOL firstLine = FALSE, fieldFinded = FALSE, bufData = FALSE;
    BOOL eom = FALSE;
    // Объявим переменные для доступа к проэцированным данным
    PBYTE lpData = nullptr;     // основной указатель
    PBYTE lpTempData = nullptr; // вспомогательный указатель (для копирования данных с проэцирования)
    size_t len = 0, bufLen = 0;
    // Переменные для копирования данных с проэцирования
    char lpBuf[32] = {0};       // основной буффер
    char lpTempBuf[32] = {0};   // вспомогательный буффер (для хранения данных предыдущего проэцирования)
...
...
lpData = lpBaseData;
lpDataEnd = PBYTE((DWORD)lpBaseData + dwBytesInBlock);
 
// Если в буфере остались данные от предыдущего проэцирования - добавим их в основной буффер                        
        if (bufData)
        {
            ZeroMemory(&lpBuf[0], 32);
            memcpy_s(&lpBuf[0], 32, &lpTempBuf[0], bufLen);
            bufData = FALSE;
        }
        
        // Обходим побайтно проэцирование
        while ((DWORD)lpData < (DWORD)lpDataEnd)
        {
            // Находим символ 0x3B                      
            lpTempData = lpData;
            while (*lpData != 0x3B && *lpData != 0xA)
            {
                ++lpData;
                if ((DWORD)lpData == (DWORD)lpDataEnd)
                    break;              
            }       
            
            if (*lpData == 0xA)
            {
                ++lpData;
                ++qwRecords;
                //fprintf_s(fFields, "\n");
                continue;
            }   
            // Если конец поля найден
            if (fieldFinded = (*lpData == 0x3B))
            {
                // Вычислим длину поля
                len = (size_t)lpData - (size_t)lpTempData;          
                if (len > 0)
                {                   
                    ZeroMemory(&lpBuf[bufLen], 32 - bufLen);
                    memcpy_s(&lpBuf[bufLen], 32 - bufLen, lpTempData, len);
                    lpBuf[bufLen + len] = ';';
                    bufLen = 0; 
                    //fprintf_s(fFields, &lpBuf[0]);
                }
                //else
                //  fprintf_s(fFields, ";");
            }
            ++lpData;           
        }
        // Проверим - завершилась-ли проэкция на середине поля (не до символа 0x3B)     
        if (!fieldFinded)
        {
            bufLen = (size_t)lpData - (size_t)lpTempData - 1;
            if (bufLen > 0)
            {
                ZeroMemory(&lpTempBuf[0], 32);
                memcpy_s(&lpTempBuf[0], 32, lpTempData, bufLen);
                bufData = TRUE;
            }
        }
        
        // Закрываем проэкцию
        UnmapViewOfFile(lpBaseData);
подскажите как с этим бороться.
Я так понимаю - возможная причина появления сего ругательства - выход за границы
массива lpBuf, но такого не может быть в принципе... длина поля в файле между
символами 0x3B ";" - не более 10..15.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.