Цель C выделить переменную экземпляра массива примитива c при инициализации класса - PullRequest
2 голосов
/ 28 марта 2012

Я пытаюсь написать класс Objective C, который рисует многоугольник OpenGL.Мне удалось сделать это с помощью NSMutableArray для хранения моих координат вершин.Однако это кажется немного неэффективным, потому что каждый раз, когда объект рисуется, необходимо циклически перебирать массив, чтобы преобразовать NSMutableArray в массив ccVertex2F [].

То, что я хочу сделать, это иметь массив ccVertex2F в качестве переменной экземпляра.Затем при инициализации установите размер равным количеству точек.Это, однако, выдает ошибку, потому что размер моего массива всегда равен нулю.

У меня есть опыт программирования на Java, но я совершенно новичок в C и управлении памятью.Пока это то, что у меня есть:

@interface PolygonNode : CCNode {
    ccVertex2F *  _glPoints ;
}

@property (nonatomic, readwrite) ccVertex2F * glPoints ;
@end

Насколько я понимаю, я создаю переменную экземпляра, которая является указателем на ccVertex2F.

В моем методе init у меня естьследующее:

    ccVertex2F sizedGlPoints [numberOfPoints * sizeof(ccVertex2F)];
    _glPoints = &sizedGlPoints;

Цель этого состояла в том, чтобы заставить переменную экземпляра указывать на мой новый массив правильного размера.Однако, когда я печатаю размеры после этого кода, размер _glPoints не меняется.

Суть того, что я хочу сделать, - это иметь возможность выбирать размер моего массива при инициализации класса, чтобы я могЯ не трачу память.

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Вы можете использовать malloc для выделения памяти для массива:

ccVertext2F *newMemory = malloc(numberOfPoints * sizeof(ccVertex2F));
if (newMemory == NULL) {
    // Handle error
}
_glPoints = newMemory;

Просто не забудьте освободить его, когда закончите (в -dealloc или перед повторным назначением):

free(_glPoints);
0 голосов
/ 28 марта 2012

Если вы пытаетесь выделить с помощью чистого C, вы используете malloc или calloc для выделения и можете свободно освобождать.

Так что

ccVertex2F sizedGlPoints [numberOfPoints * sizeof(ccVertex2F)];   
_glPoints = &sizedGlPoints;

станет

_glPoints = (ccVertex2F *) calloc( numberOfPoints, sizeof( ccVertex2F );

Если бы ccVertex2F был классом ObjectiveC, вы бы использовали

[ ccVertex2F alloc ] 

для выделения.

...