代码之家  ›  专栏  ›  技术社区  ›  nico

目标C中的指针,如何正确调用函数-初学者问题

  •  0
  • nico  · 技术社区  · 14 年前

    我有一个动态制作的原型:

    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 回复  |  直到 14 年前
        1
  •  3
  •   Jason    14 年前

    假设 ICEDouble typedef被设置为“double”,您调用的方法似乎有两个“out”参数。应该这样称呼:

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

    当一个方法需要返回多个值而没有对象开销时,这是一个常见的习惯用法。如果需要,可以将这些转换为 NSNumber S如果您需要,通过:

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

    检查返回类型 getPosition: 不过。如果它返回 BOOL 在使用返回值之前,您需要检查结果。否则, lat long 将表示垃圾值。

        2
  •  2
  •   Felix Kling    14 年前

    几件事:

    1. 签名定义 ICEDouble ,你提供 NSNumber .
    2. NSNumber** latitudeReturn 定义指向指针的指针。

    所以我想应该是

    ICEDouble* longitudeReturn;
    ICEDouble* latitudeReturn;      
    [prx getPosition:SyDRpcInterfaceMAPMATCHED longitude:longitudeReturn latitude:latitudeReturn];
    
        3
  •  0
  •   nico    14 年前

    在这个结构上呢?

        SyDRpcInterfaceNavInfos** datenSammlung;
    
    
    
        //-(BOOL) getGuidanceInfos:(SyDRpcInterfaceNavInfos **)infos;
    
        if([prx getGuidanceInfos:&datenSammlung]) {//further activities}
    

    如果我允许&,或者因为额外的指针-*而离开末尾,那么程序将在这两个星座同时退出。sydrpcinterfacenavinfos是一个结构。