我想得到这个结构
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),
};
Run Code Online (Sandbox Code Playgroud)
为了进行一些计算和绘制数据.
我有 CGPoint *lines = appDelegate.averageResponseTimePoints;
如何使阵列addLines[]
从*lines
?
Tib*_*abo 51
对于iOS:
创建数组:
NSArray *myCGPointArray = @[[NSValue valueWithCGPoint:CGPointMake(30.0, 150.0)],[NSValue valueWithCGPoint:CGPointMake(41.67, 145.19)]];
Run Code Online (Sandbox Code Playgroud)
获取第一个CGPoint对象:
CGPoint myPoint = [myCGPointArray[0] CGPointValue];
Run Code Online (Sandbox Code Playgroud)
Wil*_*ris 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;
}
Run Code Online (Sandbox Code Playgroud)
这会在我的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
s 的大小,但是一旦发送到pass_back
函数,它只是一个指针的大小,因为它就是它.当指针返回(并命名returned
)时,它仍然可以像数组一样使用.
注意4
循环中的幻数.指针不知道它指向的数组的长度.
无法与=
运算符重新分配数组.如果你真的必须填充addLines
点lines
,你可以使用以下内容:
memcpy(addLines, lines, sizeof(CGPoint) * numberOfPoints);
Run Code Online (Sandbox Code Playgroud)
你必须numberOfPoints
从某个地方获得,并且addLines
必须足够大才能处理这些点.如果点的数量是常数,那也没关系,但如果点的数量在运行时可能会有所不同,那将会很糟糕,特别是如果这些点来自外部世界(想想任意代码执行).
我会averageResponseTimePoints
改为返回NSArray而不是C风格的数组.您需要将CGPoint
s 封装在对象中 - 您自己的对象或NSValue
s.
以下是您可以编写的示例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;
}
Run Code Online (Sandbox Code Playgroud)
如果您的代码使用CocoaTouch运行,则可以使用它来创建点值:
NSValue* point = [NSValue valueWithCGPoint:points[i]];
Run Code Online (Sandbox Code Playgroud)
要从CGPoint
数组中获取s,您可以编写如下内容:
for (NSValue* value in result) {
NSPoint pt;
[value getValue:&pt];
NSLog(@"%f %f", pt.x, pt.y);
}
Run Code Online (Sandbox Code Playgroud)
或者使用CocoaTouch:
CGPoint pt = [value CGPointValue];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
59908 次 |
最近记录: |