繁体   English   中英

在Objective-C中使用C函数(适用于iPhone)

[英]Using a C function in Objective-C (for iPhone)

'好吧。 我是一个自我描述的iPhone编程招执的人(拥有更长的perl和网络背景 - 30年)......但上周冒了一大笔钱买了几本好书。 在填写并阅读了超过1000页之后 - 并且非常了解它,我正在前往一个良好的第一个原生iPhone应用程序。 我的问题是:我不知道如何在Objective-C中做一个简单的Geographic(lat / long)多边形点例程。 我有2种方法可以做到这一点。 一个在C(第一个代码示例)和一个在JavaScript(第二个代码示例):

// this is the poly.h file

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy);


// this is the poly.c file

#include "poly.h"
int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy){
 int i, j, c = 0;
 for (i = 0, j = nvert-1; i < nvert; j = i++) {
 if ( ((verty[i]>testy) != (verty[j]>testy)) &&
  (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
    c = !c;
 }
 return c;
}

或者这个(在Javascript中):

function _isPointInPoly(poly, pt){
 for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
  ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y))
  && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)
  && (c = !c);
 return c;
}

(如果我可以让他们转换,任何一个都会工作)

所以,试试这个...我把.h文件和.c文件放到我的iPhone项目的xcode中。 现在唯一的问题是如何从Objective-C调用它并获得结果.. :)

顺便说一句:昨晚我搜索了大神Google以获得答案,但只是尝试搜索“在Objective-C iPhone应用程序中包含C”等等。你得到了这么多条目而且没有任何关系! :)只是让你知道我在发布之前试过谷歌。

好的,我的问题:

  1. 如何从Objective-C调用pnpoly?
  2. 我称之为什么类型? (int很好,但float * vertx显然是一个浮点数组...... NSArray没有 - 我能找到)

(编辑:这里是更多的信息。我要求帮助解决那些将被传递的阵列)

这个问题没有得到充分的质疑。

例程(在objective-c中)将是这样的:(假设这是正确的编码)

NSMutableArray *latitudeArray = [[NSMutableArray alloc] init];
NSMutableArray *longitudeArray = [[NSMutableArray alloc] init];

// coordinates surrounding 1 inifite loop.

[latitudeArray addObject:@"37.32812557141369"];
[longitudeArray addObject:@"-122.0320253896318"];
[latitudeArray addObject:@"37.32821852349916"];
[longitudeArray addObject:@"-122.0289014325174"];
[latitudeArray addObject:@"37.33021046381746"];
[longitudeArray addObject:@"-122.0289300638158"];
[latitudeArray addObject:@"37.33042111092124"];
[longitudeArray addObject:@"-122.0279574092159"];
[latitudeArray addObject:@"37.33395972491337"];
[longitudeArray addObject:@"-122.0279263955651"];
[latitudeArray addObject:@"37.33363270879559"];
[longitudeArray addObject:@"-122.0320527775551"];
[latitudeArray addObject:@"37.32812557141369"];
[longitudeArray addObject:@"-122.0320253896318"];


int nvert = [[latitudeArray count] intvalue];

// 37.33189399206268 x -122.0296274412866 should return true

float testx =37.33189399206268;
float testy =-122.0296274412866;

int y_or_n = pnpoly(int nvert, float *vertx, float *verty, float testx, float testy);

我应该明确表示我正在学习Objective-c但是找到了C例程 - 所以不知道如何构造C变量来调用它或者用例程来调用它。

我知道这是在问很多......但这对我来说真是令人费解。 谁能帮我? 非常感谢。

Jann

你可以打电话给它。 Objective-C只是C API的前端和一种将方法重写为函数的方法(无论如何......),因此您可以像在C代码中一样调用C函数。

- (int)doWhatever {
  // ...
  int hitTest = pnPoly(/*blah*/);
  return hitTest;
}

您可以在Objective-C中使用C基本类型(如int和float)而不会出现问题。 所以用浮点数调用函数:)。 如果需要在NSArray等Foundation集合类中存储这些值,则可以将它们包装在名为NSNumber的类中。

NSNumber *someFloat = [NSNumber numberWithFloat: f];
float usefulValue = [someFloat floatValue];

以下是如何使用它的示例:

int nCoords = 4;
float vertexXCoords[n] = {0.0, 0.0, 20.0, 20.0};
float vertexYCoords[n] = {0.0, 20.0, 20.0, 0.0};
NSPoint testPoint = NSMakePoint(5, 10);

BOOL testPointIsInPoly = pnpoly(nCoords, xCoords, yCoords, testPoint.x, testPoint.y);

请注意,这里没有特定于Objective-C的内容。 这是C代码(尽管它确实使用了Cocoa BOOL和NSPoint C类型)。 由于Objective-C是C的严格超集,因此任何有效的C代码也是有效的Objective-C。 这也是Objective-C的独特功能不会特别有用的情况。 (一般来说,数值计算在简单的C中不那么复杂和可读性。)

objective C是C的超集,所以你可以调用C例程。 如果您经常调用该例程,则将其内联或使其成为宏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM