误差在EAGLView.mm“从指针转换为更小的类型‘INT’丢失信息”时更新的Xcode到5.1(5B130a)

问题描述 投票:19回答:8

昨天,我Xcode更新到最新版本(5.1 (5B130a))iOS 7.1兼容。然后,我建我的项目,我得到的错误"Cast from pointer to smaller type 'int' loses information"EAGLView.mm文件(line 408)当选择64位模拟器(例如:iPhone的Retina 4英寸64位)。

我使用cocos2d-x-2.2.2。在我更新Xcode中,我的项目仍可以生成并与所有设备正常运行。

感谢所有的建议。

更新:今天,我下载最新版本的cocos2d-x(下了cocos2d-x 2.2.3)的。但问题还是发生了。

下面是一些一段代码,其中的错误发生:

/cocos2d-x-2.2.2/cocos2dx/platform/ios/EAGLView.mm:408:18: Cast from pointer to smaller type 'int' loses information

// Pass the touches to the superview
#pragma mark EAGLView - Touch Delegate
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (isKeyboardShown_)
    {
        [self handleTouchesAfterKeyboardShow];
        return;
    }

    int ids[IOS_MAX_TOUCHES_COUNT] = {0};
    float xs[IOS_MAX_TOUCHES_COUNT] = {0.0f};
    float ys[IOS_MAX_TOUCHES_COUNT] = {0.0f};

    int i = 0;
    for (UITouch *touch in touches) {
        ids[i] = (int)touch;     // error occur here
        xs[i] = [touch locationInView: [touch view]].x * view.contentScaleFactor;;
        ys[i] = [touch locationInView: [touch view]].y * view.contentScaleFactor;;
        ++i;
    }
    cocos2d::CCEGLView::sharedOpenGLView()->handleTouchesBegin(i, ids, xs, ys);
}
iphone xcode5 cocos2d-x ios7.1 cocos2d-x-2.x
8个回答
38
投票

显然,在Xcode 5.1及以上版本铿锵更为严格有关在源代码中潜在的32位与64位不兼容性比老版本的铿锵已。说实话,我认为,铛过于局限在这里。一个理智的编译器可能会引发在这样但绝不应该抛出一个错误线的警告,因为这个代码是没有错的,它仅仅是容易出错的,但也可以是完全有效的。

原始代码

ids[i] = (int)touch;

使用IDS是整数数组和触摸是一个指针。

在64位建立一个指针为64bit(违背一个32位的构建,它是32位),而一个int是32位,所以该分配存储在一个32位的存储一个64位的值,这可能导致信息丢失。

因此,这是完全合法的编译器抛出一个错误的行状

ids[i] = touch;

然而问题的实际代码包含一个明确的C样式转换为int。这显式转换明确告诉编译器“闭嘴,我知道这个代码不看起来是正确的,但我知道我在做什么”。

因此,编译器是非常挑剔这里和正确的解决方案,以使代码编译再试,还是让它显示像在Xcode 5.0,是先投给大小的整数类型相匹配的指针之一,并以完全相同的行为又做了第二投地,我们真正想要的INT:

ids[i] = (int)(size_t)touch;

我使用的size_t在这里,因为它总是具有尺寸为指针一样,无论平台。很长很长也不会在32位系统上运行和长不会为64位Windows上工作(而像OS X 64位Unix和类Unix系统使用LP64数据模型,其中一个长为64位,64位Windows使用LLP64数据模型,其中一个长的尺寸的32位的(http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models))。


9
投票

替换该ids[i] = (int)touch;ids[i] = (uintptr_t)touch;

这个对我有用。


6
投票

我遇到这个问题了。

ids[i] = (int)touch; //错误发生在这里=>我改变了下面。

ids[i] = (uintptr_t)touch;

然后我就可以继续进行编译。也许你可以试试这个了。


2
投票

您可以改为使用int的uintptr_t的。它的标准,随后的Xcode。


2
投票

的XCode 5.1是改变所有体系结构到64位。

你可以改变架构由以下所有支持32位编译在构建设置

  • 在建筑,而不是$使用$(ARCHS_STANDARD_32_BIT)(ARCHS_STANDARD)
  • 除去在有效的架构arm64

希望能帮助到你。


0
投票

肯定的解决方案是从int改变ID的类型为类型,其足够大以保持一个指针。

我不熟悉的XCode,但解决的办法应该是这样如下:

更改ID来的声明:

intptr_t ids[IOS_MAX_TOUCHES_COUNT];

和线路产生的误差:

ids[i] = (intptr_t)touch;

大部分的“解决方案”的上述可强制转换为较小的类型时失去指针地址的一部分。如果该值被使用过的指针再次,这将被证明是一个非常糟糕的主意。


0
投票

您可以通过更换这行代码解决这个错误。

IDS [I] =(uint64_t中)的触摸;

因为类型“INT”只支持-32768〜32768您应该执行基于64位编译系统类型转换。


-1
投票
ids[i] = (int)touch; put * and check it.
ids[i] = *(int *)touch;
© www.soinside.com 2019 - 2024. All rights reserved.