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

C++ Builder

Войти
Регистрация
Восстановить пароль
 
d7d1cd
197 / 126 / 36
Регистрация: 30.06.2011
Сообщений: 1,169
Завершенные тесты: 1
#1

Извлечь из вектора данные в нужном формате - C++ Builder

13.09.2016, 11:48. Просмотров 222. Ответов 10
Метки нет (Все метки)

Приветствую. Подскажите, как из вектора извлечь данные в нужном мне формате? Например из массива BYTE нужно извлечь два последних байта в формате WORD. Перед извлечением массив менял свой размер (сначала увеличился, потом уменьшился).
C++
1
2
3
4
5
6
7
8
9
10
11
std::vector <BYTE> Data;
...
/* здесь массив заполняли, увеличивали в размере, уменьшали в размере */
 
/* теперь надо извлечь последние 2 байта массива в формате WORD */
 
/* так данные извлекаются правильно */
WORD w = *reinterpret_cast <WORD*> (&Data[Data.size() - 2]);
 
/* а так не правильно */
w = *reinterpret_cast <WORD*> (&(Data.end() - 2));
Вопросы. Как правильно извлекать данные в нужном мне формате? Что возвращает функция вектора end(): конец данных или конец выделенной под вектор памяти?

Добавлено через 5 минут
Цитата Сообщение от d7d1cd Посмотреть сообщение
Что возвращает функция вектора end(): конец данных или конец выделенной под вектор памяти?
Нашел ответ на этот вопрос. Функция возвращает конец выделенной под вектор памяти. Поэтому ее нельзя применять для извлечения в моем примере.

Добавлено через 15 минут
Получается, что если размер массива менялся, то нельзя использовать функцию end для определения конца данных в векторе...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2016, 11:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Извлечь из вектора данные в нужном формате (C++ Builder):

