Передача Неуправляемых указателей в C++ / CLI

Вы можете извлечь уникальные значения, используя Set, затем отсортировать их (поскольку сортировка массива массивов более сложна), затем использовать array.reduce, чтобы получить все элементы в исходном массиве, и нажать либо одно значение, если уникальное в противном случае массив значений (не знаю, зачем вам это нужно, но все же ..)

Дополнительная справочная документация:

Рабочий код ниже:

let arr = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];

// I want to create this [[1,1,1,1],[2,2,2], 4,5,10,[20,20], 391, 392,591]

console.log([...new Set(arr)].sort((a,b) => a - b).reduce((accumulator, next) => {
	const filtered = arr.filter(i => i === next);
  return accumulator.push(filtered.length === 1 ? filtered[0] : filtered), accumulator
}, []));

[ 1113]

5
задан cjserio 20 February 2009 в 15:09
поделиться

1 ответ

При передаче указателя на управляемый класс затем, легко преобразовать ^ ссылку в указатель, но необходимо прикрепить управляемый объект так, чтобы GC не переносил его в памяти (таким образом делающий недействительным указатель)

Это просто с pin_ptr

Однако Ваш код делает две вещи, которые не будут работать

RTPClient::RTPClient():
        mClient(NULL)
{
    CIsmaClient::Create(
        &mClient,          // 1
        NULL, 
        &AllocBuffer, 
        &GetDataPointer, 
        this);            //2
}

1) Вы пытаетесь взять адрес чего-то на управляемой "куче" (местоположение указателя на указатель mClient находится на управляемой "куче".

Как таковой это может переместиться в память, таким образом внутренний указатель поставщика компилятора (чье значение сохраняется по операциям GC). Это должно быть прикреплено, и это будет только работать, если Создать функция не будет ожидать использовать указатель после того, как это будет объем, закончился (если это передаст его куда-нибудь еще для хранения его, то это приведет к ошибкам).

2) Вы передаете дескриптор (забавный символ шляпы), а не указатель. (Считайте раздел Википедии по ним, они - хороший обзор), Это не (и не может) быть понятым под неуправляемым кодом.

Единственная причина, о которой я могу думать для этого параметра в этом контексте, состоит в том, поскольку явная переменная состояния передала последующим функциональным обратным вызовам (исправьте меня, если я неправ). 'это' в этом контексте никогда не собирается работать правильно, так как это может переместиться в памяти, после того как pin_ptr выходит из объема.

С этим в памяти вот (частично) исправленная реализация, проясняющая, что может и не может быть зафиксировано.

RTPClient::RTPClient():
        mClient(NULL)
{
    // make it clear you want the address of the instance variable
    pin_ptr<CIsmaClient*> pinnedClient = &this->mClient; 
    CIsmaClient::Create(
        pinnedClient,          // fixed
        NULL, 
        &AllocBuffer, 
        &GetDataPointer, 
        x /* pass something else in */);            //2
}

Если Вы предоставляете больше информации о том, что используется последний параметр, поскольку я могу предложить возможные решения

9
ответ дан 13 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

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