Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
2 / 2 / 1
Регистрация: 08.02.2012
Сообщений: 76
1

Копирование структуры в массив

29.09.2020, 18:50. Показов 3892. Ответов 16

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Имеется любая структура с разным типом данных, вложенными структурами в том числе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct 
{
    uint32_t     a;    
    uint32_t     b;  
    date_x_t    v;   
    uint8_t       m;      
    union
    {
        struct
        {
            uint8_t    buf1[11];  
            uint8_t    buf2[11];    
        };
        uint16_t      buf[12];             
        int16_t       e;   
        uint32_t     d;   
        float          c;      
    };
} datka;
Структуру хочется копировать в буфер, но не целиком, а нужными частями. Поэтому делаю такую функцию
C++
1
2
3
4
5
6
7
8
9
void glue_arrays(uint8_t *big_arr, uint8_t *buf, uint8_t st) {
  static uint8_t position;
  if (!st) position = 0 ; 
 
  for (uint8_t i=0;i<sizeof(buf);i++) {
    big_arr[i+position]=*buf++;
    position++;
  }
}
Далее передаю части структуры через указатели, например
C++
1
2
3
glue_arrays(&big_massive,&datka.buf,0);
glue_arrays(&big_massive,&datka.c,1);
glue_arrays(&big_massive,&datka.a,1);
Но в массиве big_massive бардак, более наглядно будет так:
C++
1
2
3
4
5
uint8_t fara[10]={0x55,0x56,0x57,0x58,0x59,0x65,0x66,0x67,0x68,0x69};
uint16_t mel = 0x234;
uint8_t fora[5]={0x75,0x76,0x77,0x78,0x79};
glue_arrays(&fara,&mel,0);
glue_arrays(&fara,&fora,1);
После чего fara = 0x34,0x56,0x02,0x58,0x75,0x65,0x76,0x67,0x77,0x69
А хотелось бы хотя бы 0x34,0x02,0x75,0x76,0x77,0x78,0x79,0x67,0x68,0x69

Как частичное копирование структуры в массив сделать правильно?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2020, 18:50
Ответы с готовыми решениями:

Структуры, копирование файла
Подскажите, как написать программку с меню с пунктами: – посимвольное копирование файла; ...

Копирование структуры таблиц
Приветствую всех знатоков. Ребята подскажите есть ли возможность в PostgreSQL скопировать таблицу...

Копирование структуры из одной БД в другую
Ув. Форумчане нужна ваша помощь:cry: В общем я толком не имел раньше дел в базами данных, так...

Копирование без сохранения структуры
Есть папка с множеством подпапок как сделать её копию без сохранения структуры каталогов - кучей...

