2011-06-21 22 views
7

dla mojej gry projekt iOS Potrzebuję bufora pierścienia. Powinien działać podobnie do kolejki, w której elementy wychodzą i wchodzą, ale całkowita ilość elementów w buforze powinna pozostać taka sama.Jak zaimplementować program CHCircularBuffer w projekcie iOS?

Zaimplementowałem bufor pierścieniowy z powodzeniem za pomocą java, ale nie jestem tak dobrze faworytem z celem-c. Znalazłem implementację bufora pierścieniowego w sieci o nazwie CHCircularBuffer: https://bitbucket.org/devartum/chdatastructures/src/4d6d7194ee94/source/CHCircularBuffer.m Jednak nie udało się go poprawnie wdrożyć.

Okrągły bufor jest własnością klasy o nazwie TerrainManager, która wykonuje wszystkie matematyczne generowanie terenu.

@interface TerrainManager : NSObject{ 

    int terrainParts; 

    CHCircularBuffer* circularTerrainBuffer; 
} 

@property(nonatomic, retain) CHCircularBuffer *circularTerrainBuffer; 
@end 

to jak bufor pierścieniowy jest inicjowany w realizacji TerrainManager

circularTerrainBuffer = [[CHCircularBuffer alloc] initWithCapacity:parts]; 

Powoduje to wystąpienie buforze i ustawia właściwość rozmiarze do elementów. Teraz dodam obiekty do bufora za pomocą metody addObject:

[circularTerrainBuffer addObject:[NSNumber numberWithDouble:0.2]]; 

Czasami ten wiersz otrzymuje błąd "exec_bad_access". Na przykład. kiedy uruchamiam bufor o pojemności 15, wszystko jest w porządku, a 20 otrzymuję błąd.

Próbuję teraz uzyskać dostęp do bufora z klasy terenu, w którym odbywa się losowanie. Ale za każdym razem, gdy próbuję uzyskać dostęp do obiektów, pojawia się błąd "bad_access".

NSArray *arr = [terrainManager.circularTerrainBuffer allObjects]; 

Np. ta linia spowodowałaby błąd.

Coś jest nie tak z moim kodem. Być może nie rozumiem bufora i dodawania obiektów w niewłaściwy sposób. Nie wiem. Wszelkie pomysły i sugestie?

+3

FYI, CHDataStructures.framework jest oryginalnie z: http://cocoaheads.byu.edu/code/CHDataStructures –

Odpowiedz

3

Fragmenty kodu, które wyświetlasz, są poprawne. Zaimplementowałem mały projekt, aby przetestować CHCircularBuffer w sposób określony i działa poprawnie. Tak więc problem musi być gdzie indziej.

Jedynym sposobem obejścia tego jest, IMHO, postawienie punktu przerwania na linii, która uległa awarii i przejście do funkcji addObject, aby zobaczyć, gdzie dokładnie się nie udaje. Tablica może być tam ponownie przydzielona, ​​więc może to oznaczać awarię i zły dostęp. To samo dla allObjects.

W każdym razie, muszę powiedzieć, że mogę wykonać test bez żadnego problemu, dodając obiekty, usuwając je z głowy i ogona i otrzymując tablicę wszystkich obiektów bez problemów.

Jeśli napiszesz więcej kodu, możemy Ci pomóc.

+0

można zip to dla mnie i przesłać? –

+0

np. megaupload.com –

+0

, patrz http://dl.dropbox.com/u/29366847/provaUtility.zip, sprawdź 'MainViewController'. 'showInfo' (kliknij na przycisk info) dodaje do pierścienia,' flipsideViewControllerDidFinish' (kliknij na gotowy przycisk) logi 'allObjects count'. Jeśli masz więcej pytań, nie krępuj się ... – sergio