Передача Safearray пользовательских типов от C++ до C#

Вот что говорит JLS по этому вопросу (в нетехническом обсуждении).

JLS 5.1.2 Расширяющее примитивное преобразование

Следующие 19 конкретных преобразований примитивных типов называются расширяющимися примитивными преобразованиями:

  • int long, float или double
  • (без учета опущенных)

Преобразование значения int или long в float или значение от long до double может привести к потере точности , то есть результат может потерять некоторые из младших значащих битов значения. В этом случае результирующее значение с плавающей запятой будет правильно округленной версией целочисленного значения с использованием режима округления до ближайшего стандарта IEEE 754.

Несмотря на то, что может произойти потеря точности, расширяющиеся преобразования среди примитивных типов никогда не приводят к исключению во время выполнения.

Вот пример расширяющегося преобразования, которое теряет точность:

class Test {
         public static void main(String[] args) {
                int big = 1234567890;
                float approx = big;
                System.out.println(big - (int)approx);
        }
}

, которое печатает:

-46

, что указывает на то, что информация была потеряна во время преобразования из типа int чтобы ввести float, потому что значения типа float не являются точными до девяти значащих цифр.

6
задан Stefano Ricciardi 15 June 2009 в 10:02
поделиться

1 ответ

Я не совсем уверен, правильно ли я понял ваш вопрос, но, может быть, вам понадобится VT_DISPATCH ? Я думаю, если вы хотите, чтобы он работал с VT_RECORD , тогда ваша структура должна быть структурой (а не классом), а также требует атрибута [StructLayout (LayoutKind.Sequential)] .

Правка : Может быть, первая ошибка, которую вы получили, была DISP_E_BADINDEX ? Что такое индексы в вашем коде? Что в нем содержится? (Вы знаете, что подпись SafeArrayPutElement требует, чтобы это был указатель, верно?)

4
ответ дан 17 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

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