【问题标题】:iOS warning message : Incompatible pointer types passing 'CGFloat *' (aka 'double *') to parameter of type 'float *'iOS 警告消息:不兼容的指针类型将“CGFloat *”(又名“double *”)传递给“float *”类型的参数
【发布时间】:2015-04-18 13:49:24
【问题描述】:

这导致我的应用程序启动。这个错误发生在这条线上modff(floatIndex, &intIndex); 我需要做什么来解决这个问题?

编辑:这是因为 &intIndex

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

【问题讨论】:

    标签: ios objective-c iphone


    【解决方案1】:

    我记得 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;
    }
    

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您将CGFloats(在您的系统上将类型定义为double)传递给期望floats 的函数。

      您可以将modfffabsf 分别更改为modffabs(更慢但更精确),或者将intIndexrestIndex 更改为floats 而不是@987654331 @s(更快但不太精确)。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          所以你应该根据架构来使用这些。

          【讨论】:

          • 是的,我们可以使用 CGFloat 代替 float。
          猜你喜欢
          • 2018-05-23
          • 2020-08-30
          • 1970-01-01
          • 1970-01-01
          • 2021-06-29
          • 2011-01-10
          • 2020-07-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多