2016-08-04 4 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

당신이 무엇을 달성하고자하는 분명하지 않다 :

static TextLayer* layers[11]; 

그런 다음에 채울 수 있습니다. 이미 일부 코드가 있으므로 분명히 [mcve]를 입력하십시오. 또한 [ask]를 배우고 필요한 정보를 제공하십시오. – Olaf

+0

이 질문을 포괄적이고 포괄적 인 예제로 확장하면 불필요한 혼란이 생길 ​​수 있습니다. 나는이 질문이 그렇듯이 괜찮다고 생각한다. – hugomg

+0

@Olaf, C에서 첫 번째 프로그램을 작성 중입니다. C의 모든 구조 또는 가장 적합한 구조를 아직 모릅니다. 나는 내가 "목록처럼"있는 것을 찾고 있다는 것을 알았다. 그 당시 내가 할 수있는 최선이었습니다. 배열이 잘 작동한다는 것을 알았다면 배열을 요청했을 것입니다. – kjl

답변

3

가장 쉬운 방법 : 11 포인터의 배열에 TextLayers.

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

그건 목록이 아니고 목록과 같은 것이 아닙니다. OP가 정말로 원하는 것이 명확하지 않습니다. MCVE가 누락되었습니다. – Olaf

+1

@Olaf 나는 OP가 무엇을 원하는지 알지 못한다는 귀하의 의견에 동의합니다 (따라서 첫 번째 문장). 그런 말로 표현하자면 : 어떤 방식으로 목록의 목록이 아닌 일련의 항목입니까? 필자는 배열이 적합한 솔루션이라는 합리적인 기회라고 생각합니다. 이는 내가 코멘트가 아닌 답변으로 게시 한 이유입니다. – John3136

+0

목록을 구성하는 자료가 충분합니다 (유사 함에도 불구하고 일종의 링크가 있음). OP가 목록에 대해 묻는 특별한 이유가있을 수 있습니다. 아마도 그는 그것을 동적으로 바꾸기를 원하기 때문일 것입니다.나는 그가 그가 필요한 것을 정말로 모른다 고 생각한다. 더 많은 정보가 없으면 우리가 가진 것을 가지고 일해야합니다. 그것이 충분하지 않다면, 어떤 대답도 추측이며 OP에 도움이되지 않으며 향후 독자들에게 미혹 될 수 있습니다. "불투명 한"가까운 투표의 이유가 있습니다. – Olaf