Как определить массив CGPoints в определении структуры?

Я хочу сделать это:

typedef struct
{
    CGPoint vertices[];
    NSUInteger vertexCount;
} Polygon;

Но там написано Field has incomplete type CGPoint [].


person Geri Borbás    schedule 29.10.2013    source источник
comment
Что ты пытаешься сделать? Обычно вы не можете иметь элементы переменного размера в середине структуры.   -  person Jesse Rusak    schedule 29.10.2013


Ответы (3)


Вам нужно сделать одну из двух вещей:

  1. Объявите массив фиксированного размера (вероятно, не то, что вы хотите)
  2. Сделайте его указателем. Но тогда вам нужно правильно malloc и free массив по мере необходимости.

Лучше не использовать struct, а вместо этого создать полный класс. Затем вы можете добавить методы и свойства, а также значительно упростить управление памятью. Вы работаете в Objective-C. Воспользуйтесь преимуществами объектно-ориентированных аспектов языка. Добавьте метод для вычисления окружности, площади и т. д. Поместите логику туда, где она должна быть.

person rmaddy    schedule 29.10.2013
comment
Существует также третий вариант. - person Jesse Rusak; 29.10.2013
comment
@JesseRusak Вы имеете в виду использование С++? Мои варианты были в Objective-C. - person rmaddy; 29.10.2013
comment
Нет, я хотел переместить элемент массива в конец структуры и присвоить ему длину 0, а затем просто выделить больше места, чем необходимо для структуры. В этом случае это не указатель и не фиксированный размер. - person Jesse Rusak; 29.10.2013
comment
В любом случае спасибо, но создание объектов для этого недостаточно легковесно. :D Просто систематизировал какой-то код из прошлого, и очень не хотелось вводить что-то новое, тем более вместо этого урезанное. - person Geri Borbás; 29.10.2013
comment
@Geri Создание класса на самом деле не делает его тяжелее. Объем памяти класса будет всего на несколько байтов больше, чем struct. - person rmaddy; 29.10.2013
comment
Использование класса придаст большой вес семантике, а не производительности или чему-то подобному. Просто хотел быть как можно менее конкретным. - person Geri Borbás; 29.10.2013
comment
@Geri Все зависит от того, что вы планируете делать с struct. Если вы пишете какую-либо функцию или метод в своем struct, то это может быть и в классе Polygon. Вы должны иметь некоторую логику, используя struct. Поместите логику туда, где она принадлежит - в классе. В любом случае, наслаждайтесь. - person rmaddy; 29.10.2013

Установить размер массива CGPoint vertices[count];

person Nekak Kinich    schedule 29.10.2013

Разве вам не нужно уникальное имя для каждого элемента вашей структуры? Если вам просто нужна группа CGPoint в числовом порядке, с возможностью подсчета их количества, вам будет гораздо лучше, если вы поместите их в NSArray или NSMutableArray (хранится как NSValue, конечно)

Весь смысл структуры в том, чтобы иметь легкий доступ к значениям с помощью описательного имени, т.е.:

typedef struct {
    CGPoint helpfulAndDescriptiveNameOne;
    CGPoint helpfulAndDescriptiveNameTwoWhichIsDifferentThanTheOtherName;
    etc...
    NSUInteger vertexCount;
}

Например, CGRect — это просто структура, состоящая из четырех разных CGFloat, каждый из которых имеет описательное и полезное имя:

typedef {
    CGFloat x;
    CGFloat y;
    CGFloat width;
    CGFloat height;
} CGRect;
person ryan cumley    schedule 29.10.2013