#iphone #c #pointers
#iPhone #c #указатели
Вопрос:
Я пытаюсь вызвать функцию, но получаю сообщение об ошибке:
предупреждение: передача аргумента 1 ‘drawPlot’ из несовместимого типа указателя
//call
drawPlot(amp;listData);
//header
void drawPlot(NSMutableArray*);
listData — это, конечно, NSMutableArray
Комментарии:
1. вы уверены, что это не
NSMutableArray*
?2. конечно, это моя ошибка, это должен быть listData без амперсанда.
Ответ №1:
Удалите amp;. Ваша переменная уже является указателем. Я предполагаю, что вы объявили это следующим образом: NSMutableArray *listData;
.
Таким образом, использование amp; передает «указатель на указатель» функции, которая ожидает просто указатель на NSMutableArray.
Теперь в SDK есть несколько мест, которые ожидают NSError **
. И это когда вы бы использовали amp;, например:
NSError * ошибка = ноль; ... [Ошибка doSomethingReturningError от SomeClass:amp;error]; если (ошибка != ноль) { // случилось что-то плохое }
Итак, разница здесь в том, что передача, в вашем случае, listData
передает объект по значению. Само значение переменной не может быть изменено (но содержимое массива может быть изменено). Другой случай ( amp;error
) — передача по ссылке, что означает, что значение переменной, то есть сам указатель, может быть изменено. Вот почему в этом случае вы можете сравнить результат с нулем, чтобы увидеть, пошло ли что-то не так.
Более простым примером является сравнение разницы между следующими:
недействительное изменение intbyvalue(int i) { я ; } аннулирует changeIntByReference(int amp;i) { я ; } int x=2; changeIntByValue(x); NSLog(@"%d", x); // выводит 2 changeIntByReference(amp;x); NSLog(@"%d", x); // выводит 3
Передача по значению не позволяет изменять аргументы, в то время как передача по ссылке позволяет.
Ответ №2:
Определение listData должно выглядеть примерно так:
NSMutableAarray listData; //OR
NSMutableAarray listData[];
Если первое, то измените вызов drawPlot на
drawPlot(amp;listData[0]) // OR
drawPlot(listData)
Если последнее, то измените вызов drawPlot на
drawPlot(amp;listData [ the index of the listData array member you want to plot]); // does it work now?