Вопрос о портах с C ++ на C #: как бы я справился с методом, у которого в качестве параметра указан double *? - PullRequest
1 голос
/ 15 августа 2011

Я портирую библиотеку C ++ на C #, и я столкнулся с некоторыми методами, которые имеют двойные * указатели в качестве параметров. Какой лучший способ справиться с этим? Возможно, измените код вызова так, чтобы он не передавал указатели? Я бы просто обернул код в «небезопасный» блок и установил флаг компилятора / unsafe, но я не могу сделать это внутри сигнатуры метода.

Ответы [ 7 ]

3 голосов
/ 15 августа 2011

Возможно, использование ref (или out) в параметрах может быть достаточно хорошим, или если вам нужно обработать массив из них, используйте double[].

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

1 голос
/ 15 августа 2011

Возможно, это переводится как ref double или out double или double [].Какой это должно быть, зависит от семантики кода.C ++ double * может означать несколько вещей.

Весьма маловероятно, что нужен небезопасный код.

1 голос
/ 15 августа 2011

Я предполагаю, что вы хотите использовать управляемый безопасный код

Зависит от того, как используется указатель. Если он используется в качестве массива внутри вашего метода, то вам нужно передать массив методу и, следовательно, изменить сигнатуру.

, если он используется как двойной и (пере) назначен, он снова зависит. У метода есть тип возвращаемого значения? Если это так, можно использовать ref double. если метод не имеет возвращаемого типа, верните присвоенное значение и разрешите вызывающей стороне перейти на локальный вместо передачи по ref.

, если double * используется как double, и никогда не назначать просто pass как double.

0 голосов
/ 15 августа 2011

Зависит от того, как функция использует указатель. На самом деле ты не даешь достаточно информации, чтобы дать четкий ответ, но я все равно попробую.

Обычный код C #

Если код в методе отменяет ссылку на указатель и присваивает значение без какой-либо арифметики указателя, то просто сделайте параметр параметром out.

Если предыдущий абзац имеет значение true и у вас еще нет возвращаемого значения, просто измените сигнатуру метода, чтобы он возвращал double.

Если код не выполняет арифметику указателей, но использует значение, которое уже существует в указанном месте, а также присваивает его, то сделайте параметр ref параметром.

Если код не использует арифметику указателей, использует значение, но не присваивает его, то вам, вероятно, следует заменить его указателем на обычный double, а не делать его ref или out.

Если реализация функции выполняет арифметику указателей, то вам нужно будет создать и передать какую-то индексируемую коллекцию, например, такую, которая реализует IList или массив.

Альтернативы нормальному коду C #

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

Вы также можете использовать C ++ / CLI вместо C #. Он также является языком .Net и может быть проще (в зависимости от вашего приложения) напрямую интегрироваться с существующим кодом C ++.

0 голосов
/ 15 августа 2011

Что вы будете делать, будет зависеть от того, как используется указатель.Если указатель существует, чтобы вызывающий код мог передать массив double s, тогда метод должен принять double[].Если указатель существует, чтобы вызываемый код мог изменить значение переменной double из вызывающей стороны, тогда у вас есть два варианта:

  • Изменить семантику вызова таким образом, чтобыdouble - это возвращаемое значение (так я бы предложил)
  • Объявите параметр как ref или out (в зависимости от того, хотите ли вы гарантировать, что вызванная функцияназначит значение.

Не просто бросайте unsafe блоки вокруг кода, чтобы вы могли продолжать использовать указатели; unsafe следует использовать очень экономно (идеальносовсем нет).

0 голосов
/ 15 августа 2011

Когда вы передаете указатели, вы просто меняете механизм передачи по значению по умолчанию на передачу по ссылке , в этом случае используйте ключевое слово ref:

public void SomeMethod(ref double val) { }

В которой вы должны указать ref при вызове:

SomeMethod(ref 12.0);
0 голосов
/ 15 августа 2011

Вы можете отметить функцию как unsafe и скомпилировать с флагом / unsafe :

private static unsafe void MyFunction(double *d)

См. http://msdn.microsoft.com/en-us/library/chfa2zb8.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...