Animation 无法访问混乱中的动画属性

Animation 无法访问混乱中的动画属性,animation,vala,clutter,Animation,Vala,Clutter,我试图在混乱中为演员设置动画,但当我输入一个存在的属性时,出现了一些问题 actor.animate( AnimationMode.LINEAR, 400, scale_x:2); 给了我这个错误 混乱警告**:无法绑定属性“\x83\xec\u0014\x89\xc6e\xa1\u000c”:类型为“混乱纹理”的对象没有此属性 看起来像是Unicode字符。 但是,当我输入一个不存在的属性时 actor.animate( AnimationMode.LINEAR, 400, thisdoes

我试图在混乱中为演员设置动画,但当我输入一个存在的属性时,出现了一些问题

actor.animate( AnimationMode.LINEAR, 400, scale_x:2);
给了我这个错误

混乱警告**:无法绑定属性“\x83\xec\u0014\x89\xc6e\xa1\u000c”:类型为“混乱纹理”的对象没有此属性

看起来像是Unicode字符。 但是,当我输入一个不存在的属性时

actor.animate( AnimationMode.LINEAR, 400, thisdoesntwork:2);
我得到了一个更有意义的错误

杂波警告**:无法绑定属性“ThisDoesNetwork”:类型为“ClutterTexture”的对象没有此属性

当我尝试这种替代方法时,我遇到了完全相同的问题:

actor.animate( AnimationMode.LINEAR, 400, "scale-x", 2);

为什么所有实际存在的属性都会被转换成混乱的状态,我该怎么做才能使其正常工作?

您应该使用2.0作为值,而不是2。2是整数,2.0是双精度。Vala不能为可变方法提供类型安全性,因此您必须小心

至于为什么会看到现有属性的行为,我猜这与2是(32位)整数,2.0是(64位)双精度有关。这使事情简化了一点,我不知道您对C有多少经验(可能不是很多,因为这是来自动态类型语言的人会犯的一种错误),但是。。。杂波(好吧,va_arg)需要一个double,因此它解析64位数据,但您只提供了32位,因此包含下一个参数(NULL)的前32位。现在,当它开始尝试解析下一个参数时,它从错误的位置(参数中的32位)开始,因此您将得到NULL的剩余部分以及堆栈上发生的任何垃圾的一部分。。。令人惊讶的是,32位的0并非恰好如此,因此当杂波测试它刚刚读取的值==NULL时,它不是,并且杂波认为它被赋予了一个指向以NULL结尾的字符数组的指针(这是字符串在C中的表示方式)。它读取该位置的数据,恰好是\x83\xec\u0014\x89\xc6e\xa1\u000c,并检查是否有具有该名称的属性。没有,因此它会发出您看到的错误消息


现在,如果您切换到使用不存在的属性,杂波将解析参数(属性的名称),注意它不存在(就像上面第二个属性一样),并发出错误。

您应该使用2.0作为值,而不是2。2是整数,2.0是双精度。Vala不能为可变方法提供类型安全性,因此您必须小心

至于为什么会看到现有属性的行为,我猜这与2是(32位)整数,2.0是(64位)双精度有关。这使事情简化了一点,我不知道您对C有多少经验(可能不是很多,因为这是来自动态类型语言的人会犯的一种错误),但是。。。杂波(好吧,va_arg)需要一个double,因此它解析64位数据,但您只提供了32位,因此包含下一个参数(NULL)的前32位。现在,当它开始尝试解析下一个参数时,它从错误的位置(参数中的32位)开始,因此您将得到NULL的剩余部分以及堆栈上发生的任何垃圾的一部分。。。令人惊讶的是,32位的0并非恰好如此,因此当杂波测试它刚刚读取的值==NULL时,它不是,并且杂波认为它被赋予了一个指向以NULL结尾的字符数组的指针(这是字符串在C中的表示方式)。它读取该位置的数据,恰好是\x83\xec\u0014\x89\xc6e\xa1\u000c,并检查是否有具有该名称的属性。没有,因此它会发出您看到的错误消息

现在,如果您切换到使用一个不存在的属性,杂波将解析参数(属性的名称),注意它不存在(就像上面第二个属性一样),并发出错误