iphone xcode5 cocos2d-x ios7.1 cocos2d-x-2.x

iphone - Error "La conversión del puntero al tipo más pequeño ''int'' pierde información" en EAGLView.mm cuando se actualiza Xcode a 5.1(5B130a)



xcode5 cocos2d-x (8)

Aparentemente, la versión de Clang en Xcode 5.1 y superior es más estricta sobre las posibles incompatibilidades de 32 bits frente a las de 64 bits en el código fuente que las versiones anteriores de Clang. Para ser honesto, creo que el ruido metálico es demasiado restrictivo aquí. Un compilador sano puede lanzar una advertencia en líneas como esta, pero de ninguna manera debería arrojar un error, porque este código NO es incorrecto, simplemente es potencialmente propenso a errores, pero puede ser perfectamente válido.

El código original es

ids[i] = (int)touch;

siendo los identificadores una matriz de puntos y el toque como puntero.

En una compilación de 64 bits, un puntero es de 64 bits (a diferencia de una compilación de 32 bits, donde es de 32 bits), mientras que un int es de 32 bits, por lo que esta asignación almacena un valor de 64 bits en un almacenamiento de 32 bits, lo que puede resultar en una pérdida de información.

Por lo tanto, es perfectamente válido que el compilador arroje un error para una línea como

ids[i] = touch;

Sin embargo, el código real en cuestión contiene una conversión explícita de estilo c a int. Este reparto explícito le dice claramente al compilador "Cállate, sé que este código no parece correcto, pero sí sé lo que estoy haciendo".

Por lo tanto, el compilador es muy delicado aquí y la solución correcta para hacer que el código se compile nuevamente y aún así mostrar el mismo comportamiento que en Xcode 5.0 es convertir primero a un tipo entero con un tamaño que coincida con el de un puntero y Luego haz un segundo lanzamiento al int que realmente queremos:

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

Estoy usando size_t aquí, porque siempre tiene el mismo tamaño que un puntero, sin importar la plataforma. Un largo largo no funcionaría para sistemas de 32 bits y un largo no funcionaría para Windows de 64 bits (mientras que los sistemas Unix y similares a Unix de 64 bits como OS X usan el modelo de datos LP64, en el que un largo de 64 bits, Windows de 64 bits usa los datos LLP64 modelo, en el que un largo tiene un tamaño de 32 bits ( http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models )).

Ayer, actualicé Xcode a la versión más reciente (5.1 (5B130a)) compatible con iOS 7.1 . Luego construyo mi proyecto, EAGLView.mm el error "Cast from pointer to smaller type ''int'' loses information" en el archivo EAGLView.mm ( line 408 ) cuando los simuladores de 64 bits (por ejemplo: iPhone Retina de 4 pulgadas, 64 bits) son seleccionado.

Estoy usando cocos2d-x-2.2.2 . Antes de actualizar Xcode, mi proyecto aún puede compilarse y ejecutarse normalmente con todos los dispositivos.

Gracias por toda la recomendación.

Actualización: Hoy descargué la última versión de cocos2d-x (cocos2d-x 2.2.3). Pero el problema todavía ha sucedido.

Aquí hay un fragmento de código donde se produce ese error:

/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); }


Me encuentro con este problema también.

ids[i] = (int)touch; // error ocurre aquí => cambio esto a continuación.

ids[i] = (uintptr_t)touch;

Entonces puedo continuar compilando. Tal vez usted puede intentar esto también.


Puede corregir este error reemplazando esta línea de código.

IDs [i] = (uint64_t) touch;

Debería realizar una conversión de tipo basada en un sistema de construcción de 64 bits porque el tipo "int" solo admite -32768 ~ 32768.


Reemplace estos ids[i] = (int)touch; con ids[i] = (uintptr_t)touch;

Esto funciona para mi.


Seguramente la solución es cambiar el tipo de identificadores de int a tip que sea lo suficientemente grande como para contener un puntero.

No estoy familiarizado con XCode, pero la solución debería ser algo como lo siguiente:

Cambia la declaración de ids a:

intptr_t ids[IOS_MAX_TOUCHES_COUNT];

y la línea que produce el error para:

ids[i] = (intptr_t)touch;

La mayoría de las "soluciones" anteriores pueden perder parte de la dirección del puntero cuando se lanza a un tipo más pequeño. Si el valor se usa de nuevo como puntero, será una idea extremadamente mala.


XCode 5.1 es cambiar toda la arquitectura a 64 bits.

simplemente puede cambiar la arquitectura para que sea compatible con la compilación de 32 bits.

  • use $ (ARCHS_STANDARD_32_BIT) en Arquitectura en lugar de $ (ARCHS_STANDARD)
  • eliminar arm64 en Valid Architectures

Espero eso ayude.


puedes usar uintptr_t en lugar de int. Su estándar seguido por Xcode.


ids[i] = (int)touch; put * and check it. ids[i] = *(int *)touch;