在Obj-C中乘法的问题

时间:2012-01-30 23:15:41

标签: objective-c casting compiler-errors

我是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 }

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

-(int *)calculateWidthInInches

应该是:

-(int)calculateWidthInInches

修改 另外,正如@ thg435所建议的那样,你可能也错误地将其他类型的ivars作为指向原始数据类型的指针。

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

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

答案 2 :(得分:0)

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

您可以“取消引用”指针(*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));
}