2012-08-28 22 views
5

c99'da benim anlayışım, aynı topluluğa işaret etmeyen iki işaretçiyi karşılaştırmanın tanımlanmamış bir davranışla sonuçlanmasıdır. A agregasına bakıldığında, A içinde işaret ettiği bir işaretçi p_good ve A içinde bulunabilecek veya göstermeyebilecek bir işaretçi p_unknown, p_good ile karşılaştırmanın güvenli olup olmadığını belirleyen tanımlanmış bir davranış ile taşınabilir bir test yapmak mümkündür. p_unknown? Açıkça, bu test, işaretçilerin karşılaştırılmasında kısıtlamaların kendiliğinden geri çekilemeyeceği açıktır.C99: İki işaretçinin aynı topluluğa işaret edip etmediğini portatif olarak belirlemek mümkün mü?

Cevabın 'hayır' olduğundan şüpheleniyorum, aksi halde gösterilmekten mutluluk duyarım.

+1

'Toplama' ile ne demek istiyorsun? Ve tam olarak ne elde etmeye çalışıyorsunuz? –

+0

'A' işaretçiniz var mı? Ya da sadece A'ya işaret eden iki işaretçi mi? –

+0

Sanırım "hayır", ama yine de, "x> = y && x

cevap

5

Sen yorumladı:

böyleolacağını soru çerçeveye bir başka yolu: Bir agreganın 'A' ve işaretçi p tanımı göz önüne alındığında, soruyu 'cevap vermek mümkündür içinde p noktasını yapar A' farklı agrega

Bunu yorumlamak tek yolu için işaretçiler eşitsizlik testinde kuralını ihlal etmeden anlamlı türe Aggregate type bir nesne ya da birine bir işaretçi var ya olmasıdır. Sonra Cevap basit:

Sözde kod: Başıboş işaretçi bilinmeyen bir agrega nesneye ait (ya bir toplu elemanlar "arasında" puan) olup olmadığını söylemek için bir yolu yoktur

bool p_in_A = false; 
for (each element in Aggregate A) 
    if (&element == p) 
     p_in_A = true; 

olduğunu.

+0

Evet, bu mantıklı. Bilinmeyen bir toplama durumunda bunu yapmanın bir yolu olmadığına katılıyorum, fakat benim durumumda, yinelenen eşitlik kontrolünü kullanmak için A'yı yeterince bilmiyorum. UB'den kaçınmanın, bir O (büyüklük (A)) algoritması gerektirmesi ilginçtir. – acm

+1

@acm, bilinmeyen türden bir agreagate için, sadece taban işaretçisini ve büyüklüğünü bildiğiniz için, işaretçilerinizi "imzasız char *" 'a çevirerek bir bayt bazında tüm bunları yapmanız gerekir. –

+0

@JensGustedt Motivasyon durumunda, A'nın türünü biliyorum ve char [] olması, yani döküm olmadan çalışacak. – acm