указатели в target-c, как правильно вызвать функцию - вопрос для начинающих - PullRequest
0 голосов
/ 21 июня 2010

У меня есть динамически созданный прототип:

typedef double ICEDouble;
-(BOOL) getPosition:(SyDRpcInterfacePositionType)type longitude:(ICEDouble *)longitude latitude:(ICEDouble *)latitude;

, и я бы назвал его так, потому что у меня нет плана, как это сделать правильно:

NSNumber* longitudeReturn;
NSNumber** latitudeReturn;      
[prx getPosition:SyDRpcInterfaceMAPMATCHED longitude:longitudeReturn latitude:latitudeReturn];

компилятор говорит:

warning: passing argument 2 of 'getPosition:longitude:latitude:' from incompatible pointer type  
warning: passing argument 3 of 'getPosition:longitude:latitude:' from incompatible pointer type

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

Ответы [ 3 ]

3 голосов
/ 21 июня 2010

Предполагая, что ICEDouble от typedef'd до `double ', похоже, что метод, который вы вызываете, имеет два параметра out Это следует называть так:

double lat, long;
[prx getPosition:SyDRpcInterfaceMAPMATCHED longitude:&long latitude:&lat];

Это распространенная идиома, когда метод должен возвращать несколько значений без дополнительных затрат на объект. При необходимости вы можете преобразовать их в NSNumber с, если они вам нужны, через:

NSNumber * nLatitude = [NSNumber numberWithDouble:lat];
NSNumber * nLongitude = [NSNumber numberWithDouble:long];

Проверьте тип возврата getPosition:. Если он возвращает BOOL, вы захотите проверить результат, прежде чем использовать возвращенные значения. В противном случае lat и long будут представлять значения мусора.

2 голосов
/ 21 июня 2010

Несколько вещей:

  1. Подпись определяет ICEDouble, вы предоставляете NSNumber.
  2. С помощью NSNumber** latitudeReturn вы определяете указатель на указатель.

Так что я думаю, это должно быть

ICEDouble* longitudeReturn;
ICEDouble* latitudeReturn;      
[prx getPosition:SyDRpcInterfaceMAPMATCHED longitude:longitudeReturn latitude:latitudeReturn];
0 голосов
/ 22 июня 2010

и для этой конструкции?

    SyDRpcInterfaceNavInfos** datenSammlung;



    //-(BOOL) getGuidanceInfos:(SyDRpcInterfaceNavInfos **)infos;

    if([prx getGuidanceInfos:&datenSammlung]) {//further activities}

, если я разрешу &, и если я оставлю конец из-за дополнительного указателя- *, программа завершит работу с обоими созвездиями здесь.SyDRpcInterfaceNavInfos является структурой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...