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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
J10
4 / 4 / 0
Регистрация: 30.04.2011
Сообщений: 50
#1

Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0] - C++

30.04.2011, 14:26. Просмотров 785. Ответов 4
Метки нет (Все метки)

Задан массив из 3 указателей Bitmap, по адресу Bitmap[1] необходимо записать 480*640 элементов из массива Bitmap[0]. В последнем цикле for выдает ошибку при i=2:

Необработанное исключение в "0x004139be" в "Blue.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int i=0;
 
BYTE* Bitmap[3];
 
//Выделяем память
for (i=0; i<=2; Bitmap[i++]=(BYTE *)malloc(480*640*sizeof(BYTE)));
//Заполняем нулями
for (i=0; i<=2; memset(Bitmap[i++],'0', 480*640*sizeof(BYTE)));
 
if (hFile != HFILE_ERROR)
 {
  //Считываем из файла массив 480*640*3 и забиваем его в память по адресам Bitmap
  for (i=0; i<=2; _lread(hFile, Bitmap[i++], 480*640*sizeof(BYTE)));
  //Необходимо перезаписать элементы, начиная с адреса Bitmap[1]
  for (i=0; i<=(480*640-1)*sizeof(BYTE); *(Bitmap+i)[1]=*(Bitmap+i)[0], i+=sizeof(BYTE));
 }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2011, 14:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0] (C++):

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Как сделать функцию от указателя на класс и указателя на метод? - C++
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using namespace...

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Происхродит ли здесь возврат указателя на не действительную память? - C++
double *Gaus(double **Matix, double *Frees, int N) { double **DownRow; double *DownFree; int i; double **UpnRow; double...

4
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.04.2011, 16:05 #2
В конструкции for должны располагаться только команды управления циклом. То, что язык позволяет написать ТАКОЕ, как в приведённом коде, не означает, что так нужно делать. Этот код не поддаётся трассировке и отладке. Поэтому я не буду говорить где в нём ошибка, пока нормально циклы не напишите.
1
J10
4 / 4 / 0
Регистрация: 30.04.2011
Сообщений: 50
30.04.2011, 18:24  [ТС] #3
Отредактировал код. Как я понимаю он при i=0 записывает элемент, находящийся по адресу Bitmap[0] в ячейку, находящийся по адресу Bitmap[1], а вот при i=1 происходит какая то непонятная ситуация - он начинает запись элемента с адреса Bitmap[1] в ячейку Bitmap[2].

Почему? *(Bitmap+i)[...] разве ведет не на следующий элемент указателя Bitmap[...]?

Что то я запутался... o.O

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
 int i=0;
 
 BYTE* Bitmap[3];
 
 //Выделяем память
 for (i=0; i<=2; i++)
 {
     Bitmap[i]=(BYTE *)malloc(480*640*sizeof(BYTE));
 }
 //Заполняем нулями
 for (i=0; i<=2; i++)
 {
     memset(Bitmap[i],'0', 480*640*sizeof(BYTE));
 }
  if (hFile != HFILE_ERROR)
 {
  //Считываем из файла массив 480*640*3 и забиваем его в память по адресам Bitmap
  for (i=0; i<=2; i++)
  {
      _lread(hFile, Bitmap[i], 480*640*sizeof(BYTE));
  }
  //Необходимо перезаписать элементы, начиная с адреса Bitmap[1]
  for (i=0; i<=(480*640-1)*sizeof(BYTE); i+=sizeof(BYTE))
  {
      *(Bitmap+i)[1]=*(Bitmap+i)[0];
  }
 }
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.04.2011, 19:06 #4
Молодец.
Вместо "i+=sizeof(BYTE)" достаточно i++
Вместо "*(Bitmap+i)[1]=*(Bitmap+i)[0];" "Bitmap[1][i] = Bitmap[0][i];"
1
J10
4 / 4 / 0
Регистрация: 30.04.2011
Сообщений: 50
30.04.2011, 22:07  [ТС] #5
Спасиб
0
30.04.2011, 22:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2011, 22:07
Привет! Вот еще темы с ответами:

Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с первого бита - C++
Ввести целое A. Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с ервогоп бита. B=1A05h.

Каким образом выделяется память при инициализации строковой константой указателя - C++
Доброго времени суток. Хотелось бы более подробно узнать некоторые моменты относительно указателей и динамического выделения памяти....

Bitmap reader - C++
Мне необходимо реализовать медианный фильтр используя технологию CUDA. Я нашёл практически готовый код...

Работа с BITMAP - C++
Здравствуйте. Подскажите плз. нет ли в c++ стандартной функции преобразования BITMAP из 32-х битного в 1-битный.Я имею в виду чтобы каждый...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.