Как связать аргумент с двойной функцией?

Рассмотрим эти функции C:

#define INDICATE_SPECIAL_CASE -1
void prepare (long *length_or_indicator);
void execute ();

Функция prepare используется для хранения указателя на отложенное long * выходная переменная.

Это может быть использовано в C следующим образом:

int main (void) {
    long length_or_indicator;
    prepare (&length_or_indicator);
    execute ();
    if (length_or_indicator == INDICATE_SPECIAL_CASE) {
        // do something to handle special case
    }
    else {
        long length = lengh_or_indicator;
        // do something to handle the normal case which has a length
    }
}

Я пытаюсь добиться чего-то подобного в Вала:

int main (void) {
    long length;
    long indicator;
    prepare (out length, out indicator);
    execute ();
    if (indicator == INDICATE_SPECIAL_CASE) {
        // do something to handle special case
    }
    else {
        // do something to handle the normal case which has a length
    }
}

Как написать привязку для prepare () а также INDICATE_SPECIAL_CASE в Вала?

Можно ли разбить переменную на две части?

Можно ли избежать использования указателей, хотя out переменная записывается после вызова prepare ()execute ())?

1 ответ

Решение

Проблема с использованием out в том, что Vala будет генерировать много временных переменных по пути, что сделает ссылку неверной. Что вы, вероятно, хотите сделать, это создать метод в вашем VAPI, который скрывает все это:

[CCode(cname = "prepare")]
private void _prepare (long *length_or_indicator);
[CCode(cname = "execute")]
private void _execute ();
[CCode(cname = "prepare_and_exec")]
public bool execute(out long length) {
  long length_or_indicator = 0;
  prepare (&length_or_indicator);
  execute ();
  if (length_or_indicator == INDICATE_SPECIAL_CASE) {
     length = 0;
     return false;
  } else {
     length = lengh_or_indicator;
     return true;
 }
}
Другие вопросы по тегам