【问题标题】:Problems with multiplying in Obj-CObj-C 中的乘法问题
【发布时间】:2012-01-30 23:15:40
【问题描述】:

我是 Objective-C 的新手,如果这在语言中本身不起作用,请原谅,但它似乎应该这样做。我想要做的是以英寸为单位计算书籍对象的厚度。以下是Book 头文件中的对象:

NSString *title, *author;
int *numPages;
/**
 * The thickness of any given page in the book, in inches (e.g. 20lb stock would be 0.0038)
 */
double *pageThickness;
bool *hasHardCover;

我的想法是,我将通过将(页面厚度和页数的乘积)加上(书籍封面的厚度;如果是硬封面四分之一英寸,则为四)来计算书的厚度如果是平装本,则为页面厚度的倍数)。但是,我在以下实现中遇到了几个错误:

63 -(int *)calculateWidthInInches
64 {
65  return (((double *)numPages) *
66          pageThickness) +
67  (hasHardCover ? 0.25 :
68   (pageThickness * 4.0));
69 }

以下是错误:

/Users/student4/Downloads/LibraryOfBooks/Book.m:66: error: invalid operands to binary * (have 'double *' and 'double *')
/Users/student4/Downloads/LibraryOfBooks/Book.m:68: error: invalid operands to binary * (have 'double *' and 'double')
/Users/student4/Downloads/LibraryOfBooks/Book.m:69: warning: control reaches end of non-void function

我怀疑最后一个是编译返回行失败造成的。 我的calculateWidthInInches 方法做错了什么?

修复:


63 -(double)calculateWidthInInches
64 {
65  return ((*numPages) * *pageThickness) + (*hasHardCover ? 0.25 : (*pageThickness * 4.0));
66 }

【问题讨论】:

  • int * 不是 int,它是一个指向 int 的 指针。与double * 相同

标签: objective-c casting compiler-errors


【解决方案1】:

所有变量都是指针,而不是值。编译器抱怨您试图将指针相乘,这是一个没有意义的操作。

您需要在相乘之前取消引用指针,以便将值相乘,而不是值的地址。

编辑:另外,正如 Yuras 指出的那样,直接转换指针并不是一个好主意——取消引用指针,然后转换值:

-(double)calculateWidthInInches
{
    return (((double)*numPages) *
            pageThickness) +
    (*hasHardCover ? 0.25 :
     (*pageThickness * 4.0)); 
}

【讨论】:

    【解决方案2】:

    根据定义,该方法返回一个指向 int 的指针:

    -(int *)calculateWidthInInches
    

    应该是:

    -(int)calculateWidthInInches
    

    编辑: 此外,正如@thg435 所建议的那样,您也可能将其他类型的 ivars 类型化为指向原始数据类型的指针。

    恕我直言,您可能还需要将所有 int*、double* 和 bool* 类型变量更改为 int、double 和 bool 类型。

    这些是 C 支持的原始数据类型。实际上,如果从逻辑的角度来看,对象实例拥有这些值,则 Objective-C 对象应该保存这些值,而不是指向这些值的指针。

    【讨论】:

      【解决方案3】:

      doubledouble * 是不同的类型。二元运算符* 接受两个doubles,但您试图将double*s 相乘,这是错误的。返回类型也是如此。

      您可以“取消引用”指针 (*pageThickness) * 4.0

      但最好在任何地方使用double 而不是double *

      此外,将int* 转换为double* 通常非常是个坏主意;)

      NSString *title, *author;
      int numPages;
      double pageThickness;
      bool hasHardCover;
      

      -(int)calculateWidthInInches
      {
          return (((double)numPages) *
                  pageThickness) +
          (hasHardCover ? 0.25 :
           (pageThickness * 4.0));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 2011-02-11
        • 2022-12-07
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多