2012-03-29 27 views
5

yazık ki. Sonra böyle "Öğe" kaydetmek için bir işaretçi aramak için bir typedef kullanarakatama değerleri

struct record 
{ 
    int value; 
    int key; 
}; 

: Temelde

typedef struct record* Item; 

ne kadar Takip ettiğim Ne yapıyorum gibi bir yapısı oluşturma olduğunu Robert Sedgewick (üçüncü baskı) tarafından C'deki Algoriths'de sayfa 290'de herkesin bu kitaba sahip olması durumunda.

Sonra, konsolundan bir değer okuma anahtara o atayan ilgili sorun yaşıyorum ne. İşte ne var, ve hatalar alıyorum o:

void setKey(Item *element, int x) 
{ 
    element->key = x; 
} 

void standInput(Item A[], int length) 
{ 
    int i; 
    int x; 
    for(i = 0; i < length; i++) 
    { 
     printf("Enter a value for spot %i: ", i+1); 
     scanf("%d", &x); 
     setKey(A[i], x); 
    } 
} 

gcc Item.h 
Item.h:33:6: warning: conflicting types for ‘setKey’ 
Item.h:23:3: note: previous implicit declaration of ‘setKey’ was here 

ben doğru yönde atılmış bir iteleme alabilir, bunu gerçekten takdir ediyorum. Öğe sadece basit ints iken, bu atama için mükemmel bir çalışma programı var, ama şimdi Item-> Key'i kullanmaya çalışıyorum ve biraz kayboldum :) Teşekkürler!

kimse ben gerekli düşünmüyordu kodunun başka bir bölümünü ihtiyacı varsa, en kısa sürede ben isteği gördüğüm gibi, onu göndeririz.

Revizyon: derleme hatası uzağa gitti bu yüzden, standInput yukarıda benim setkey işlevi taşındı. Ne olsa alıyorum segment hatam, bu yüzden hala Sen dizi öğesinin adresini geçmesi gerekiyor

+2

+1. * Yani * – bernie

+0

'u görmek için ferahlatıcı Dizi içindeki her bir Öğe için bellek ayırıyor musunuz? – Cornstalks

cevap

1

setKey ilk bağımsız değişken türü Item değil Item * olmalıdır:

ya yoktur bir işaretçi olarak geçmek için zaten bir işaretçi işaretçisidir. Bir işaretçiyi bir kayda iletmek, bir işaretçiye bir işaretçi değil, bir kayıt. Ne denediğinizin ve hata mesajının açıklamasını içeren iyi yazılmış bir soru için

3

:) yanlış tahsis edeceğim:

setKey(&A[i], x); 

A[i] tipi Item ve değildir Item *setKey yöntem setKey biralmak için imzanızı değiştirmelisiniz böylece olarak Wyzard Item tarafından işaret

Düzenleme zaten bir yapı için bir gösterici beklediği gibive bir Item * değil ve setKey(A[i], x) olarak adlandırın.

+0

Hrm, bu pek işe yaramadı, ama onunla oynayacağım ve başaramayacağımı ve koşamayacağımı göreceğim. Ve işareti ve sorunu yakalamadım, bu yüzden bunun için teşekkürler! –

+0

user684594 @: ben cevabımı biraz güncellendi. Eğer daha fazla kod göstermek gerekir segfault çözmek için (ki gibi kod standInput' 'çağırıyor). – ChrisWue

3

setKey bir Item için bir işaretçi alır. A[i] bir Item bir işaretçi, ancak gerçek Item nesne değildir. Item beri

setKey(A + i, x);

veya

setKey(&A[i], x);

+0

İkinci yöntemin tercih edildiğine inanıyorum; ne olup bittiğini çok daha net. * –

+0

'setKey' bir' Item' için bir işaretçi alır, ama * olmamalı. '->' setKey' 'uygulanması dereferencing olmasını bekler bir' Item' bir 'Öğe *' Bir 'Item' almak dereferencing değil, bir' record' olsun. – Wyzard

+0

Evet, size katılıyorum Wyzard. Cevabınızı + 1'ledim ve sadece başkalarını da bunu yapmaya teşvik edebilirim. o yanlışlıkla çift işaretçi kullanımı hakkında başka bir hata elde gerektiğini olsa işaret gibi bu sadece, yöntem imzası hakkında derleme sorunu çözecektir. – Cornstalks