2016-08-04 7 views
0

Я хотел бы создать 11 текстовых слоев для гальки. Без цикла код будет выглядеть примерно так.C: Как сгенерировать фиксированное число объектов с массивом указателей

static TextLayer *time_layer_a; 
static TextLayer *time_layer_b; 

... и так далее.

Как это сделать с помощью цикла и поместить указатели на объекты в список как структура?

: в этом случае массив или цепочка будут лучше, потому что коллекция указателей предназначена для отображения с фиксированным количеством текстовых слоев. И количество слоев не будет изменено в течение продолжительности программы. В C список представляет собой структуру, которая может быть динамически изменена. Использование «list like» может ввести в заблуждение полезных людей к предположению, что искомый метод цепочки будет динамичным. Это неверно. Предпочтительной является структура, которая использует фиксированное распределение памяти.

Редактировать: массив, предложенный John3136, отлично работал. Массив обладает дополнительным преимуществом создания указателей объектов с его замедлением. И это плюс, что John3136 дал возможность автоматически настроить код на размер массива. Это полезный инструмент.

Вот код применительно к созданию текстовых слоев для моего лица.

декларации: метод

int i; 
static TextLayer* layers[11]; 

загрузки: метод

// by John3136 
// Note the sizeof() stuff means this works unchanged even if you change 
// the number of layers. 
for(i = 0; i < (short)(sizeof(layers)/sizeof(layers[0])); i++) // (short) converts unsigned interger to +- int 
{ 
    layers[i] = text_layer_create(GRect((bounds.size.w/4)*((i + 1)%4), 
             (bounds.size.h/PBL_IF_ROUND_ELSE(5,4))*((i > 2) 
                       ? ((i > 6) 
                       ? 3 
                       : 2) 
                       : 1), 
             (bounds.size.w/4) ,(bounds.size.h/PBL_IF_ROUND_ELSE(5,4)))); 
} 

разгрузки:

for(i = 0; i < (short)(sizeof(layers)/sizeof(layers[0])); i++) 
{ 
    text_layer_destroy(layers[i]); 
} 
+0

Не ясно, что вы хотите достичь. Видимо, у вас уже есть код, поэтому предоставите [mcve]. Также узнайте [ask] и предоставьте необходимую информацию. – Olaf

+0

Расширение этого вопроса, чтобы быть полным и скомпилированным примером, просто добавило бы лишний беспорядок. Я думаю, что этот вопрос в порядке. – hugomg

+0

@ Олаф, я пишу свою первую программу на C. Я еще не знаю всех структур на С или для чего они лучше всего подходят. Я знал, что искал что-то вроде «списка». В то время это было лучшее, что я мог сделать. Я бы попросил массив, если бы знал, что массив будет работать хорошо. – kjl

ответ

3

Самый простой способ, который отвечает вашим требованиям, как мы их знаем: массив из 11 указателей на TextLayers.

static TextLayer* layers[11]; 

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

int i; 
// Note the sizeof() stuff means this works unchanged even if you change 
// the number of layers. 
for(i = 0; i < sizeof(layers)/sizeof(layers[0]); i++) 
{ 
    layers[i] = some_func_that_creates_a_layer(); 
} 
+0

Это не список, а не обычный список. Непонятно, что действительно хочет ОП. MCVE отсутствует. – Olaf

+1

@ Олаф Я согласен с вашей точкой в ​​том, что мы действительно не знаем, чего хочет OP (отсюда и мое первое предложение). Сказав это: каким образом последовательность элементов не является списком? Я думаю, что это разумный шанс, что массив является подходящим решением, поэтому я написал как ответ, а не комментарий. – John3136

+0

Существует достаточно материала, чтобы найти то, что составляет список (хотя есть вариации, у них есть общая привязка). Может возникнуть особая причина, по которой ОП запрашивает список. Возможно потому, что он хочет изменить его динамически.Хотя я подозреваю, что он действительно не знает, что ему нужно. Без дополнительной информации мы должны работать с тем, что получили. Если этого недостаточно, любой ответ - это спекуляция и не очень полезная для ОП и, возможно, промахивание для будущих читателей. Существует причина для «неясного» голосования. – Olaf