【问题标题】:"invalid operands of types 'objc_object*' and 'float'" error?“'objc_object *'和'float'类型的无效操作数”错误?
【发布时间】:2013-05-21 11:47:08
【问题描述】:

当我尝试在 xcode 模拟器中测试我的游戏时,我收到以下错误。任何人都知道出了什么问题。顺便说一句,如果演员与物体发生碰撞,则行为是解锁新关卡:

第 49 行错误:“objc_object*”和“float”类型的操作数无效 转二进制

第 58 行错误:“objc_object*”和“float”类型的操作数无效 转二进制

第 73 行错误:iso c++ 禁止指针和指针之间的比较 整数

这里是IOS代码: 第 49 行:

 if(([mActor touchedActor] && ([self getGameAttribute:@"Highest Level Completed"] >= [self asNumber:[NSNumber numberWithFloat:_levelnumber]])))

第 58 行:

if(([self getGameAttribute:@"Highest Level Completed"] >= [self asNumber:[NSNumber numberWithFloat:_levelnumber]]))

第 73 行:

 if(([mActor touchedActor] && (([self getGameAttribute:@"Highest Level Completed"] <= 5) && [[Game game] purchasedProduct:@"MyID"])))

行为的所有代码:

#import <Box2D/Box2D.h>
#import <AudioToolbox/AudioServices.h>
#import <Foundation/Foundation.h>
#import "ActorScript.h"

#import "Script.h"

#import "Actor.h"
#import "ActorType.h"
#import "Assets.h"
#import "Behavior.h"
#import "Collision.h"
#import "CollisionPoint.h"
#import "Game.h"
#import "GameModel.h"
#import "GroupDef.h"
#import "FadeInTransition.h"
#import "FadeOutTransition.h"
#import "Region.h"
#import "Runnable.h"
#import "Scene.h"
#import "SHThumbstick.h"
#import "Sparrow.h"
#import "Transition.h"



@interface Design_190_190_Clicktoplaylevel : ActorScript 
{
    @public
        NSString* tempHolder;

Scene* _Scenetoplay;

NSString* _Levellabel;

float _levelnumber;

}
@end

@implementation Design_190_190_Clicktoplaylevel

-(void)load
{
        [self addWhenUpdatedListener:nil func:^(NSMutableArray* list, Script* theScript){
Design_190_190_Clicktoplaylevel* self = (Design_190_190_Clicktoplaylevel*) theScript;

                    if(([mActor touchedActor] && ([self getGameAttribute:[self asNumber:[NSNumber numberWithFloat:[[self getGameAttribute:@"Highest Level Completed"] floatValue]]]] >= [self asNumber:[NSNumber numberWithFloat:_levelnumber]])))
{
                [self setGameAttribute:[[self getGameAttribute:@"Current Level"] floatValue] value:[NSNumber numberWithFloat:[self asNumber:[NSNumber numberWithFloat:_levelnumber]]]];
                [self switchScene:_Scenetoplay.ID leave:[self createFadeOut:((1000*1)) color:0] enter:[self createFadeIn:((1000*1)) color:0]];
}

}];
    [self addWhenDrawingListener:nil func:^(SPRenderSupport* g, int x, int y, BOOL screen, NSMutableArray* list, Script* theScript){
Design_190_190_Clicktoplaylevel* self = (Design_190_190_Clicktoplaylevel*) theScript;
        if(([self getGameAttribute:[self asNumber:[NSNumber numberWithFloat:[[self getGameAttribute:@"Highest Level Completed"] floatValue]]]] >= [self asNumber:[NSNumber numberWithFloat:_levelnumber]]))
{
            [mActor setAnimation:@"Animation 1"];
            [[Game game] setFont:[ self getFont:52] size:1];
            [[Game game] drawString:_Levellabel x:(([mActor getWidth] - [[Game game] getWidthForString:[ self getFont:52] string:_Levellabel]) / 2) y:30];
}

        else
{
            [mActor setAnimation:@"Animation 0"];
}

}];
    [self addWhenUpdatedListener:nil func:^(NSMutableArray* list, Script* theScript){
Design_190_190_Clicktoplaylevel* self = (Design_190_190_Clicktoplaylevel*) theScript;
                    if(([mActor touchedActor] && (([self getGameAttribute:[self asNumber:[NSNumber numberWithFloat:[[self getGameAttribute:@"Highest Level Completed"] floatValue]]]] <= [self asNumber:[NSNumber numberWithFloat:5]]) && [[Game game] purchasedProduct:@"MyID"])))
{
                [self setGameAttribute:[[self getGameAttribute:@"Current Level"] floatValue] value:[NSNumber numberWithFloat:[self asNumber:[NSNumber numberWithFloat:_levelnumber]]]];
                [self switchScene:_Scenetoplay.ID leave:[self createFadeOut:((1000*1)) color:0] enter:[self createFadeIn:((1000*1)) color:0]];
}

            else if((([mActor touchedActor] && [self sameAs:[self getGameAttribute:[self asNumber:[NSNumber numberWithFloat:[[self getGameAttribute:@"Highest Level Completed"] floatValue]]]] two:[NSNumber numberWithFloat:[self asNumber:[NSNumber numberWithFloat:5]]]]) && !([[Game game] purchasedProduct:@"MyID"])))
{
                return;
}


}];

} 




