我想得到这个结构
CGPoint addLines1[] =
{
CGPointMake(30.0, 150.0),
CGPointMake(41.67, 145.19),
CGPointMake(53.33, 103.25),
CGPointMake(65.0, 131.67),
CGPointMake(76.67, 106.11),
CGPointMake(88.33, 110.20),
CGPointMake(100.0, 111.54),
CGPointMake(111.67, 112.13),
CGPointMake(123.33, 115.66),
CGPointMake(135.0, 123.7),
CGPointMake(146.67, 125.53),
CGPointMake(158.33, 115.1),
CGPointMake(170.0, 69.38),
CGPointMake(181.67, 112.47),
CGPointMake(193.33, 65.1),
CGPointMake(205.0, 103.33),
CGPointMake(216.67, 92.6),
CGPointMake(228.33, 54.76),
CGPointMake(240.0, 79.66),
CGPointMake(251.67, 53.81),
CGPointMake(263.33, 56.81),
CGPointMake(275.0, 88.19),
CGPointMake(286.67, 74.81),
CGPointMake(298.33, 28.1),
CGPointMake(310, 20.0),
};
为了进行一些计算和绘制数据。
我有CGPoint *lines = appDelegate.averageResponseTimePoints;
如何从addLines[]
制作数组*lines
?
答案 0 :(得分:51)
对于iOS:
创建数组:
NSArray *myCGPointArray = @[[NSValue valueWithCGPoint:CGPointMake(30.0, 150.0)],[NSValue valueWithCGPoint:CGPointMake(41.67, 145.19)]];
获取第一个CGPoint对象:
CGPoint myPoint = [myCGPointArray[0] CGPointValue];
答案 1 :(得分:50)
C数组在运行时并不是真正的数组,它们只是指向相同类型的连续对象块的指针。当你看到items[n]
时,这只是*(items+n)
的语法糖。
在您的示例中,addLines[1]
为*(lines+1)
,addLines[0]
为*(lines+0)
,即*lines
。因此,addLines
只是lines
而没有指针解除引用。 *lines
是数组中的第一项,lines
是整个数组。
在编译时,数组与指针有一些差异。例如,sizeof(addLines)
将为您提供整个数组的大小。
一旦将数组传递给大小可能变化的数组,Array-ness就会丢失,但您仍然可以使用下标运算符。例如:
#include <Foundation/Foundation.h>
#define showsize( expr ) ( printf(#expr " = %zd\n", ( expr ) ) )
CGPoint *
pass_back(CGPoint points[4])
{
showsize(sizeof(points));
return points;
}
int
main(void)
{
CGPoint square[] = {CGPointMake(-1.0, 1.0),
CGPointMake( 1.0, 1.0),
CGPointMake( 1.0, -1.0),
CGPointMake(-1.0, -1.0)};
CGPoint* returned;
int i;
showsize(sizeof(CGPoint));
showsize(sizeof(CGPoint*));
showsize(sizeof(square));
returned = pass_back(square);
showsize(sizeof(returned));
for (i = 0; i < 4; ++i) {
printf("returned[%d] = {%0.1f, %0.1f}\n", i, (float) returned[i].x,
(float) returned[i].y);
}
return 0;
}
这会在我的Mac上输出以下内容:
sizeof(CGPoint) = 8 sizeof(CGPoint*) = 4 sizeof(square) = 32 sizeof(points) = 4 sizeof(returned) = 4 returned[0] = {-1.0, 1.0} returned[1] = {1.0, 1.0} returned[2] = {1.0, -1.0} returned[3] = {-1.0, -1.0}
在这里,square
是四个CGPoint
的大小,但是一旦发送到pass_back
函数,它只是一个指针的大小,因为它就是它。当指针返回(并命名为returned
)时,它仍然可以像数组一样使用。
注意循环中的幻数4
。指针不知道它指向的数组的长度。
无法使用=
运算符重新分配数组。如果您真的必须使用addLines
中的点填充lines
,则可以使用以下内容填充{
}
memcpy(addLines, lines, sizeof(CGPoint) * numberOfPoints);
你必须从某个地方获得numberOfPoints
,addLines
必须足够大才能处理这些点。如果点的数量是常数,那就没关系,但如果点的数量在运行时可能会有所不同,那么它将 bad ,特别是如果这些点来自外部世界(想想任意代码执行)。
我要更改averageResponseTimePoints
以返回NSArray而不是C样式数组。您需要将CGPoint
封装在对象中 - 您自己的对象或NSValue
。
以下是您如何撰写averageResponseTimePoints
:
- (NSArray*) averageResponseTimePoints
{
NSMutableArray* result = [[[NSMutableArray alloc] init] autorelease];
for (int i = 0; i < numberOfPoints; ++i) {
NSValue* point = [NSValue value:points+i
withObjCType:@encode(CGPoint)];
[result addObject:point];
}
return result;
}
如果您的代码使用CocoaTouch运行,您可以使用它来创建点值:
NSValue* point = [NSValue valueWithCGPoint:points[i]];
要从数组中获取CGPoint
,您可以编写如下内容:
for (NSValue* value in result) {
NSPoint pt;
[value getValue:&pt];
NSLog(@"%f %f", pt.x, pt.y);
}
或者使用CocoaTouch:
CGPoint pt = [value CGPointValue];
答案 2 :(得分:4)
试试这个
CGPoint A[10];
A[0] = CGPointMake(10.0, 10.0);
A[1] = CGPointMake(10.0, 12.0);
float x = A[1].y;
NSLog(@"%.0f", x);
有效。祝你好运。
答案 3 :(得分:3)
我尝试过Tibidabo的答案,但这对我没用。它说[myCGPointArray objectAtIndex:0]的类型为id,所以我无法在其上调用CGPointValue。 HM。
然而,这有效:NSArray *points = [NSArray arrayWithObjects:
[NSValue valueWithCGPoint:CGPointMake(5.5, 6.6)],
[NSValue valueWithCGPoint:CGPointMake(7.7, 8.8)],
nil];
NSValue *val = [points objectAtIndex:0];
CGPoint point = [val CGPointValue];
float X = point.x;
NSLog(@"cgpoint value is: %f", X);
或
NSArray *points = [NSArray arrayWithObjects:
[NSValue valueWithCGPoint:CGPointMake(20, 6.6)],
[NSValue valueWithCGPoint:CGPointMake(7.7, 8.8)],
nil];
float xCoordinate = [[points objectAtIndex:0] CGPointValue].x;
我在这里找到了它:How can I add CGPoint objects to an NSArray the easy way?,由Jarret Hardie发布。
答案 4 :(得分:2)
我解决了下一个问题:
NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray addObject:[NSValue valueWithCGPoint:myPoint]];