6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
1

Переполнение буфера

13.05.2013, 00:46. Показов 7418. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите, пожалуйста кто-нибудь, в чем беда... Во время выполения программы пишет, что буфер переполнен, что точка останова смещена и "Дополнительные сведения см. в разделе "Инструкции по отладке в случае переполнения буфера"". Как справиться с сией проблемой? Что нужно изменять в коде программы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2013, 00:46
Ответы с готовыми решениями:

переполнение буфера
Что такое переполнение буфера?

Переполнение буфера
Добрый день! В общем: #include "stdafx.h" #include <iostream> using namespace std; int...

Переполнение буфера
Не могу найти, где у меня ошибка, выдает переполнение буфера, подскажите пожалуйста. Здесь...

Переполнение буфера
В программе имеется форма и записывается текстовые файлы. Когда она запускается всё работает...

26
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
13.05.2013, 00:49 2
без кода ничего никто не скажет. какой буфер, где и при каких условиях.
в таких случаях кэп советует
см. в разделе "Инструкции по отладке в случае переполнения буфера""
0
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 01:09  [ТС] 3
Вот код программы:
Заголовочный файл класса
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
#pragma once
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include "bmp_structs.h"
using namespace std;
 
class BMP
{
public:
    BitMapHeader bh;
    BitMapInfoHeader bih;
    RGBQUAD RGBQuad[256];
    BMP();
    void ReadQuad(RGBQUAD* RGB, int biSize, char* filename);
    void France_flag(char* filename);
 
    BMP read_BMP_info(char* filename);
    
    
    friend struct BitMapHeader;
    friend struct BitMapInfoHeader;
    friend struct RGBQUAD;
    ~BMP();
    
    
};
Файл описания методов

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
#include "StdAfx.h"
#include "BMP.h"
 
 
BMP::BMP()
{
}
 
 
void BMP::ReadQuad(tagRGBQUAD* RGB, int biSize, char* filename)
{
    fstream f(filename, ios::binary | ios::out | ios::in | ios::ate);
    f.seekg(biSize, SEEK_SET);
    f.read((char*)& RGB, 1024);
    f.close();
}
BMP BMP::read_BMP_info(char* filename)
{
    BMP h;
    fstream f(filename,ios::binary | ios::out | ios::in | ios::ate);
    f.seekg(0, ios::beg);
    f.read((char*)& h.bh,sizeof(bh));
    f.read((char*)& h.bih,sizeof(bih));
    h.ReadQuad(RGBQuad, h.bih.biSize + 14, filename);
    f.close();
    return h;
}
void BMP::France_flag(char* filename)
{
    BMP h;
    fstream f(filename, ios::binary | ios::out | ios::in | ios::ate);
    h.read_BMP_info(filename);
    f.seekg(h.bh.bfOffbits + 14, ios::beg);
    int n = h.bih.biHeight / 3;
    int m = h.bih.biWidth;
    tagRGBQUAD* part1 = new tagRGBQUAD [n * m] ;
    tagRGBQUAD* part2 = new tagRGBQUAD [n * m];
    tagRGBQUAD* part3 = new tagRGBQUAD [n * m];
    for(int i = 0; i < n * m; i ++)
    {
        part1[i].rgbBlue = 255;
        part2[i].rgbBlue = 255;
        part3[i].rgbBlue = 0;
        part1[i].rgbGreen = 255;
        part2[i].rgbGreen = 0;
        part3[i].rgbGreen = 0;
        part1[i].rgbRed = 255;
        part2[i].rgbRed = 0;
        part1[i].rgbRed = 255;
    }
    f.seekg(h.bh.bfOffbits + 14, ios::beg);
    f.write((char*)& part1, sizeof(part1));
    f.write((char*)& part2, sizeof(part2));
    f.write((char*)& part3, sizeof(part3));
    f.close();
    
    
}
BMP::~BMP()
{
}
И файл описания структур для BMP файлов:
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
typedef unsigned short int word; 
typedef unsigned int dword;
#pragma pack(push)
#pragma pack(1)
 
struct BitMapHeader
{
word bfType; 
dword bfSize; 
word bfReserved1;  
word bfReserved2;  
dword bfOffbits; 
};
 
struct BitMapInfoHeader
{
dword biSize ; 
dword biWidth;
dword biHeight; 
word biPlanes;
word biBitCount;  
dword biCompression; 
dword biSizeImage; 
dword biXPelPerMeter; 
dword biYPelPerMeter;  
dword biClrUsed;  
dword biClrImportant;
};
typedef unsigned char BYTE;
 
