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

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

Войти
Регистрация
Восстановить пароль
 
nonedark2008
909 / 648 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
#1

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

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

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

tbb parallel_for чтение одного участка памяти разными потоками - C++
Добрый день. Предположим, нужно распараллелить свертку одного и того же изображения разными фильтрами (использую tbb:: parallel_for)- в...

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

Чтение из памяти - C++
добрый день, нужна помощь у же не знаю что я не так делаю , вернее как мне нужно сделать void foo(char * inputfile, char * outputfile,...

чтение из памяти - C++
господа допустим есть - int a=5; мне нужно получить адрес переменной "а" и из адреса получить значение т.е. - 5 . Как возможно это...

Чтение строки из памяти - C++
Пытаюсь обратиться к оперативной памяти и прочитать оттуда строку char fullChar = ""; char tempChar = ' '; ...

Чтение памяти не возможно - C++
Начал изучаться ООП получил лабораторную, программа заупускается и на вводе размерности матрицы появляется ошибка. Табличка которая выходит...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
03.05.2013, 21:42 #2
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Так вот, возможно ли такое, что я не смогу прочитать элементы за пределом массива и выскочит что-нибудь типа "Memory is not readable"?
Очень может быть. Что мешает выделить-таки массив с числом элементов, кратным четырём? Так ли много займут максимум три лишних элемента?
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
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
nonedark2008
909 / 648 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
03.05.2013, 21:55  [ТС] #4
NoMasters, мешает то, что у меня куча других алгоритмов основано на том, что память у меня именно такой длинны, какая есть. Поэтому случится коллапс...

Добавлено через 2 минуты
ValeryS, все было бы хорошо, но я могу либо читать именно по 4 элемента, либо читать все по одному элементу. Но тогда мое решение разобъется на две части, которые будут повторяться. Первая работает с группами по 4, а вторая - по одному элементу. Хотя функционал у них будет один и тотже.
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
03.05.2013, 22:02 #5
Цитата Сообщение от nonedark2008 Посмотреть сообщение
ValeryS, все было бы хорошо, но я могу либо читать именно по 4 элемента, либо читать все по одному элементу.
элемент это байт???
да и если нет что мешает привести типы?
сформулируй задачу конкретней?
0
nonedark2008
909 / 648 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
03.05.2013, 22:39  [ТС] #6
Цитата Сообщение от ValeryS Посмотреть сообщение
элемент это байт???
Нет, элемент - это 32 битное число.
Типы привести не получится.
Мне именно нужно было знать, может ли возникнуть ошибка, если я прочитаю память, которая находится за пределами массива. Оказывается - может.
Все дело в том, что мне нужно было прочитать 128бит данных в регистр из массива, но вот на границе массива возникает такая трабла.
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
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
nonedark2008
909 / 648 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
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
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
04.05.2013, 09:51 #9
не могу ничего подсказать в современном Асме не силен
но по своему опыту могу сказать что встроенный ассемблер обычно обрезанный
по сему лучше писать на нормальном а объектный файл уже прилинковать к программе
или создать библиотеку
0
nonedark2008
909 / 648 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
04.05.2013, 11:33  [ТС] #10
ValeryS, спасибо. Но я тоже в нем не силен. Пишу от силы второй день.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2013, 11:33
Привет! Вот еще темы с ответами:

Чтение памяти невозможно - C++
Ребята помогите, не понимаю где ошибка вот весь код #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;map&gt; #include &lt;list&gt; ...

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

Чтение памяти из процессов - C++
Здравствуйте , знаю c++ на базовом уровне , хочу научится писать читы для CS:GO. Начать хочу с радархака. Посмотрел пару уроков , понял ,...

Чтение памяти ( поиск функций ) - C++
Здравствуйте. Помогите найти функции - (дефолтное АПИ систем) выдающие флаги памяти, желательно не менять эти самые флаги при запросе. ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.05.2013, 11:33
Ответ Создать тему
Опции темы

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