iOS 警告消息:将'CGFloat *'(也称为"双 *")传递给类型为 'float *' 的参数的不兼容指针类型



这导致我的应用程序运行。 此错误发生在此行modff(floatIndex, &intIndex); 我需要做什么来解决此问题?

编辑:这是因为&intIndex

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

我记得 CGFloat 在 32 位设备上定义为浮点数,在 64 位设备上定义为双精度。因此,您不想在调用 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;
}

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

您正在将CGFloat s(typedef'ed to double on your system)传递给期望float s的函数。

您可以将modfffabsf分别更改为 modffabs(速度较慢但更精确),也可以将intIndexrestIndex更改为 float s 而不是 double s(更快但不太精确)。

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

如果您使用的是 64 位架构(如 arm64),那么您应该使用 CGFloat,因为它被定义为双精度数,因此是 8 字节浮点数,而浮点数是 4 字节浮点数。

因此,您应该根据体系结构使用这些。

最新更新