#pragma pack(pop)
 
struct RGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
};
Это класс для работы с BMP файлами и методом для рисования французского флага

Добавлено через 2 минуты
И выделенный момент с ошибкой:

"8-bit_BMP.exe": Загружено: "D:\Vs\8-bit_BMP\Debug\8-bit_BMP.exe", Символы загружены.
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\ntdll.dll", Невозможно найти или открыть файл PDB
"8-bit_BMP.exe": Загружено: "C:\Program Files\AVAST Software\Avast\snxhk.dll", Невозможно найти или открыть файл PDB
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\kernel32.dll", Невозможно найти или открыть файл PDB
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\KernelBase.dll", Невозможно найти или открыть файл PDB
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\msvcp100d.dll", Символы загружены.
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\msvcr100d.dll", Символы загружены.
Первый этап обработки исключения в "0x00af5286" в "8-bit_BMP.exe": 0xC0000005: Нарушение прав доступа при чтении "0x999999a5".
В 8-bit_BMP.exe возникло переполнение буфера, что привело к повреждению внутреннего состояния программы. Нажмите кнопку "Прервать", чтобы отладить программу, или кнопку "Продолжить", чтобы завершить программу.

Дополнительные сведения см. в разделе "Инструкции по отладке в случае переполнения буфера".
В 8-bit_BMP.exe возникло переполнение буфера, что привело к повреждению внутреннего состояния программы. Нажмите кнопку "Прервать", чтобы отладить программу, или кнопку "Продолжить", чтобы завершить программу.

Дополнительные сведения см. в разделе "Инструкции по отладке в случае переполнения буфера".

STATUS_STACK_BUFFER_OVERRUN encountered
8-bit_BMP.exe привело в действие точку остановка
Программа "[7212] 8-bit_BMP.exe: Машинный код" завершилась с кодом -1073740791 (0xc0000409).
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
13.05.2013, 01:22 4
осваивайте отладку программ.
в студии с этим все просто.
беглый взгляд падает на строку 14:
f.read((char*)& RGB, 1024);

возможно хотелось так:
f.read((char*)RGB, 1024);
1
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 01:29  [ТС] 5
Исправление этого момента помогло..Немного. Теперь буфер не переполняется, но все равно программа падает
Миниатюры
Переполнение буфера  
0
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 01:30  [ТС] 6
Как я понимаю, ему не нравится размер, вот только размер чего? И почему не нравится?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.05.2013, 08:19 7
Цитата Сообщение от Eagle123 Посмотреть сообщение
Как я понимаю, ему не нравится размер, вот только размер чего? И почему не нравится?
Судя по ошибке на картинке имеется попытка выделения памяти, задав отрицательное число, которое в итоге интерпретируется как слишком большое положительное.
0
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 08:24  [ТС] 8
C++
1
2
3
4
5
 int n = h.bih.biHeight / 3;
    int m = h.bih.biWidth;
    tagRGBQUAD* part1 = new tagRGBQUAD [n * m] ;
    tagRGBQUAD* part2 = new tagRGBQUAD [n * m];
    tagRGBQUAD* part3 = new tagRGBQUAD [n * m];
