0

プログラムの実行中に更新できる2つのグローバル配列を作成したかったのです。更新のたびに、1つの要素をゼロの位置に追加し、配列を作成した最後の番号を削除しました。 ....... //////////////

@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];

その間に、私はこれらの値を呼び出し、式を使用して算術値を計算します。

これはうまくいくようです。しかし、私が格納している浮動小数点数を処理するのは非効率的な方法のようです。これらの配列はオブジェクトを作成します。指定された量の浮動小数点数を含むグローバル配列を作成し、programm(配列サイズは固定)の実行中に最後のオブジェクトを削除して更新し、それらを呼び出して計算を行う簡単な方法はありますか?

私を助けてください!

編集1deanWombourne卿へ.................................あなたの指示通りに実装します!これを確認して、発生した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

あなたのコードは臭いです(そして私はそれを可能な限り素晴らしい方法で意味します!)

2つの並列アレイを使用して同期を維持することは、悪いデザインパターンです(そして、かなりの数の点でパフォーマンスが低下します!)。特に、同時に格納xを処理する構造体がすでに存在するため、 CGPoint)。y

NSString`オブジェクトを変換することで、「オブジェクトのみが配列に入る」問題を解決しています。これは、ひどく非効率的です。代わりに、 NSValueクラスを見てください。これは、コストのかかる解析操作なしでネイティブCプリミティブをオブジェクトに配置するように設計されています:)float' primitives to

また、 malloc(など)を調べてfree、問題全体を経営幹部レベルで処理することもできます。これは、オブジェクトがまったくないことを意味し、(より複雑なコードを犠牲にして)目がくらむほど高速になります。

これがお役に立てば幸いです。質問がある場合は、この回答にコメントを追加してください:)


編集

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

コメントから、2つの配列が必要です。1つは入力データを含み、もう1つは出力データを含みます。このようなものを試してください:

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

これにより、読み取り/書き込み用の2つの配列が提供されます。1つは入力と呼ばれ、もう1つは出力と呼ばれます。私の最初の編集で行ったのとほぼ同じ方法でそれらにアクセスします。

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

リンクリストは、あなたが達成しようとしていることに対してやり過ぎでしょうか?これは、floatの静的配列ほど単純ではありませんが、最後のオブジェクトの削除と0番目のオブジェクトの挿入をかなり単純かつ高速にします。

于 2012-05-31T10:18:31.707 に答える
0

特定の数のオブジェクトを含む配列が必要な場合は、NSMutableArrayではなく静的なNSArrayを使用できます。

Globalである配列については、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

これがあなたを動かすためのスケッチです。

配列サイズは固定されており、浮動小数点数のみが含まれています。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 に答える