SORU
27 Ocak 2015, Salı


C yapı miras işaretçi hizalama

Arka plan

Esas amaç öğrenme için temel bağlı liste veri yapısı oluşturduk. Listenin bir hedefi farklı veri yapılarını işleyebilir. Bu nedenle, yapısı, bileşimi "" C. Burada bağlantılı listeme temelini oluşturan yapılardır. miras simüle etmek için de elimi denedim

typedef struct Link {
    struct Link* next;
    struct Link* prev;
} Link;

typedef Link List;

Benim uygulama hem de kafa olarak hizmet veren sentinel düğüm ve liste == Listede neden olan) kuyruğu seçtim.

Bu liste aslında verileri işlemek için, bir yapı sadece ilk üyesi olarak Bağlantı yapısını içerir:

typedef struct {
    Link link;
    float data;
} Node;

Bağlantılı liste bu gibi görünüyor.

         ┌───┬───┬───┐     ┌───┬───┐     ┌───┬───┬───┐     
... <--->│ P │ N │ D │<--->│ P │ N │<--->│ P │ N │ D │<---> ... 
         └───┴───┴───┘     └───┴───┘     └───┴───┴───┘
         End Node          myList        First Node

List myList;
Node node1 = {{}, 1.024};
....
Node nodeN = {{}, 3.14};

list_init(&myList) // myList.next = &myList; myList.prev = &myList;
list_append(&myList, &node1);
....
list_append(&myList, &nodeN);

Soru

Traverse bu liste için Node bir işaretçi başlangıçta işaret ederİlk Düğüm. Daha sonra sentinel tekrar puan kadar listede durur birlikte erişir.

void traverse()
{
    Node* ptr;
    for(ptr = myList.next; ptr != &myList; ptr = ptr->link.next)
    {
        printf("%f ", ptr->data);
    }
}

Sorum şu satırı ile ptr != &myList.Bu hat ile işaretçi hizalama bir sorun var mı?

Döngü için doğru uyarılar üretir: (warning: assignment from incompatible pointer type warning: comparison of distinct pointer types lacks a cast) ne diyor yapıyor susturdu olan ve 14* *döküm. Ancak, bu DumbThingToDo™? Hiç döngü ptr == &myList bir kez sona erer gibi &myList işaret ptr->data erişiyorum.

TLDR

C yapılar, Base* Base Derived ilk üyesi ise Derived). Eğer Derived özel üyelerin hiçbiri erişilen Base Derived* bir nokta olabilir?

EDİT: yerine ilgili kod satır içi işlevi benzerleri ile arama.

CEVAP
27 Ocak 2015, Salı


Sunumunuz için tebrikler.

Uygulamanız C yapı adresi ilk üyesi olan adres olduğunu garanti çünkü iyi çalışması gerektiğini düşünüyorum. İfadeleri bir kenara koymak C yapı-üyeleri hakkında hizalama yapar, Bu garanti, uygulama her zaman ilk üyesi olarak Link koyar sürece, bu uyum sorunları neden olmamalıdır anlamına gelir.

here: C99 §6.7.2.1:

Yapısı bir nesne, bit sigara içilmez alan üyeleri ve birim İçinde 13 bit alanları bulunduğu sırada artıran adresleri hangi bildirilmiş. Yapısı bir nesne için bir işaretçi, uygun ilk üye eğer bir üye ise (veya işaret dönüştürülmüş bit-field, sonra bulunduğu birim), ve tam tersi. Yapısı bir nesne içinde isimsiz doldurma olabilir, ama onun değil başlangıç

Bu Base * hakkında söylemek istediğin ne olmalıdır ve böyle bir şey saf var olsa da Derived *, C. sadece aynı bellek düzeni var olan yapılar Bunlar.

Ancak biraz kırılgan Düğüm ve Bağlantı doğrudan birbirine bağlıdır, çünkü bu şekilde uygulamak için gerekli olduğunu düşünüyorum. Eğer Düğüm yapısını değiştirmek olsaydı, kodunuz geçersiz olacak. Şu anda struct Link, senden ayrı sadece yeni bir tür için yeni bir Düğüm yazabilme yeniden ekstra bir Bağlantı olan bir nokta göremiyorum.

Aslında hemen bir şekilde yazılan ve eserler listesinde kullanmak istediğiniz şekilde çok benzer gördüğümde aklıma gelen bağlantılı liste uygulaması vardır: kernel list

Aynı Liste öğesi (list_head) kullanır:

struct list_head {
    struct list_head *next, *prev;
};

Bu fonksiyon makro içeriyor:

#define list_for_each_entry(pos, head, member)                          \
      for (pos = list_first_entry(head, typeof(*pos), member);        \
           &pos->member != (head);                                    \
           pos = list_next_entry(pos, member))

Eğer makro uygulanan bakarsanız, listede bulunan girişleri düzeni hakkında hiçbir şey bilmeden bir liste girdileri üzerinde yineleme bulunmaktadır. Ben niyetinizi doğru yorumlamak varsayarak, böyle olmak istersiniz sanırım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Candyrat Records

    Candyrat Rec

    10 Mayıs 2006
  • michellefeng's channel

    michellefeng

    26 Kasım 2006
  • SerienTrailerMP

    SerienTraile

    7 HAZİRAN 2012