НАверное это в этом моменте?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
13.05.2013, 08:36 9
Eagle123,
вот на этой картинке что ты привел
нажми продолжить
программа упадет еще раз
тогда нажми прервать
и попадешь в отладчик на точку что вызвала исключение
скорее всего попадешь в какую нибудь системную функцию
тогда идешь в отладчике в окошка стека
там будет список функций которые вызваны до аварии
просмотри их сверху вниз и тогда дойдешь до строки с неправильными параметрами
1
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 14:40  [ТС] 10
Цитата Сообщение от Eagle123 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
BMP BMP::read_BMP_info(char* filename)
{
* * BMP h;
* * fstream f(filename,ios::binary | ios::out | ios::in | ios::ate);
* * f.seekg(0, ios::beg);
* * f.read((char*)& h.bh,sizeof(bh));
* * f.read((char*)& h.bih,sizeof(bih));
* * h.ReadQuad(RGBQuad, h.bih.biSize + 14, filename);
* * f.close();
* * return h;
}
Разобрался. Надо было переделать немного эту функцию
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.05.2013, 14:46 11
Цитата Сообщение от Eagle123 Посмотреть сообщение
Надо было переделать немного эту функцию
Что в итоге?
0
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 18:46  [ТС] 12
В итоге считывается информация из файла правильно, и массив создается тоже верно.
И все бы хорошо, только рисует не флаг, а вот это.
Миниатюры
Переполнение буфера  
0
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 18:47  [ТС] 13
Вот функция, которая это рисует. Что-то тут не так
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
void BMP::France_flag(char* filename)
{
    BMP h;
    fstream f(filename, ios::binary | ios::out | ios::in);
    h.read_BMP_info(filename);
    
    
    unsigned int n = h.bih.biHeight;
    unsigned int m = h.bih.biWidth;
    
    BYTE* Str = new BYTE [m];
    for(int i = 0; i < m / 3; i ++)
        Str[i] = 0xCC;
    for(int i = m / 3; i < 2 * (m / 3); i ++)
        Str[i] = 0xFF;
    for(int i = 2 * (m / 3); i < m; i ++)
        Str[i] = 0x99;
 
    f.seekg(h.bh.bfOffbits, ios::beg);
    int counter = 0;
    while(counter != h.bih.biHeight)
    {
        f.write((char*)Str, h.bih.biWidth);
        counter ++;
    }
    
    f.close();
    
    
}
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
13.05.2013, 19:12 14
Eagle123,
А ты откуда берешь размеры
Из заголовка файла?
а ты учел что там два размера размер картинки и размер буфера выравненный то ли на 2 то ли на 4 (нет сейчас спецификации под рукой) и они могут различаться
и учти что в BMP шке картинка размещена вверх ногами
т.е самая нижняя строчка в буфере самая первая

Добавлено через 1 минуту
Да и с палирой разберись ты видать её не загружаешь
у французского флага никак не такие цвета
1
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 19:22  [ТС] 15
С цветами все нормально. Там если увеличить, то видны нужные полосы (синего, белого и красного цветов). Только на картинке они накладываются друг на друга... Получается, если запись идет с конца, то надо делать не сине-бело-красный, а красно-бело-синий флаг?? А вот с размерами теперь не ясно, там же в структуре заголовка только одна длина и ширина?

Еще нашел, что надо учитывать кол-во байтов на пиксель..Это так?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
13.05.2013, 19:36 16
http://www.firststeps.ru/mfc/msdn/r.php?114
Вот это
22h 4 biSizeIm Размер изображения в байтах
и это
12h 4 biWidth Ширина Bitmap-а в пикселях
16h 4 biHeight Высота Bitmap-а в пикселях

Добавлено через 3 минуты
Цитата Сообщение от Eagle123 Посмотреть сообщение
Еще нашел, что надо учитывать кол-во байтов на пиксель..Это так?
ну очень просто если у тебя 24 битное изображение
то считываешь
1 байт красный
2 байт зеленый
3 байт синий
4 зарезервирован
т.е на одну точку считывать нужно 4 байта
если 256 цветов то на одну точку 1 байт
а если двухцветное изображение то один байт на 8 точек

Добавлено через 44 секунды
вот еще http://c-site.h1.ru/infa/bmp_struct.htm
сноску почитай
1
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 19:40  [ТС] 17
Размер изображения в байтах = 226000, размер в пикселях т.е. h.bih.biHeight * h.bih.biWidth = 900 * 500 = 450000. И по каким размерами тогда составлять массив для цветов и записывать его, по байтам??

Добавлено через 2 минуты
Изображение 16-ти цветное
0
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 19:47  [ТС] 18
Изменил началиный размер изображения ( сделал размеры сторон кратные 4), получилось вот так
Миниатюры
Переполнение буфера  
0
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
13.05.2013, 19:51  [ТС] 19
Но сразу заметно, что изображение закрашено не полностью, видны какие-то полосы. Поэтому цвета так смешиваются
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
13.05.2013, 20:49 20
Цитата Сообщение от Eagle123 Посмотреть сообщение
Изображение 16-ти цветное
сделай сначала полноцветное изображение (32 бита на пиксел) разберись с ним
или поройся в сети найди готовые библиотеки
0
13.05.2013, 20:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2013, 20:49
Помогаю со студенческими работами здесь

Переполнение буфера
Объясните почему вылетает ошибка и помогите исправить. Зарание спасибо возникло переполнение...

Переполнение буфера! (наверное)
Идет открытие порта звуковой карты, получение битов, запись битов в буфер и дальнейшие манипуляции...

Переполнение буфера . Что делать ?
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main() {...

Переполнение буфера при вводе
Есть код char arr; cin &gt;&gt; arr; Он работает, но не очень понятно как, и судя по всему имеет...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru