Функция с множественным возвращаемым параметром - PullRequest
0 голосов
/ 03 мая 2019

Я новичок в C #. Для водителя мотора, который мы используем, я хочу видеть его ток, и в руководстве водителя мотора есть функция BOOL. Но я понятия не имею, как я могу это использовать.

VCS_GetCurrentIsAveraged(KeyHandle,NodeId, short* pCurrentIsAveraged,
pErrorCode)

для этой функции KeyHandle и NodeId являются параметрами, а pCurrentIsAveraged и pErrorCode являются возвращаемыми параметрами.

У меня есть все параметры в моем коде, кроме pCurrentIsAveraged, что я и хочу увидеть. Так как я могу получить это значение в качестве возврата.

//Initialize

short* pCurrentIsAveraged;

double current;

current=VCS_GetCurrentIsAveraged(KeyHandle,NodeId,pCurrentIsAveraged,
pErrorCode)

Будет ли это работать, я хочу получить текущий, но что я должен ввести для значения pCurrentIsAveraged в качестве возвращаемого параметра?

Спасибо.

1 Ответ

0 голосов
/ 03 мая 2019

Использование функции signature VCS_GetCurrentIsAveraged(KeyHandle,NodeId, short* pCurrentIsAveraged, pErrorCode) требует от вас использования небезопасного кода, которого следует избегать, если вы новичок в C #. Это похоже на оболочку p / invoke вокруг C-style API.

В нынешнем виде вам нужно будет вызывать его следующим образом (из небезопасного блока) (fixing может не потребоваться, если currentIsAveraged находится в стеке):

short currentIsAveraged = 0;
double current;
fixed (short* pCurrentIsAveraged = &currentIsAveraged) {
   current = VCS_GetCurrentIsAveraged(KeyHandle,NodeId,pCurrentIsAveraged, pErrorCode);
}
bool isCurrentAveraged = (currentIsAveraged != 0);

Если вы контролируете определение p / invoke VCS_GetCurrentIsAveraged, вы можете изменить эту подпись, чтобы использовать ref short pCurrentIsAveraged вместо short* pCurrentIsAveraged. Это позволит вам использовать этот метод следующим образом (без необходимости небезопасного кода):

short currentIsAveraged = 0;
double current;
current = VCS_GetCurrentIsAveraged(KeyHandle,NodeId,ref currentIsAveraged, pErrorCode);
bool isCurrentAveraged = (currentIsAveraged != 0);

Вы можете дополнительно оптимизировать сигнатуру p / invoke, используя атрибут [Out] для этого значения, чтобы маршаллер пропустил, вероятно, ненужную копию, и вы также могли бы посоветовать компилятору трактовать его как bool напрямую, а не возвращаться туда-сюда с short, но это все продвинутые вещи. Проверьте пространство имен System.Runtime.InteropServices, если вы заинтересованы в этом.

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