Как связать аргумент с двойной функцией?
Рассмотрим эти функции 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;
}
}