16
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
29.09.2020, 19:09 2
Цитата Сообщение от Protosha Посмотреть сообщение
Как частичное копирование структуры в массив сделать правильно?
C++
1
2
3
4
5
6
7
8
9
10
void glue_arrays(uint8_t *big_arr, uint8_t *buf, size_t sz, uint8_t st) {
  static uint8_t position;
  if (!st) position = 0 ; 
 
  for (uint8_t i=0; i< sz;i++) 
  {
    big_arr[i+position]=*buf++;
    position++;
  }
}
Добавлено через 57 секунд
C++
1
2
3
glue_arrays(&big_massive,&datka.buf, sizeof(datka.buf), 0);
glue_arrays(&big_massive,&datka.c, sizeof(datka.c), 1);
glue_arrays(&big_massive,&datka.a, sizeof(datka.a), 1);
0
2 / 2 / 1
Регистрация: 08.02.2012
Сообщений: 76
29.09.2020, 19:27  [ТС] 3
Боюсь вас разочаровать, но от перемены мест слагаемых сумма не меняется. Совершенно неважно, где определять размер передаваемых данных, в параметре или в теле функции, результат в конечном массиве аналогичен.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
29.09.2020, 19:32 4
Цитата Сообщение от Protosha Посмотреть сообщение
Боюсь вас разочаровать, но от перемены мест слагаемых сумма не меняется. Совершенно неважно, где определять размер передаваемых данных, в параметре или в теле функции, результат в конечном массиве аналогичен.
Ага, здрасьте, приехали. Боюсь тебя разочаровать, но твоя sizeof(buf) всегда возвращает цифру 8 в 64-битных системах, либо цифру 4 в 32-битных.
Цитата Сообщение от Protosha Посмотреть сообщение
for (uint8_t i=0;i<sizeof(buf);i++) {
    big_arr[i+position]=*buf++;
А datka.buf что-то явно не такого размера
0
2 / 2 / 1
Регистрация: 08.02.2012
Сообщений: 76
29.09.2020, 20:09  [ТС] 5
Ну я понял к чему вы, учту поведение функции sizeof, вынесу в параметр, но в данной ситуации одинаков массив в итоге.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
29.09.2020, 20:43 6
Цитата Сообщение от Protosha Посмотреть сообщение
Ну я понял к чему вы, учту поведение функции sizeof, вынесу в параметр, но в данной ситуации одинаков массив в итоге.
Что такое big_massive?
И может надо вот так
C++
1
2
3
4
5
6
7
uint8_t *glue_arrays(uint8_t *big_arr, uint8_t *buf, size_t sz) 
{
  for (size_t i = 0; i < sz; ++i) 
    *(big_arr++) = *(buf++);
 
  return big_arr;
}
?

Добавлено через 53 секунды
Что ты вообще пытаешься сделать в своей glue_arrays?
0
2 / 2 / 1
Регистрация: 08.02.2012
Сообщений: 76
29.09.2020, 20:54  [ТС] 7
big_massive то же самое, что и fara из примера чуть ниже - простой uint8_t массив
Из сообщения темы видно, что glue_arrays мне нужен для копирования данных из структуры в массив.
Ваш вариант подобен функции memcpy, но она копирует непрерывное поле данных в самое начало массива, мне нужно последовательно копировать в массив несколько других массивов/переменных/структур на мой выбор.
0
2 / 2 / 1
Регистрация: 08.02.2012
Сообщений: 76
01.10.2020, 09:17  [ТС] 8
Неужели это такая сложная нерешаемая проблема по укладке байт? Никто не может назвать причину, по которой через байт складываются массивы и как это исправить?
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
01.10.2020, 09:38 9
Лучший ответ Сообщение было отмечено Protosha как решение

Решение

Protosha, да всё вроде нормально, что именно не работает? Вот пример

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
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <iomanip>
#include <cstring>
 
int main()
{
    uint8_t dest[10]={0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};
    
    auto print_dest=[&dest]
    {
        for(const auto& byte:dest)
        {
            std::cout<<std::hex<<std::setw(2)<<std::setfill('0');
            std::cout<<(uint16_t)byte<<" ,";
        }
        std::cout<<'\n';
    };
    
    uint16_t word = 0x2233;
    uint8_t src[5]={0x44,0x44,0x44,0x44,0x44};
    
    //исходный массив
    print_dest();
    
    std::memcpy(dest+0,&word,sizeof(word));
    //вставили word
    print_dest();
 
    std::memcpy(dest+2,src,sizeof(src));
    //вставили src
    print_dest();
 
    return 0;
}
11 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,
33 ,22 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,
33 ,22 ,44 ,44 ,44 ,44 ,44 ,11 ,11 ,11 ,
1
2834 / 2336 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
01.10.2020, 10:29 10
Проблема таки может быть с использованием union.

Для использование вышеуказанной структуры нужна ОГРОМНАЯ причина.
Если причина не огромная, лучше обходится без него.
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
01.10.2020, 10:39 11
SmallEvil, подозреваю, что дело больше в выравнивании
0
2 / 2 / 1
Регистрация: 08.02.2012
Сообщений: 76
01.10.2020, 20:43  [ТС] 12
Да, на компьютере всё хорошо работает, но этот код запускаю на ARM-е, может проблемы в прыжках через байт в little endian ?

А почему с union проблемы?
0
2834 / 2336 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
01.10.2020, 20:59 13
Protosha,
никогда не писал для ARM, так что рассмотрите вариант от Алексей1153,

https://habr.com/ru/post/309144/

Добавлено через 6 минут
Цитата Сообщение от Protosha Посмотреть сообщение
А почему с union проблемы?
на вкус и цвет ...
0
2 / 2 / 1
Регистрация: 08.02.2012
Сообщений: 76
01.10.2020, 22:43  [ТС] 14
По ссылке мутный выход из ситуации, но всё же решением я выбрал копирование через memcpy
C++
1
2
3
4
5
6
void glue_arrays(uint8_t *big_arr, uint8_t *buf, size_t sz, uint8_t st) {
  static uint8_t position;
  if (!st) position = 0 ; 
  memcpy(big_arr+position, buf, sz);
  position += sz;
}
А изначальный вариант функции только на первый взгляд делает то же самое, а по факту что попало, причину не установил пока
C++
1
2
3
4
5
6
7
8
9
void glue_arrays(uint8_t *big_arr, uint8_t *buf, size_t sz, uint8_t st) {
  static uint8_t position;
  if (!st) position = 0 ; 
 
  for (uint8_t i = 0; i < sz; i++) {
    big_arr[i+position] = *buf++;
    position++;
  }
}
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
01.10.2020, 22:54 15
Цитата Сообщение от Protosha Посмотреть сообщение
причину не установил пока
по-моему, вот это лишнее. А точнее - нужно вынести за цикл прибавление сдвига
Цитата Сообщение от Protosha Посмотреть сообщение
position++;
Добавлено через 2 минуты
а вот это - потенциальная ошибка. Если первый раз зайти не с нулём в st, будет нехорошо, так как нет инициализации position
Цитата Сообщение от Protosha Посмотреть сообщение
static uint8_t position;
  if (!st) position = 0 ;
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
02.10.2020, 00:13 16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
будет нехорошо, так как нет инициализации position
Ничего не будет.
static-переменные инициализируются неявно.
Цитата Сообщение от http://eel.is/c++draft/basic.start.static#2
If constant initialization is not performed, a variable with static storage duration or thread storage duration is zero-initialized.
1
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
02.10.2020, 07:37 17
DrOffset, это хорошо )
0
02.10.2020, 07:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2020, 07:37
Помогаю со студенческими работами здесь

Копирование массива в переменные структуры
Необходимо что бы считывало со первого элемента массива buf в переменную t структуры NI, со второго...

Копирование одной структуры в другую
Привет. Есть класс class ArrayOfPatient { public: int __sizeitem; Patient **item; }...

Копирование массива из структуры с использованием memcpy()
Здравствуйте. Помогите с задачкой. Есть структура. Произвольная. И массив. Например: typedef...

Копирование структуры папок и файлов по маске
Добрый день, перекопал форум но так и не допер как это сделать(( Задача такая: Есть папка...

Копирование папки с сохранением структуры папок
Здравствуйте. Подскажите пожалуйста как решить задачу. У меня есть 100 компьютеров, на которые...

Создание структуры каталогов и копирование файлов
2. Создание структуры каталогов, а также копировать файлы: Предположим, что следующие файлы...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru