Модераторы: JackYF, bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> копирование элементов массива, копирование элементов массива 
:(
    Опции темы
Roman94
Дата 7.1.2019, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.12.2018

Репутация: нет
Всего: нет



Код

std::array<uint64_t, 512> st;
std::array<uint8_t, 512> arra;

size_t len = sizeof(st);
    std::memcpy(arra.data(), st.data(), len);


не работает эта часть кода, что попало копирует, как правильно сделать и вообще это можно?

PM MAIL   Вверх
kapbepucm
Дата 7.1.2019, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 945
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



в хранилище размером 1 байт вы пишете 8 байта? Скорее всего невлезающие байты пишутся в соседние переменные smile

Это сообщение отредактировал(а) kapbepucm - 7.1.2019, 11:59


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Roman94
Дата 7.1.2019, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.12.2018

Репутация: нет
Всего: нет



Цитата(kapbepucm @ 7.1.2019,  11:58)
в хранилище размером 1 байт вы пишете 8 байта? Скорее всего невлезающие байты пишутся в соседние переменные smile


хорошо, как исправить, что бы все работало?
PM MAIL   Вверх
kapbepucm
Дата 7.1.2019, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 945
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Ну, зависит от желаемого результата. Например, можно st и arra сделать одного типа.


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Roman94
Дата 7.1.2019, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.12.2018

Репутация: нет
Всего: нет



Цитата(kapbepucm @ 7.1.2019,  14:46)
Ну, зависит от желаемого результата. Например, можно st и arra сделать одного типа.

А если оставить разный тип? Сейчас это непринциально почти, но хочется разобраться как это работает
PM MAIL   Вверх
kapbepucm
Дата 8.1.2019, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 945
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Если оставить разный тип- как прикажете программе число 18446744073709551615 скопировать в область памяти, где максимальное значение подразумевается 256? Если наоборот, то скорее всего можно можно. В данном случае, как правило, С++ исполняет вашу инструкцию без нареканий, ну и коли приказано писать 8 байтов подряд- пишу 1 байт по адресу нужной переменной, а остальные 7- куда придётся и неважно, что там что то может храниться smile


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Roman94
Дата 8.1.2019, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.12.2018

Репутация: нет
Всего: нет



Цитата(kapbepucm @ 8.1.2019,  10:39)
Если оставить разный тип- как прикажете программе число 18446744073709551615 скопировать в область памяти, где максимальное значение подразумевается 256? Если наоборот, то скорее всего можно можно. В данном случае, как правило, С++ исполняет вашу инструкцию без нареканий, ну и коли приказано писать 8 байтов подряд- пишу 1 байт по адресу нужной переменной, а остальные 7- куда придётся и неважно, что там что то может храниться smile

ну а если число массив чисел 323 445 654 768 разбить по байту? ну в первый записать 3, во второй 2, в третий 3 и т.д?


PM MAIL   Вверх
kapbepucm
Дата 9.1.2019, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 945
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Нарисую, только пусть массив будет не из 512 элементов, а 4 smile
Код
заполним массив st числами uint64_t (10-ричная система счисления):
номер элемента│значение
──────────────┼────────
0             │300
1             │301
2             │302
3             │303

как это выглядит на самом деле на машине little endian и 16-ричная система счисления:
номер элемента│значение
──────────────┼───────────────────────
0             │2C 01 00 00 00 00 00 00
1             │2D 01 00 00 00 00 00 00
2             │2E 01 00 00 00 00 00 00
3             │2F 01 00 00 00 00 00 00

то есть область памяти будет выглядеть так (16-ричная система):
2C 01 00 00 00 00 00 00 2D 01 00 00 00 00 00 00 2E 01 00 00 00 00 00 00 2F 01 00 00 00 00 00 00


Теперь у нас есть arra со своими 4 элементами uint8_t (заполним этот массив нулями). Область памяти выглядит так (16-ричная система):
00 00 00 00

Теперь по вашей инструкции "memcpy" копируем st в arra. Что получаем в arra:
2C 01 00 00

в десятичном представлении итоговый arra:
номер элемента│значение
──────────────┼────────
0             │44
1             │1
2             │0
3             │0


Цитата(Roman94 @  8.1.2019,  22:35 Найти цитируемый пост)
ну в первый записать 3, во второй 2, в третий 3 и т.д?
как раз по такому принципу и копируется, только внутреннее представление числа не десятичное, по крайней мере выбранных вами типов данных

Это сообщение отредактировал(а) kapbepucm - 9.1.2019, 11:01


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Roman94
Дата 10.1.2019, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.12.2018

Репутация: нет
Всего: нет



Цитата(kapbepucm @ 9.1.2019,  10:41)
Нарисую, только пусть массив будет не из 512 элементов, а 4 smile
Код
заполним массив st числами uint64_t (10-ричная система счисления):
номер элемента│значение
──────────────┼────────
0             │300
1             │301
2             │302
3             │303

как это выглядит на самом деле на машине little endian и 16-ричная система счисления:
номер элемента│значение
──────────────┼───────────────────────
0             │2C 01 00 00 00 00 00 00
1             │2D 01 00 00 00 00 00 00
2             │2E 01 00 00 00 00 00 00
3             │2F 01 00 00 00 00 00 00

то есть область памяти будет выглядеть так (16-ричная система):
2C 01 00 00 00 00 00 00 2D 01 00 00 00 00 00 00 2E 01 00 00 00 00 00 00 2F 01 00 00 00 00 00 00


Теперь у нас есть arra со своими 4 элементами uint8_t (заполним этот массив нулями). Область памяти выглядит так (16-ричная система):
00 00 00 00

Теперь по вашей инструкции "memcpy" копируем st в arra. Что получаем в arra:
2C 01 00 00

в десятичном представлении итоговый arra:
номер элемента│значение
──────────────┼────────
0             │44
1             │1
2             │0
3             │0


Цитата(Roman94 @  8.1.2019,  22:35 Найти цитируемый пост)
ну в первый записать 3, во второй 2, в третий 3 и т.д?
как раз по такому принципу и копируется, только внутреннее представление числа не десятичное, по крайней мере выбранных вами типов данных

я понимаю, как работает эта функция. Неужели нельзя решить эту проблему другим способом?
PM MAIL   Вверх
kapbepucm
Дата 11.1.2019, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 945
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Цитата(Roman94 @  10.1.2019,  14:58 Найти цитируемый пост)
нельзя решить
Можно, c++ не запрещает всякого рода извращения smile
Вот вариант, если надо в массиве из uint8_t надо хранить uint64_t (копирую пока только 4 элемента):
Код
#include <iostream>
#include <array>
#include <cstring>

int main()
{
  std::array<uint64_t, 512> st;
  std::array<uint8_t, 512> arra;

  //заполняем st
  st[0] = 300;
  st[1] = 301;
  st[2] = 302;
  st[3] = 303;

  //копируем из st в arra 4 элемента
  size_t len = sizeof(uint64_t) * 4;
  std::memcpy(arra.data(), st.data(), len);

  //проверяем, что вышло в arra
  for (int i=0; i<4; ++i)
    std::cout << "element \"" << i << "\"=" << *(uint64_t*)(arra.data() + i * sizeof(uint64_t)) << std::endl;

  return 0;
}


Это сообщение отредактировал(а) kapbepucm - 11.1.2019, 11:14


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Google
  Дата 16.1.2019, 22:06 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0776 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.