2016-01-28 12 views
0

В Vala Tutorial проекта в Variable-Length Argument Lists, есть метод вызова показано:Vala varargspassing свойство: значение пары

Общий шаблон с переменным числом аргументов, чтобы ожидать, чередующиеся строки - пары значений в качестве аргументов, как правило, это означает GObject свойство - стоимость. В этом случае вы можете написать свойство: значение вместо этого, например: actor.animate (AnimationMode.EASE_OUT_BOUNCE, 3000, x: 100.0, y: 200.0, rotation_angle_z: 500.0, opacity: 0);

эквивалентно:

actor.animate (AnimationMode.EASE_OUT_BOUNCE, 3000, "х", 100,0, "у", 200,0, "угла поворота-Z", 500,0, "непрозрачность", 0) ;

Как я могу декодировать это? Код, показанный в статье, предназначен для более нормального прохождения всех параметров запятой. Он неправильно декодирует альтернативный стиль.

Я попытался пример кода: данный

void method_with_varargs(int fixed, ...) { 
    var l = va_list(); 
    while (true) { 
     string? key = l.arg(); 
     if (key == null) { 
      break; // end of the list 
     } 
     double val = l.arg(); 
     stdout.printf("%s: %g\n", key, val); 
    } 
} 

И печатает

x: 0 

rotation_angle_z: 0 

Если я вынимаю двойной Вэл

void method_with_varargs(int fixed, ...) { 
    var l = va_list(); 
    while (true) { 
     string? key = l.arg(); 
     if (key == null) { 
      break; // end of the list 
     } 
     stdout.printf("%s: \n", key); 
    } 
} 

печатает

x:0 

y:0 
rotation_angle_z: 0 
opacity: 0 

Я предполагаю, что это должен быть другой тип, чем строка, но что?

string? key = l.arg(); 

ответ

0

Это немного трудно быть уверенными без вас, показывая вызов точной функции, но я думаю, что вы смешение Int в сторону вызывающего абонента. 0 - это не то же самое, что и 0.0; первый - это int, второй - двойной. Как правило, ints - 32 бита, а double - 64 бита, поэтому, если вы передаете int, но пытаетесь прочитать его как двойное (или наоборот), у вещей есть привычка выходить из синхронизации и развращать не только текущий аргумент, но и будущие аргументы также.

В принципе, убедитесь, что все ваши аргументы значения одного типа или назначают значения разных ключей переменной правильного типа (то есть if (key == "opacity") { uint val = l.arg(); } else { double val = l.arg(); }).

С такими функциями, как Clutter.Actor.animate(), тип определяется путем поиска соответствующего свойства GObject. x, y и rotation-angle-z все плавают, а opacity - это uint. Поплавки получают удвоение при передаче в вариативные функции (я не могу на самом деле помнить, указывает ли C это или это всего лишь соглашения об использовании x86), поэтому 0.0 работает так, как ожидалось, но, вероятно, было бы правильнее использовать 0.0f для float аргументы и 0.0 для парных разрядов.

При использовании вариативных аргументов (как в C, так и в Vala) вы должны иметь в виду, что вы теряете тип безопасности. Вы должны быть очень осторожны, какие типы вы проходите, потому что компилятор не может сказать вам, когда вы испортите.

+0

Точный вызов функции был включен (и вырезано и вставлено из учебника): actor.animate (AnimationMode.EASE_OUT_BOUNCE, 3000, x: 100.0, y: 200.0, rotation_angle_z: 500.0, opacity: 0); ' – user2241515

+0

Если это помогает - я добавил счетчик, и он выбирает это как 4 параметра:' x: 100.0, y: 200.0, rotation_angle_z: 500.0, opacity: 0', и все, что я получаю, это начало строки. Все, начиная с «:», теряется. – user2241515

+0

Здесь я создал суть, это должно объяснить лучше. Существуют два класса Actor1 - стандартный стиль, и Actor2 использует стиль разделения двоеточия, который я задаю, как декодировать: [Varargs.vala] (https://gist.github.com/darkoverlordofdata/6ad7694a07a9332a04d0) – user2241515

 Смежные вопросы

  • Нет связанных вопросов^_^