[英]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”等等。你得到了这么多条目而且没有任何关系! :)只是让你知道我在发布之前试过谷歌。
好的,我的问题:
(编辑:这里是更多的信息。我要求帮助解决那些将被传递的阵列)
这个问题没有得到充分的质疑。
例程(在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.