Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
1

Чтение участка памяти

03.05.2013, 21:12. Просмотров 1556. Ответов 9
Метки нет (Все метки)

Ищу, но не могу найти... Дело в том, что мне нужно в массиве выделять блоки по 4 элемента. Все было бы хорошо, если бы массив был бы у меня кратного 4м размера. Вот я и собираюсь, когда подойду к краю массива все равно прочитать 4 элемента, а затем затереть то, что прочитал лишнего(Саму помять за массивом я понятное дело трогать не буду). Так вот, возможно ли такое, что я не смогу прочитать элементы за пределом массива и выскочит что-нибудь типа "Memory is not readable"?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2013, 21:12
Ответы с готовыми решениями:

tbb parallel_for чтение одного участка памяти разными потоками
Добрый день. Предположим, нужно распараллелить свертку одного и того же изображения разными...

Освобождение участка памяти
Добрый вечер. Подскажите, пожалуйста, где здесь ошибка. В разделе "После освобождения памяти"...

Двойное освобождение одного и того же участка памяти
Всем привет! Помогите разобраться. Я написала в своем коде такую штуку: digits = X.digits; ...

Чтение памяти
Не могу понять почему не читается память по адрессу, уже 3 дня гуглю. #include<windows.h>...

9
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
03.05.2013, 21:42 2
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Так вот, возможно ли такое, что я не смогу прочитать элементы за пределом массива и выскочит что-нибудь типа "Memory is not readable"?
Очень может быть. Что мешает выделить-таки массив с числом элементов, кратным четырём? Так ли много займут максимум три лишних элемента?
0
Модератор
Эксперт по электронике
8231 / 6098 / 814
Регистрация: 14.02.2011
Сообщений: 21,181
03.05.2013, 21:51 3
nonedark2008,
это делается примерно так
посмотри исходники memcpy пример из Вики
http://ru.wikipedia.org/wiki/Memcpy
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int i, m;
unsigned long  *wdst = dst;  // текущая позиция в буфере назначения
unsigned long  *wsrc = src;  // текущая позиция в источнике
unsigned char  *cdst, *csrc;
 
for(i = 0, m = n / sizeof(long); i < m; i++)  // копируем основную часть блоками по 4 или 8 байт
   *(wdst++) = *(wsrc++);                     // (в зависимости от платформы)
 
cdst = (unsigned char*)wdst;
csrc = (unsigned char*)wsrc;
 
for(i = 0, m = n % sizeof(long); i < m; i++)             // остаток копируем побайтно
   *(cdst++) = *(csrc++);
 
return dst;
т.е сначала копируем блоками по 4 байта а остатки побайтно и скорость и за пределы не выйдешь
а если кратно 4(8) то вторая часть вообще не будет исполнятся
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
03.05.2013, 21:55  [ТС] 4
NoMasters, мешает то, что у меня куча других алгоритмов основано на том, что память у меня именно такой длинны, какая есть. Поэтому случится коллапс...

Добавлено через 2 минуты
ValeryS, все было бы хорошо, но я могу либо читать именно по 4 элемента, либо читать все по одному элементу. Но тогда мое решение разобъется на две части, которые будут повторяться. Первая работает с группами по 4, а вторая - по одному элементу. Хотя функционал у них будет один и тотже.
0
Модератор
Эксперт по электронике
8231 / 6098 / 814
Регистрация: 14.02.2011
Сообщений: 21,181
03.05.2013, 22:02 5
Цитата Сообщение от nonedark2008 Посмотреть сообщение
ValeryS, все было бы хорошо, но я могу либо читать именно по 4 элемента, либо читать все по одному элементу.
элемент это байт???
да и если нет что мешает привести типы?
сформулируй задачу конкретней?
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
03.05.2013, 22:39  [ТС] 6
Цитата Сообщение от ValeryS Посмотреть сообщение
элемент это байт???
Нет, элемент - это 32 битное число.
Типы привести не получится.
Мне именно нужно было знать, может ли возникнуть ошибка, если я прочитаю память, которая находится за пределами массива. Оказывается - может.
Все дело в том, что мне нужно было прочитать 128бит данных в регистр из массива, но вот на границе массива возникает такая трабла.
0
Модератор
Эксперт по электронике
8231 / 6098 / 814
Регистрация: 14.02.2011
Сообщений: 21,181
03.05.2013, 23:01 7
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Нет, элемент - это 32 битное число.
т.е unsigned int ( я про 32 битные системы)

а прочитать нужно 4 инта
правильно?

ну примерно так

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
struct MyStruct
{
 int a1;
 int a2;
 int ar3;
 int a4;
}
 
MyStruct MyRead(MyStruct*bloc,size_t sizeBloc,int offset)
 {
   MyStruct ms;
   int * intBloc=(int*)bloc;
      int * MSBloc=(int*)ms;
   if( (sizeBloc%sizeof(MyStruct))==0 &&(offset%sizeof(int))==0 )
      // если размер кратен  MyStruct и смещение лежит на границе int
     // то используем какую то быструю функцию    
   
   else// иначе копируем поэлементно 
    {
     ms.a1=ms.a2=ms.a3=ms.a4=0;
      for(int i=offset;i<sizeBloc;i++)
      *MSBloc++=intBloc++;
     }
  return  ms;
}
это только идея
я например не проверял если размер блока 8 а смещение 6

а как ты пытаешься быстро скопировать 128 бит ?
в ассемблере все равно будет работа с указателями на 32битные числа

может посему не заморачиватся а работать с указателями?
1
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
04.05.2013, 01:28  [ТС] 8
Цитата Сообщение от ValeryS Посмотреть сообщение
а как ты пытаешься быстро скопировать 128 бит ?
Я загружаю 128 бит в регистр xmm при помощи команды movdqa.
Кстати, есть у меня еще одна проблема. В ассемблерной вставке.
У меня есть такая строка:
Assembler
1
pinsrd xmm0, dword ptr [eax + ebx * 4], edx;
И вот компилятор ругается на edx, пишет "Improper operand type". По документации сказано, что он должен быть типа imm8. Если просто написать 0 либо 1, то все компилирует. Что делать - вообще не понимаю T_T

Не по теме:


В разделе по асме я уже спросил, но может и тут найдутся знающие люди?

0
Модератор
Эксперт по электронике
8231 / 6098 / 814
Регистрация: 14.02.2011
Сообщений: 21,181
04.05.2013, 09:51 9
не могу ничего подсказать в современном Асме не силен
но по своему опыту могу сказать что встроенный ассемблер обычно обрезанный
по сему лучше писать на нормальном а объектный файл уже прилинковать к программе
или создать библиотеку
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
04.05.2013, 11:33  [ТС] 10
ValeryS, спасибо. Но я тоже в нем не силен. Пишу от силы второй день.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2013, 11:33

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Чтение из памяти
добрый день, нужна помощь у же не знаю что я не так делаю , вернее как мне нужно сделать void...

чтение из памяти
господа допустим есть - int a=5; мне нужно получить адрес переменной &quot;а&quot; и из адреса получить...

Чтение строки из памяти
Пытаюсь обратиться к оперативной памяти и прочитать оттуда строку char fullChar = &quot;&quot;;...

Чтение ячейки памяти
Сказали считать ячейку памяти, в которой лежит целое число, а так же посчитать кол-во 0 и 1. До сих...


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

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

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