-(void)forwardMessage:(NSString*)msg
{

【问题讨论】:

  • 如果您还发布了这些错误所指文件的源代码,那将会很有用。
  • 请发布您的 getGameAttribute 和 asNumber 方法实现。
  • 我不太明白你的意思。

标签: xcode testing device


【解决方案1】:

看起来在所有三种情况下问题都是相同的 - 您正在尝试比较 NSNumber 对象。比较运算符(在您的情况下为&lt;= 和&gt;=)不会重载以接受NSNumber。

NSNumber本身有三个方法:isEqualToNumber:、isEqual:和compare:;这将比较两个 NSNumber 实例。

您还可以使用floatValue、inValue、等来比较NSNumber 的值。因此,例如,您最后的比较可能是:

[self getGameAttribute:@"Highest Level Completed"].intValue <= 5

或使用方法,而不是属性,语法:

[[self getGameAttribute:@"Highest Level Completed"] intValue] <= 5

顺便说一句,您似乎将游戏关卡存储为浮点数。我显然不了解您的应用程序,但将其存储为整数似乎更合乎逻辑,并且可以避免浮点舍入问题(取决于您对它们执行的操作)。

【讨论】:

  • 感谢您,这对您有很大帮助。我已经修复了其中的两个 58 和 73 但不知何故我仍然在第 49 行得到错误。你能告诉我你将如何解决这个问题(第 49 行)吗? : if(([mActor touchActor] && ([self getGameAttribute:@"Highest Level Completed"] >= [self asNumber:[NSNumber numberWithFloat:_levelnumber]])))
  • @user2422226 - 49 中的比较与 58 中的比较相同,因此所需的更改应该相同。你的 expr [self asNumber:[NSNumber numberWithFloat:_levelnumber]] 看起来很奇怪。它需要一个浮点数(本身很奇怪,请参阅答案中的 BTW),从中构造一个 NSNumber 对象,然后将其传递给一个返回 NSNumber 对象的方法... asNumber 做什么 &你为什么首先使用所有这些NSNumber 对象?这些 q 无法从显示的代码中回答。我认为您可能会对 NSNumber 对象的使用和需求感到困惑。
  • 感谢 qucik 的回复,是的,我对 NSNumber 对象有点困惑,我也是 Objective-c 的新手。顺便说一句(从现在开始会做,但我已经完成了这个游戏,所以在下一个之前不会做)。我实际上发现 58 没有正常工作,这是第 58 行代码:`if(([self getGameAttribute:@"Highest Level Completed"] >= [self asNumber:[floatValue:_levelnumber]))))´跨度>
  • @user2422226 - 如果您没有更改它,那么它当然不会起作用,这就是答案所解释的 - 您无法将 NSNumber 对象与比较运算符进行比较(来自您的错误消息正在尝试比较 NSNumber 和 float)。 Objective-C 属于 C 家族,为程序员提供了足够的空间来编写编译器接受但毫无意义的东西。你很幸运编译器已经标记了这 3 个,即使对于 C,它们也太错误了。但是,如果你在其他地方进行比较,例如,两个 NSNumbers,那么编译器可能很安静,但结果错误。
猜你喜欢
  • 1970-01-01
  • 2019-03-02
  • 2023-01-26
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2016-09-24
相关资源
最近更新 更多