Как записать в файл данные в hex формате? - C++ Builder
Добрый день! Не могу решить одну задачу...( С СОМ порта идут данные в hex формате, т.е. число вместо &quot;7272&quot; приходит 4848... Эти...

Записать данные вычисления матрицы, вектора и функции в текстовый файл - C++ Builder
Есть задача: записать данные вычисления матрицы, вектора и функции в текстовый файл. Проблемы при работе таковы: при записи значений...

Извлечь данные из clientdataset в переменную String - C++ Builder БД
или из DBGrid пробовал так: temp_ansi = DBGrid1-&gt;DataSource-&gt;DataSet-&gt;FieldByName(&quot;1&quot;)-&gt;AsAnsiString; извлекается, но только из...

Как извлечь из datagridview данные в строковом формате? - C#
если мы создаём новую строку при пом DataRow row=ds.Tables.NewRow; row=...... ds.Tables.Rows.Add(row); и всё это отображаем в...

Как правильно извлечь данные из вектора и поместить в обект CStepMove - C++
Дорого времени суток. В общем у меня такая проблемма. Есть родительский класс CStep. У него есть наследник CStepMove. Создаю вектор: ...

Не сохраняет в нужном формате - 1С
Программа не сохраняет в нужном формате. в чем дело, вроде все правильно написано. Путь - это у меня элементформы! ...

10
Selot
180 / 116 / 29
Регистрация: 19.01.2010
Сообщений: 465
Завершенные тесты: 2
13.09.2016, 12:09 #2
C++
1
2
3
4
5
6
7
8
9
10
11
    std::vector<BYTE> Data = {0x01, 0x02, 0x03, 0x04, 0x05};
    std::vector<BYTE>::iterator it = Data.end();
    WORD last_byte1 = *(it - 1);
    WORD last_byte2 = *(it - 2);
 
    last_byte1 = Data.at(Data.size() - 1);
    last_byte2 = Data.at(Data.size() - 2);
 
    std::vector<BYTE>::reverse_iterator r_it = Data.rbegin();
    last_byte1 = *r_it;
    last_byte2 = *(r_it + 1);
0
d7d1cd
197 / 126 / 36
Регистрация: 30.06.2011
Сообщений: 1,169
Завершенные тесты: 1
13.09.2016, 12:51  [ТС] #3
Selot, может я не вижу, конечно... Где последние 2 байта в одной переменной WORD?

Добавлено через 2 минуты
Чем плох такой метод извлечения?
C++
1
WORD w = *reinterpret_cast <WORD*> (&Data[Data.size() - 2]);
0
Selot
180 / 116 / 29
Регистрация: 19.01.2010
Сообщений: 465
Завершенные тесты: 2
13.09.2016, 13:02 #4
В смысле надо объединить 2 байта в один WORD?
C++
1
2
3
BYTE byte1 = Data.at(Data.size() - 1);
BYTE byte2 = Data.at(Data.size() - 2);
WORD value = byte1 | byte2 << 8
Добавлено через 2 минуты
Цитата Сообщение от d7d1cd Посмотреть сообщение
Чем плох такой метод извлечения?
да ничем он не плох. просто я предпочитаю биты двигать
0
d7d1cd
197 / 126 / 36
Регистрация: 30.06.2011
Сообщений: 1,169
Завершенные тесты: 1
13.09.2016, 13:03  [ТС] #5
Цитата Сообщение от Selot Посмотреть сообщение
В смысле надо объединить 2 байта в один WORD?
Да. Надо извлечь 2 последних байта из вектора и поместить их в переменную WORD.

Спасибо за код, но он очень длинный.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24629 / 16299 / 5007
Регистрация: 22.10.2011
Сообщений: 28,856
Записей в блоге: 5
13.09.2016, 14:31 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
w = *reinterpret_cast <WORD*> (&(Data.end() [- 2]));
чем не устроило?

Добавлено через 59 секунд
Результат абсолютно аналогичный первому методу...
1
d7d1cd
197 / 126 / 36
Регистрация: 30.06.2011
Сообщений: 1,169
Завершенные тесты: 1
13.09.2016, 14:54  [ТС] #7
volvo, подскажите, как правильно получить "чистый" указатель на данные, хранящиеся в векторе. Например, указатель на начало данных в векторе.

Добавлено через 4 минуты
И еще: можно узнать чем отличается &(Data.end() [- 2]) от &(Data.end() - 2).
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24629 / 16299 / 5007
Регистрация: 22.10.2011
Сообщений: 28,856
Записей в блоге: 5
13.09.2016, 20:27 #8
как правильно получить "чистый" указатель на данные, хранящиеся в векторе.
&Data[0] или &Data.front() или &*Data.begin() или Data.data() (начиная с C++11)
чем отличается &(Data.end() [- 2]) от &(Data.end() - 2).
end() возвращает итератор на элемент после последнего, так что его нужно разыменовать, чтобы получить сам элемент (адрес которого потом будем получать): *(iter - 2) аналогично iter[-2]

P. S. Как вы вообще пишете программы, не зная азов синтаксиса языка?
0
d7d1cd
197 / 126 / 36
Регистрация: 30.06.2011
Сообщений: 1,169
Завершенные тесты: 1
13.09.2016, 21:01  [ТС] #9
Цитата Сообщение от volvo Посмотреть сообщение
Как вы вообще пишете программы, не зная азов синтаксиса языка?
Ну я не то, чтобы совсем на знаю азов. Точнее сказать, я не все их знаю. Но благодаря таким как Вы, так и учусь потихоньку .

Получается, что &(Data.end() [-2]) и &(Data.end() - 2) - это не одно и то же?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24629 / 16299 / 5007
Регистрация: 22.10.2011
Сообщений: 28,856
Записей в блоге: 5
14.09.2016, 12:12 #10
Разумеется, нет. Второй вариант не разыменовывает итератор, и вообще не должен компилироваться без дополнительных телодвижений (в виде ключей компилятора). Не знаю, как Билдер, но gcc его не компилирует.
0
d7d1cd
197 / 126 / 36
Регистрация: 30.06.2011
Сообщений: 1,169
Завершенные тесты: 1
14.09.2016, 12:16  [ТС] #11
Цитата Сообщение от volvo Посмотреть сообщение
Второй вариант не разыменовывает итератор, и вообще не должен компилироваться без дополнительных телодвижений (в виде ключей компилятора).
Билдер компилирует без телодвижений. Но теперь ясно, что этот код не правильный. Спасибо.
0
14.09.2016, 12:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2016, 12:16
Привет! Вот еще темы с ответами:

вывести дату из бд в нужном формате - PHP
Здравствуйте. 1. Подскажите, пожалуйста, какой конструкцией можно вывести дату из бд (мускул) в нужном формате? По умолчанию, понятное...

Вывод массива в нужном формате - PHP
&lt;?php require('simple_html_dom.php'); $table = array(); $html = file_get_html('http://176.108.103.36/filter/server.html'); ...

Вывод даты в нужном формате - PHP БД
Здравствуйте! Добавлено через 11 минут Здравствуйте! От предыдущего админа остался &quot;самописный&quot; сайт, возникла необходимость в...

Подставить число в нужном формате - PHP
Есть кредитная карта с номером 0000 0000 0000 0000 После ввода мною числа 4820 номер должен стать 4820 0000 0000 0000 А если я...


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

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

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