Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
03.05.2013, 21:12     Чтение участка памяти #1
Ищу, но не могу найти... Дело в том, что мне нужно в массиве выделять блоки по 4 элемента. Все было бы хорошо, если бы массив был бы у меня кратного 4м размера. Вот я и собираюсь, когда подойду к краю массива все равно прочитать 4 элемента, а затем затереть то, что прочитал лишнего(Саму помять за массивом я понятное дело трогать не буду). Так вот, возможно ли такое, что я не смогу прочитать элементы за пределом массива и выскочит что-нибудь типа "Memory is not readable"?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2013, 21:12     Чтение участка памяти
Посмотрите здесь:

C++ Чтение строки из памяти
C++ чтение из памяти
C++ tbb parallel_for чтение одного участка памяти разными потоками
C++ Чтение памяти ( поиск функций )
Чтение памяти не возможно C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
03.05.2013, 21:42     Чтение участка памяти #2
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Так вот, возможно ли такое, что я не смогу прочитать элементы за пределом массива и выскочит что-нибудь типа "Memory is not readable"?
Очень может быть. Что мешает выделить-таки массив с числом элементов, кратным четырём? Так ли много займут максимум три лишних элемента?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
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) то вторая часть вообще не будет исполнятся
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
03.05.2013, 21:55  [ТС]     Чтение участка памяти #4
NoMasters, мешает то, что у меня куча других алгоритмов основано на том, что память у меня именно такой длинны, какая есть. Поэтому случится коллапс...

Добавлено через 2 минуты
ValeryS, все было бы хорошо, но я могу либо читать именно по 4 элемента, либо читать все по одному элементу. Но тогда мое решение разобъется на две части, которые будут повторяться. Первая работает с группами по 4, а вторая - по одному элементу. Хотя функционал у них будет один и тотже.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
03.05.2013, 22:02     Чтение участка памяти #5
Цитата Сообщение от nonedark2008 Посмотреть сообщение
ValeryS, все было бы хорошо, но я могу либо читать именно по 4 элемента, либо читать все по одному элементу.
элемент это байт???
да и если нет что мешает привести типы?
сформулируй задачу конкретней?
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
03.05.2013, 22:39  [ТС]     Чтение участка памяти #6
Цитата Сообщение от ValeryS Посмотреть сообщение
элемент это байт???
Нет, элемент - это 32 битное число.
Типы привести не получится.
Мне именно нужно было знать, может ли возникнуть ошибка, если я прочитаю память, которая находится за пределами массива. Оказывается - может.
Все дело в том, что мне нужно было прочитать 128бит данных в регистр из массива, но вот на границе массива возникает такая трабла.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
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битные числа

может посему не заморачиватся а работать с указателями?
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
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

Не по теме:


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

ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
04.05.2013, 09:51     Чтение участка памяти #9
не могу ничего подсказать в современном Асме не силен
но по своему опыту могу сказать что встроенный ассемблер обычно обрезанный
по сему лучше писать на нормальном а объектный файл уже прилинковать к программе
или создать библиотеку
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2013, 11:33     Чтение участка памяти
Еще ссылки по теме:

C++ Чтение непосредственного значения из памяти
Чтение памяти невозможно C++
Процессы, чтение памяти - не работает код C++

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

Или воспользуйтесь поиском по форуму:
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
04.05.2013, 11:33  [ТС]     Чтение участка памяти #10
ValeryS, спасибо. Но я тоже в нем не силен. Пишу от силы второй день.
Yandex
Объявления
04.05.2013, 11:33     Чтение участка памяти
Ответ Создать тему
Опции темы

Текущее время: 14:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru