Получение сообщения об ошибке «Управление достигает конца не пустой функции» в XCode - PullRequest
5 голосов
/ 11 июля 2011

При добавлении этого кода в простую калькуляторную программу я получаю сообщение об ошибке «Управление достигает конца не пустой функции».

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

Спасибо, любая помощь будет оценена. При необходимости я также могу предоставить полный код программы.

-(double) changeSign
{
accumulator = -accumulator;
}

-(double) reciprocal
{
accumulator = 1/accumulator;

}

-(double) xSquared
{
accumulator = accumulator * accumulator;
}

Ответы [ 5 ]

7 голосов
/ 11 июля 2011

Очень просто, каждый из ваших методов объявлен как возвращающий double, но вы никогда ничего не возвращаете.

Вам нужно сделать что-то вроде:

-(double) changeSign
{
accumulator = -accumulator;
return accumulator;
}

Или, в качестве альтернативы, если вы не собираетесь возвращать новое значение accumulator, измените тип возврата на void:

-(void) changeSign
{
accumulator = -accumulator;
}

ps.проблема не в том, что программа "зависнет в случае, если аккумулятор не установлен".Это то, что вы говорите «Здесь метод, который возвращает double», но код на самом деле ничего не возвращает.Сообщение об ошибке означает «Я дошел до конца этой функции, что вы обещали что-то вернуть, но вы, кажется, забыли».

1 голос
/ 11 июля 2011

Ваш код указывает, что каждый из этих методов будет возвращать double:

- (double) reciprocal
{ // ^^ Return type
...

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

- (double) reciprocal
{
    accumulator = 1 / accumulator;
    return accumulator;
}

Затем в коде вызова вы можете присвоить результат этого метода переменной:

double foo = [someObject reciprocal];

Или, если вы не собираетесь передавать значение обратно (возможно, вы просто обновляете какое-то внутреннее состояние), измените тип возвращаемого значения на void.

- (void) reciprocal
{ // ^^ Indicates that there is no return value
...
1 голос
/ 11 июля 2011

Вам нужно return a double. Основной синтаксис метода:

-(return type)methodName

Если accumulator объявленное свойство, то ваши функции ничего не могут вернуть, т.е. void, как это

-(void) changeSign
{
accumulator = -accumulator;
}

Таким образом, вызов, такой как [self changeSign], ничего не вернет, но изменит значение accumlator.

Альтернативно, вы можете иметь тип возврата и вернуть accumulator по

-(double) changeSign
{
return -accumulator;
}

Тогда вы можете сделать что-то вроде:

self.accumulator = [self changeSign];

Я сомневаюсь, что первое - то, что вам нужно, но, надеюсь, это делает синтаксис более ясным.

0 голосов
/ 27 августа 2013

Если Вы определяете как

-(void)methodName{
//No need to return any thing.
}

, если Вам необходимо написать любой тип возврата.

-(int)methodName{
return int
}

Пример

-(void)getData{
//Write any thing without return.
}

-(int)getData{
int total = a + b;
return total;
}

Или

-(int)getData{
return a + b;}
0 голосов
/ 15 декабря 2012

Дело в том, что когда мы используем тип возврата, отличный от «void», мы должны возвращать что-то вызывающей функции, например:

(returnType)methodName
{
      ---required code---
      return something(as;-1/0/1/particular Value);
}
...