2013-07-18 30 views
6

Boşluk işaretlerini kullanarak C dilinde bir temel sıra yapısı uyguladım. Prosedür aşağıdaki gibidir:C void * kullanarak sıra uygulaması - iyi veya kötü uygulama?

  • yapı başlatma - Değişken tip boyutunu kuyruğunda
  • itme depolanacak set - I değişken için işaretçi depolanacak geçmesi, sıra daha sonra kapmak kendisi için bir kopya ön - yapı, öndeki öğeye bir boşluk * döndürür. Yerel bir kopyanın olması için işaretçiyi veya memcpy()'u yakalayabilirim.

yapı kendisi şuna benzer:

struct queue 
{ 
    void* start; //pointer to the beginning of queue 
    void* end;  //-||- to the end 
    size_t memsize; //size of allocated memory, in bytes 
    size_t varsize; //size of a single variable, in bytes 
    void* initial_pointer;  //position of the start pointer before pop() operations 
}; 

başlangıç ​​ve bitiş şu anda ayrılmış bellek bloğu içinde bazı konuma işaret sadece boşluk noktalar şunlardır. Öğeleri sıraya itirsem, son göstericiyi varsize ile artırırım. Eğer pop() ise, son göstericiyi de varsize ile düşürüyorum. Buraya fonksiyonları kod gönderilmesi gerekiyor sanmıyorum

, 100 hatları bitti.

soru: bu kötü bir uygulama iyi ya da kabul edilir? Neden olmasın)?

Not: Ben sadece bu bir kalitesi hakkında soruyorum C. kuyrukta için birçok seçenek vardır farkındayım.

DÜZENLEME: uygulama burada mevcuttur: http: türünü ve boyutunu bilmiyorsanız // 89.70.149.19 /stuff/queue.txt

+2

Bellek boyutları için size_t kullan –

+0

Ben jenerik kodu yazmak için iyi olduğunu düşünüyorum * void * ' –

+0

@RanEldan Teşekkür ederim, yapacağım. Burada düzeltildi. – szczurcio

cevap

8

O void * kullanmak Tamam (boşlukları kaldırın) sıraya kaydedilecek nesnelerin (aslında, C standart kitaplığı aynı yaklaşımı izler, bazı örnekler için memcpy() ve qsort() işlevlerine bakın). Ancak, sıraya depolanan öğelerin boyutunu belirtmek için size_t (veya imzalı bir veri türüne ihtiyacınız varsa ssize_t) kullanmak daha iyi olacaktır. Uygulamanızdan emin olmak için bize yeterince şey göstermiyorsunuz.

+1

Ran Eldan, daha önce bunu düzeltdiğimi belirtti. Tamam, görüşünüz için teşekkür ederim. Bunu yapmak gerçekten sezgisel olduğunu düşünüyorum, sadece bunun "çirkin" olduğunu iddia eden bazı insanlar gördüm. – szczurcio

+2

@szczurcio Mesele şu ki, önceden bir şey bilmiyorsanız gerçekten başka bir şey yapamazsınız. Bunu yaparsanız, daha iyi tip güvenliği için herhangi bir yolla 'void *' kullanmayın. –

2

Kullanıcı veri öğeleri için void* iyi, sen C

çok aksi

yapamaz Ama şiddetle öğeleri tek tek yönetmek için kullanabileceğiniz bir iç liste elemanı tipini,

struct list_item { 
    struct list_item* next; 
    void* data; 
}; 
gibi bir şey olduğunu sanıyorum Eğer durum ve start ve end işaretçileri tür unsurlara işaret ederse

, sen kesin struct queue açıklama yaparken eleman tipini kullanmalısınız:

struct queue 
{ 
    struct list_item* start; //pointer to the beginning of queue 
    struct list_item* end;  //-||- to the end 
    size_t memsize; //size of allocated memory, in bytes 
    size_t varsize; //size of a single variable, in bytes 
    struct list_item* initial_pointer;  //position of the start pointer before pop() operations 
}; 

Bunun çalışması için struct list_item'un tanımını struct queue kullanıcısına bile maruz bırakmak zorunda değilsiniz.

+0

Ne demek istediğinden emin değilim. Başlama ve sonlandırma, şu anda ayrılmış bellek bloğu içinde bazı konumlara işaret eden yalnızca boşluk işaretçileridir. Öğeleri sıraya itersem, uç işaretçisini varsize göre artırırım. Ben pop(), sadece son işaretçi de varsize tarafından azaltacağım. – szczurcio

+0

DÜZENLEME: Söz konusu kodun koduna bir link ekledim. – szczurcio

+0

@szczurcio, bir kuyruğun alışılmamış bir uygulamasıdır, olağan olanı burada tanımladığım gibi dinamik öğelerle bir şey olurdu. Yorumunuzda yer alan açıklamayı referans için soruya eklemelisiniz. O zaman bu cevabı sileceğim, ki bu size fazla hizmet etmiyor. –

İlgili konular