Копировать массив, имеющий только void *

На этом сайте вы найдете несколько бесплатных настраиваемых датчиков.

ScComponents

Очень прост в установке и хорошо документирован. Например, вы можете получить что-то вроде этого через 5 минут после инструкции ниже.

Перейдите по вышеуказанному сайту. Нажмите GR004 и после появления всплывающего окна нажмите «Загрузить бесплатно».

Запишите этот код в свой XML-макет, и ваш манометр будет выполнен:


Загрузите, распакуйте и следуйте инструкциям по установке библиотеки (aar-файла) в ваш проект Android.

У вас есть много вариантов XML для его настройки:

  • sccAnimDuration
  • sccEnableTouch
  • sccInverted
  • sccFontName
  • sccLabelsSizeAdjust
  • sccMajorTicks
  • sccMaxValue
  • sccMinorTicks
  • sccMinValue
  • sccShowContour
  • sccShowLabels
  • sccText
  • sccValue

И связанная функция путем кодирования.

-2
задан chm 15 January 2019 в 17:46
поделиться

2 ответа

Я бы сделал это следующим образом (см. Комментарии для получения дополнительной информации):

#include <iostream>
#include <cstdint>
#include <algorithm>

// This function does not concern me - do not pay attention at memory managemt
void* getObject()
{
    uint32_t* oldArr = new uint32_t[2];
    oldArr[0] = 1;
    oldArr[1] = 2;

    // no need for a cast
    return oldArr;
};

struct ArrayStruct
{
    uint32_t dest[2];
};

void copy_to(ArrayStruct& as, void const* type_erased_source)
{
    // std::extent gives us the number of elements in an array
    constexpr auto elements = std::extent<decltype(as.dest)>::value;

    // cast the void* to the correct pointer type
    auto source = reinterpret_cast<std::uint32_t const*>(type_erased_source);

    // copy the objects to dest
    std::copy(source, source + elements, std::begin(as.dest));
}

int main()
{
    void* obj = getObject();
    ArrayStruct s;

    copy_to(s, obj);

    std::cout << s.dest[0] << " " << s.dest[1];
}

Если вы посмотрите на какой-нибудь пример ассемблера на Godbolt, вы увидите, что функция copy_to в конечном итоге скомпилирована в один движение памяти.

https://godbolt.org/z/ALdq6e

copy_to(ArrayStruct&, void const*):
  mov rax, QWORD PTR [rsi]
  mov QWORD PTR [rdi], rax
0
ответ дан Richard Hodges 15 January 2019 в 17:46
поделиться

Просто используйте memcpy :

#include <cstring>

void GetArrayData(uint32_t arr[], void* data, uint32_t size)
{
  std::memcpy(arr, data, size * sizeof(uint32_t));
}

В случае, если вам удастся изменить код и избежать использования void*, std :: copy :

void GetArrayData(uint32_t arr[], uint32_t* data, uint32_t size)
{
  std::copy(data, data+size, arr);
}
0
ответ дан erenon 15 January 2019 в 17:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: