0

我想创建 2 个可以在程序运行期间更新的全局数组。在每次更新中,我将一个元素添加到第零位并删除了我创建数组的最后一个数字......在 .h 文件中...... ....... //////////////

@interface Shared : NSObject{
NSMutableArray *x;
NSMutableArray *y;
}

@property (nonatomic,retain) NSMutableArray *x;
@property (nonatomic,retain) NSMutableArray *y;
+(Shared*)sharedInstance;

@end

在 .m 文件中

staticShared* sharedInstance;
@implementation Shared
@synthesize  x; 
@synthesize  y;

+(Shared*)sharedInstance
{
if (!sharedInstance) {
sharedInstance=[[Sharedalloc]init];
    }
returnsharedInstance;
}

-(Shared*)init
{
self = [superinit];
if(self)
    {
x=[[NSMutableArrayalloc] init];
x=[NSMutableArrayarrayWithObjects:@"0",@"0",@"0",@"0",@"0",@"0",@"0",nil];
y=[[NSMutableArrayalloc] init];
y=[NSMutableArrayarrayWithObjects:@"0",@"0",@"0",@"0",@"0",@"0",nil];
    }
returnself;
}
@end

然后我用下面的代码调用它们并重新添加元素....

[[shared sharedInstance].y removeLastObject];
[[shared sharedInstance].y insertObject:new_element atIndex:0];

[[shared sharedInstance].x removeLastObject];
[[shared sharedInstance].x insertObject:new_element atIndex:0];

同时,我调用这些值并使用表达式计算算术值。

这似乎运作良好。但这似乎是一种处理我存储在其中的浮点数的低效方法。由于这些数组创建对象。有没有什么简单的方法可以创建一个包含指定数量的浮点数的全局数组,并在程序运行期间通过删除最后一个对象来更新它(数组大小是固定的),然后再调用它们进行计算?

请帮我!

编辑 1 致 deanWombourne 先生 .................... 我按照您的指示执行!你能不能帮我纠正我得到的 2 个错误。

在 .h 文件中

@interface Shared : NSObject{
@private
float input[7];
float output[6];

}
+(Shared*)sharedInstance;

-(void)addNewInput:(float)input1;
-(float *)input;
-(void)addNewOutput:(float)output1;
-(float *)output;

@end

在.m 文件中............

@implementation Shared

-(id)init{
if((self =[superinit])){

for(int n=0; n<7 ;++n)
input[n]=0.00f;

for(int n=0; n<6 ;++n)
output[n]=0.00f;
    }
returnself;
}

-(void)addNewInput:(float)input1{
input[0]=input[1];
input[1]=input[2];
input[2]=input[3];
input[3]=input[4];
input[4]=input[5];
input[5]=input[6];
input[6]=input1;
}

-(float *)input {
returninput;
}


-(void)addNewOutput:(float)output1{
output[0]=output[1];
output[1]=output[2];
output[2]=output[3];
output[3]=output[4];
output[4]=output[5];
input[5]=output1;
}

-(float *)output {
returnoutput;
}
@end

调用时

float reading=  (accel_reading)/(1.165969038*1e5f);
[[SharedsharedInstance] addNewInput:reading];

我遇到的问题 1. 在实现中,它说不完整的实现(这是警告而不是错误) 2. 我如何使用 for 循环来填充数组值或者这种方式可以吗?

我得到的主要问题,当我如上所示调用它时,由于未捕获的异常'NSInvalidArgumentException',程序停止运行并告诉终止应用程序,原因'+ [SharedsharedInstance]:无法识别的选择器发送到类0x5780'

请帮助我完成这个......

4

4 回答 4

2

你的代码有味道(我的意思是最好的方式!)

使用两个并行数组并保持同步是一种糟糕的设计模式(并且在很多方面都会影响性能!)。特别是因为已经有一个结构可以同时处理x和存储y- CGPoint)。

您正在通过转换您的NSString 对象来解决“只有对象进入数组float' primitives to”的问题,这是非常低效的 - 看看NSValue类,它旨在将本机 C 原语放入对象中,而无需昂贵的解析操作:)

您可能还想研究mallocfree等等)并在 C 级别处理整个问题 - 这将意味着根本没有对象并且会非常快(以更复杂的代码为代价)。

