iOS警告消息:不兼容的指针类型将'CGFloat *'(又名'double *')传递给'float *'类型的参数

时间:2015-02-03 01:09:27

标签: ios objective-c iphone

这导致我的App采取行动。此错误发生在此行modff(floatIndex, &intIndex);我需要做些什么才能解决此问题?

编辑:这是因为& intIndex

- (BOOL)isFloatIndexBetween:(CGFloat)floatIndex {
  CGFloat intIndex, restIndex;
  restIndex = modff(floatIndex, &intIndex);
   BOOL isBetween = fabsf(restIndex - 0.5f) < EPSILON;
  return isBetween;
  }

5 个答案:

答案 0 :(得分:3)

我记得CGFloat在32位设备上定义为float,在64位设备上定义为double。因此,您不希望在调用modff()时使用CGFloat。相反,使用特定类型声明参数,并使用强制转换。

像这样的东西(在这种情况下,我使用modf和所有浮点变量。

- (BOOL)isFloatIndexBetween:(CGFloat)floatIndex 
{
  float restIndex;
  float first, second;
  first = (float) floatIndex; 
  restIndex = modf(first, &second);
  BOOL isBetween = fabsf(restIndex - 0.5f) < EPSILON;
  return isBetween;
}

答案 1 :(得分:1)

您正在将CGFloat s(系统上的typedef&#39; ed传递给double)传递给期望float的函数。

您可以分别将modfffabsf更改为modffabs(更慢但更精确),或更改intIndex和{{1成为restIndex而不是float s(更快但不太精确)。

答案 2 :(得分:1)

学会说编译器错误/警告是非常宝贵的技能。在这种情况下,它告诉您modff期望float(即单精度浮点数),但是您传递CGFloat(这是typedef'd为double,这是一个双精度浮点数)。正如NobodyNada所说,您可以更改您正在使用的功能或intIndex类型。

答案 3 :(得分:0)

使用特定于体系结构的类型(如CGFloat)时,避免这些类型的警告和错误的最简单方法可能是将#import <tgmath.h>放入预编译的头文件或此文件的导入中。这样就可以使用底层C函数的类型泛型版本。在这种情况下,它会使您的警告消失,而不会更改任何代码。然后,只需要确保精度是你想要的。

答案 4 :(得分:0)

如果您使用的是64位体系结构(如arm64),那么您应该使用CGFloat,因为它被定义为double,因此它是一个8字节的浮点数,而float是一个4字节的浮点数。

所以你应该根据架构使用它们。