2016-08-04 16 views
0

Ich möchte 11 Textebenen für ein Pebble-Zifferblatt erstellen. Ohne eine Schleife würde der Code ungefähr so ​​aussehen.C: Wie man eine feste Anzahl von Objekten mit einem Array von Zeigern erzeugt

static TextLayer *time_layer_a; 
static TextLayer *time_layer_b; 

... und so weiter.

Wie kann ich dies mit einer Schleife tun und die Zeiger auf die Objekte in einer Liste like Struktur setzen?

Liste: In diesem Fall wäre Array oder Kette ein besseres Wort, da die Sammlung von Zeigern für eine Anzeige mit einer festen Anzahl von Textebenen ist. Und die Anzahl der Ebenen wird während der Dauer des Programms nicht geändert. In C ist eine Liste eine Struktur, die dynamisch in der Größe geändert werden kann. Die Verwendung von "list like" könnte hilfreiche Leute zu der Annahme verleiten, dass die gesuchte Verkettungsmethode dynamisch sein soll. Das ist nicht richtig. Eine Struktur, die eine feste Zuordnung von Speicher verwendet, wird bevorzugt.

Edit: ein Array wie von John3136 vorgeschlagen funktionierte perfekt. Das Array hat den zusätzlichen Vorteil, die Objektzeiger mit seiner Verzögerung zu erzeugen. Und es ist ein Plus, dass John3136 eine Möglichkeit gab, den Code automatisch an die Größe des Arrays anzupassen. Dies ist ein nützliches Werkzeug zu haben.

Hier ist der Code, wie angewendet, um Textebenen für mein Zifferblatt zu erstellen.

Erklärungen:

int i; 
static TextLayer* layers[11]; 

Lademethode:

// 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)))); 
} 

Entladens:

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

Es ist nicht klar, was Sie erreichen wollen. Anscheinend haben Sie bereits einen Code, also stellen Sie einen [mcve] zur Verfügung. Erfahren Sie auch [fragen] und stellen Sie die notwendigen Informationen zur Verfügung. – Olaf

+0

Wenn Sie diese Frage zu einem vollständigen und zusammenstellbaren Beispiel erweitern, wird unnötiges Durcheinander hinzugefügt. Ich denke, dass diese Frage genauso gut ist wie sie ist. – hugomg

+0

@Olaf, ich schreibe mein erstes Programm in C. Ich kenne noch nicht alle Strukturen in C oder wofür sie am besten geeignet sind. Ich wusste, dass ich nach etwas suchte, das "listenartig" war. Zu der Zeit war das das Beste, was ich tun konnte. Ich hätte nach einem Array gefragt, wenn ich gewusst hätte, dass ein Array gut funktionieren würde. – kjl

Antwort

3

Der einfachste Weg, die Ihren Anforderungen entspricht, wie wir sie kennen: Ein Array von 11 Zeigern auf TextLayers.

static TextLayer* layers[11]; 

Anschließend können Sie füllen mit:

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

Das ist keine Liste, nicht wie eine Liste. Es ist nicht klar, was OP wirklich will. MCVE fehlt. – Olaf

+1

@Olaf Ich stimme deinem Punkt zu, dass wir nicht wirklich wissen, was OP will (daher mein erster Satz). Nachdem das gesagt wurde: Wie ist eine Abfolge von Items nicht listenartig? Ich denke, es ist eine vernünftige Chance, dass ein Array eine geeignete Lösung ist, weshalb ich als Antwort anstatt als Kommentar gepostet habe. – John3136

+0

Es gibt genug Material zu finden, was eine Liste ausmacht (obwohl es Variationen gibt, haben sie eine Art von Verknüpfung gemeinsam). Es kann einen bestimmten Grund geben, warum OP nach einer Liste fragt. Möglicherweise, weil er es dynamisch ändern möchte.Obwohl ich vermute, dass er nicht wirklich weiß, was er braucht. Ohne weitere Informationen müssen wir mit dem arbeiten, was wir bekommen haben. Wenn das nicht genug ist, ist jede Antwort Spekulation und nicht wirklich hilfreich für OP und möglicherweise für künftige Leser missverständlich. Es gibt einen Grund für die "unklare" Abstimmung. – Olaf