Проблемы с умножением в Obj-C - PullRequest
0 голосов
/ 31 января 2012

Я новичок в 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 методом?

Fix:


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

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Все ваши переменные являются указателями, а не значениями.Компилятор жалуется, что вы пытаетесь умножить указатели - операция, которая не имеет смысла.

Вам необходимо разыменовать указатели перед умножением, чтобы умножить значения, а не адреса значений.

РЕДАКТИРОВАТЬ: Кроме того, как указывает Юрас, непосредственное приведение указателей не является хорошей идеей - разыменуйте указатель, а затем приведите значение:

-(double)calculateWidthInInches
{
    return (((double)*numPages) *
            pageThickness) +
    (*hasHardCover ? 0.25 :
     (*pageThickness * 4.0)); 
}
1 голос
/ 31 января 2012

Метод возвратил указатель на int по определению:

-(int *)calculateWidthInInches

Это должно быть:

-(int)calculateWidthInInches

Редактировать: Также, как предложил @ thg435, вы также можете ошибаться с другими иварами, указанными в качестве указателей на примитивные типы данных.

ИМХО, вам также может понадобиться изменить все ваши переменные типа int *, double * и bool * на типы int, double и bool.

Это примитивные типы данных, поддерживаемые C. На практике объект Objective-C должен содержать эти значения, а не указатель на эти значения, если экземпляр объекта владеет этими значениями с точки зрения логики.

0 голосов
/ 31 января 2012

double и double * - это разные типы.Двоичный оператор * принимает два 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));
}
...