希望这会有所帮助,如果您有任何问题,请在此答案中添加评论:)


编辑

如果您只想存储 4 个 x 和 y 值,那么这可能是最简单的方法:

@interface Shared : NSObject {
@private
    CGPoint points[4];
}

+(Shared *)sharedInstance;

- (void)addNewPoint:(CGPoint)point;
- (CGPoint *)points;

@end

@implementation

- (id)init {
    if ((self = [super init])) {
        // Start with 0,0 for all your points
        for (int n = 0; n < 4; ++n)
            points[n] = CGPointZero;
    }
    return self;
}

- (void)addNewPoint:(CGPoint)point {
    // Just move all the points along one and add the new one to the end
    // (yes, this could be done in a loop but there's not that much point for 4 points!)
    points[0] = points[1];
    points[1] = points[2];
    points[2] = points[3];
    points[3] = point;
}

- (CGPoint *)points {
    return points;
}

@end

这为您提供了一种addNewPoint删除第一个点并将新点添加到数组末尾的方法。

您还将获得points返回 4 个点的方法。像这样使用它:

// To add a point
CGPoint newPoint = CGPointMake(100, 100);
[[Shared sharedInstance] addNewPoint:newPoint];

// To do something with the points (in this case, NSLog them)
CGPoint *points = [[Shared sharedInstance] points];
for (int n = 0; n < 4; ++n)
    NSLog(@" Point %i : %@", n, NSStringFromCGPoint(points[n]));

编辑#2

根据您的评论,您需要两个数组,一个带有输入数据,一个带有输出数据。尝试这样的事情:

@interface Shared : NSObject {
    float inputs[4];
    float outputs[5];
}
...

这将为您提供两个要读取/写入的数组 - 一个称为输入,另一个称为输出。访问它们的方式与我第一次编辑中的访问方式几乎相同:

float *inputs = [[Shared sharedInstance] inputs];
for (int n = 0; n < 4; ++n)
    NSLog(@" Input %i : %f", n, inputs[n]);

float *outputs = [[Shared sharedInstance] outputs];
for (int n = 0; n < 5; ++n)
    NSLog(@" Output %i : %f", n, output[n]);
于 2012-05-31T10:23:22.800 回答
0

如果你想要一个包含特定数量对象的数组,你可以使用 NSArray,它是静态的,与 NSMutableArray 相对。

至于数组是全局的,只需实现一个包含 2 个数组并提供相关方法的单例类。

在 Globals.h 中:

@interface Globals : NSObject

+ (Globals *) sharedGlobals;

@end

在 Globals.m 中:

@implementation Globals

static Globals *sharedGlobals = nil;

+ (Globals *) sharedGlobals{
    @synchronized(self){
        if (sharedGlobals == nil){
            sharedGlobals = [[self alloc] init];
        }
    }
    return sharedGlobals;
}

然后,您可以使用以下行访问数组(在实现它们之后):

[[Globals sharedGlobals] getArrayX];
于 2012-05-31T10:20:46.890 回答
0

对于您要实现的目标,链接列表是否会过大?它不像静态浮点数数组那么简单,但使最后一个对象的删除和第零个对象的插入相当简单和快速。

于 2012-05-31T10:18:31.707 回答
0

这是一个草图,可以让你继续前进。

您的数组大小是固定的,仅包含浮点数,从 C 数组开始:

double x[] = {0, 0, 0, 0, 0, 0, 0};
double y[] = {0, 0, 0, 0, 0, 0};

这些数组中的元素数量可以计算而不是硬编码:

int xCount = sizeof(x)/sizeof(double);
int yCount = sizeof(y)/sizeof(double);

现在将这些数组用作循环缓冲区,声明一个游标并初始化:

int xCursor = 0;

队列前面的项目在光标处:

valueAtFrontOfQueue = x[xCursor];      // get the current front item

要删除前面的值并在后面添加一个新值,请将光标处的值替换为新值并增加光标:

x[xCursor] = newValueForBackOfQueue;   // replace it with new item for back of queue
xCursor = (xCursor + 1) % xCount;      // and advance cursor using mod arithmetic to it cycles around

没有包装双重作为对象,根本没有动态分配。

将以上内容按照您认为合适的方式进行总结,也许作为一个班级,您就完成了。

于 2012-05-31T10:22:55.057 回答