адрес ivar в качестве аргумента

#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?