2016-04-06 32 views
0

için öğeler ekleyin. fifo.cBu fıfo'ya int değişkenlerle eklemek çalışıyorum fifo kuyruğuna

Ama onu sadece yığınında int Var oluşturursanız (bu son var olan)

fifo_t *ff = fifo_new(); 


for (int i =0; i<4; i++) { 
    int *k = malloc(sizeof(int)); 
    *k = rand(); 
    printf("%d %p!\n", *k, k); 
    fifo_add(ff, k); 
    free(k); 
} 

fifo_iter(ff, my_callback, NULL); 

aynı Var görmek ve O iştir bu

int x =0; 
fifo_add(ff, (void *)x); 
x = 2; 
fifo_add(ff, (void *)x); 
x = 3; 
fifo_add(ff, (void *)x); 

gibi FIFO eklemek ince ama uyarı var - Neyi yanlış ne

"farklı boyutta tamsayı gelen işaretçi döküm"? Saygılarımla.

DÜZENLEME: Ben fifo kuyruğundaki tüm unsurlarını yok etmek için fifo.c fonksiyonu buldum. Örneğim için, fifo_free (of, NULL); Özel yapınızı kuyruğa eklerseniz, yapınızı yok etmek için bir işlev yazmanız ve bunu ikinci fifo_free parametresine yazmanız gerekir.

@JonathanLeffler için ty ve diğer yorumcu

+2

iki eşdeğer değildir. fifo_add (ff, (void *) x); 'int değeri ekler. fifo_add (ff, k); 'int değerine bir işaretçi ekler. Yani gerçekten int bir int veya bir işaretçi depolamaya çalışıyorsunuz? – kaylum

+2

Yanlış yaptığınız bir şey, döngüde 'free()' yi çağırmaktır. 'Fifo.c' koduna bakın; işaretçiyi yapının içine kopyalar (veri ne kadar büyük olduğu söylenmediği için veriyi kopyalayamaz). Yani, belleği tahsis ederek, işaretçiyi FIFO'ya kopyalayıp sonra serbest bırakarak saklıyorsunuz. Her tahsis ettiğinizde muhtemelen aynı belleği alırsınız, bu yüzden her yeni giriş bir öncekinin üzerinde ezilir. 'Free()' i ayrı bir döngüye veya yeni bir geri arama işlevine taşıyın. –

+0

İşaretçiyi kaydetmeye çalışıyorum. onlar eşit olmadıklarını biliyoruz :) – Max

cevap

0

Kullanım

fifo_add(ff, &x); 

Sen fn_data bir void * olduğu açıklanarak, çünkü yerine dökme sayıl tip daha data için bir işaretçi geçmesi gerekir ve bir Tüm skaler türleri tutmak için void * garanti edilmez. Sonuç olarak, bir fıfo'ya int değişken eklemek için mümkün değil.

Ayrıca beklediğiniz gibi

int x =0; 
fifo_add(ff, &x); 
x = 2; 
fifo_add(ff, &x); 
x = 3; 
fifo_add(ff, &x); 

çalışmayabilir unutmayın. İçerdiği değer değil, yeni düğümde depolanan x adresidir. Böylece, fn_data'un ortak bir belleğe işaret ettiği 3 yeni düğüm almanız gerekir.

İlgili konular