2015-07-08 3 views
-1

Я переписываю библиотеку фильтров частиц iOS в Swift из Objective C, которая доступна на Bitbucket, и у меня есть вопрос относительно синтаксиса Objective C, который я не могу понять.Синтаксис и использование Objective C "*"

Код выглядит следующим образом:

- (void)setRssi:(NSInteger)rssi { 
_rssi = rssi; 

// Ignore zeros in average, StdDev -- we clear the value before setting it to 
// prevent old values from hanging around if there's no reading 
if (rssi == 0) { 
    self.meters = 0; 
    return; 
}  
self.meters = [self metersFromRssi:rssi]; 

NSInteger* pidx = self.rssiBuffer; 
*(pidx+self.bufferIndex++) = rssi; 

if (self.bufferIndex >= RSSIBUFFERSIZE) { 
    self.bufferIndex %= RSSIBUFFERSIZE; 
    self.bufferFull = YES; 
}  
if (self.bufferFull) { 

    // Only calculate trailing mean and Std Dev when we have enough data 
    double accumulator = 0; 
    for (NSInteger i = 0; i < RSSIBUFFERSIZE; i++) { 
     accumulator += *(pidx+i); 
    } 
    self.meanRssi = accumulator/RSSIBUFFERSIZE; 
    self.meanMeters = [self metersFromRssi:self.meanRssi]; 

    accumulator = 0; 
    for (NSInteger i = 0; i < RSSIBUFFERSIZE; i++) { 
     NSInteger difference = *(pidx+i) - self.meanRssi; 
     accumulator += difference*difference; 
    } 
    self.stdDeviationRssi = sqrt(accumulator/RSSIBUFFERSIZE); 
    self.meanMetersVariance = ABS(
            [self metersFromRssi:self.meanRssi] 
            - [self metersFromRssi:self.meanRssi+self.stdDeviationRssi] 
           ); 
}  
    } 

Класс продолжает с большим количеством коды и функциями, которые не являются важными и то, что я не понимаю, эти две линии

NSInteger* pidx = self.rssiBuffer; 
*(pidx+self.bufferIndex++) = rssi; 

Переменная PIDX инициализируются к размеру буфера, который был предварительно определен, а затем в следующей строке размер этого буфера и буфер плюс один равен переменной RSSI, которая передается в качестве параметра в функции.

Я предполагаю, что * имеет какое-то отношение со ссылкой, но я просто не могу понять цель этой линии. Переменная pidx используется только в этой функции для вычисления среднего среднего и стандартного отклонения.

+2

Получите ваши старые книги С и C++ из. * используется для объявления указателей, указателей разыменования и умножения. Как и в C и C++. – gnasher729

+0

Это фундаментальный материал C, и вы должны * знать основы C, прежде чем пытаться изучить Objective-C. В противном случае вы будете развивать всевозможные заблуждения. –

ответ

1

Пусть объяснить этот код:

  1. NSInteger* pidx = self.rssiBuffer; означает, что вы получаете указатель на первое значение буфера.
  2. *(pidx+self.bufferIndex++) = rssi; означает, что вы устанавливаете значение буфера по индексу 0+self.bufferIndex к rssi, а затем увеличить bufferIndex по 1. Благодаря @Jakub Vano укажите это.

В C++, это будет выглядеть, что

int self.rssiBuffer[1000]; // I assume we have buffer like that 
self.rssiBuffer[self.bufferIndex++] = rssi 
+1

В C++ он будет выглядеть абсолютно так же, как в Obj-C. Может быть, заменить «на C++» на «With синтаксис массива ...» – Sulthan

+0

Да, в C++ мы также можем иметь то же самое, что и в Obj-C, но я думаю, что способ в моем ответе легче понять. И, конечно, это пример для вопросника, потому что он не понимает, как в Objc – sahara108

+1

«.. установка значения буфера в индекс' 0 + self.bufferIndex + 1' "- это неверно, актуально index - '0 + self.bufferIndex'. 'pixd + self.bufferIndex ++' означает, что инкремент 'self.bufferIndex' происходит только после того, как указатель был увеличен. –