SORU
9 AĞUSTOS 2010, PAZARTESİ


Neden C diziler yapılar içinde, ama genellikle değil memberwise atama destekliyor mu?

Diziler memberwise atama aşağıdaki çalışmayacak desteklenen, böyle olmadığını anlıyorum:

int num1[3] = {1,2,3};
int num2[3];
num2 = num1; // "error: invalid array assignment"

Ben aslında bu, dilin amacı, açık uçlu bir çerçeve sağlar, ve kullanıcı bir dizi kopyalama gibi bir şey uygulamak için nasıl karar vermesine izin vermek olduğunu düşünerek kabul ettim.

Ancak, aşağıdaki gibi çalışır:

struct myStruct {int num[3];};
myStruct struct1={{1,2,3}};
myStruct struct2;
struct2 = struct1;

8* *dizi üyesi bilge struct2 onun örnek struct1, onun örneğinden atanır.

Neden bilge üye diziler genel olarak yapılar için, ama desteklenmiyor atama mı?

edit:Roger Pate's std::string in struct - Copy/assignment issues? cevap genel yönü gösteriyor gibi konuya yorum ama kendim onaylamak için yeterli bilmiyorum.

2 düzenleyin: Mükemmel tepkiler çok. SeçiyorumLuther Blissett'çoğunlukla davranış arkasında, ama . felsefi ya da tarihsel gerekçesini merak ediyordum çünkü s ^strong>James McNellis'ilgili teknik belgeler için referans olarak faydalı oldu.

CEVAP
9 AĞUSTOS 2010, PAZARTESİ


İşte benim almak:

C Dilinin Gelişimifazla dizi C tipi evriminde bazı bilgiler:

Dizi olanı anahat çalışacağım:

C öncüleri B ve BCPL hayır ayrı dizi türü, bir deklarasyon vardı:

auto V[10] (B)
or 
let V = vec 10 (BCPL)

V 10 kullanılmayan bir bölgeye işaret etmek için "" bellek. kelimeler başlatılan (yazılmamış) bir işaretçi olarak ilan ederlerdi B zaten işaretçi kaldırma için * kullanılmış ve gösterim V[i], C/C gibi bugün anlamı [] kısa el vardı. Ancak, V bir dizi değil, hala bazı hafıza işaret eden bir işaretçi. Bu Dennis Ritchie yapı türleri ile B genişletmek için çalıştı sorun çıkarmadı. Diziler yapılar parçası, C bugün: gibi olmak istiyordu

struct {
    int inumber;
    char name[14];
};

Ama işaretçi dizileri, B,BCPL kavramı ile, bu name sahada olmak zorunda olan bir işaretçi içerir gerekiyordubaşlatılan çalışma zamanındayapı içinde 14 byte bellek bölgesi. Sonunda diziler özel bir tedavi vererek çözüldü/başlatma: derleyici yapıları diziler konumu, vb yığında takip eder. aslında veri göstericisi, dizileri içeren ifadeler dışında hayata gerektirmeden. Bu tedavi hemen hemen tüm B kodu hala çalışmasına izin ve kaynağıdır< . em ^"diziler eğer onlara bakarsanız işaretçi dönüştürmek"kural. Bir uyumluluk olduğu açık boyutu vb dizileri izin çünkü çok kullanışlı olduğu ortaya çıktı, hangi hack.

Diziler B, sadece yazabilirsiniz: işaretçiler Beri burada dizi atanabilir mi neden benim tahminim:

auto V[10];
V=V 5;

bir rebase"". dizi Bu bir dizi değişkeni temel bir lvalue artık olmadığı için artık anlamsızdı. Bu Ödev bu rebasing yaptığı birkaç program yakalamak için yardımcı izin verilmediilan diziler. Diziler asla birinci sınıf C tipi citized için tasarlanmış olduğu için, çoğunlukla eğer onları kullanırsanız işaretçi haline gelen özel hayvanlar gibi muamele gördüler. ve bu fikri takıldı: Ve belirli bir bakış açısı (ki yok sayan C-diziler berbat bir hack), izin vermeme dizi hala atama yapar biraz mantık: açık Bir dizi veya bir dizi fonksiyonu parametre olarak bir işaretçi olmadan boyut bilgileri. Derleyici onlar için bir dizi atama oluşturmak için bilgileri yok ve işaretçi atama uyumluluk açısından gerekli idi. İlan diziler için dizi atama tanıtan olurdu sahte ödevlerinin rağmen hata (a=b işaretçi atama veya elementwise bir kopyası mı?) ve diğer sorun (nasıl değer tarafından bir dizi pass mı?) aslında bir problem çözme olmadan - sadece memcpy ile her şeyi açık olun!

/* Example how array assignment void make things even weirder in C/C  , 
   if we don't want to break existing code.
   It's actually better to leave things as they are...
*/
typedef int vec[3];

void f(vec a, vec b) 
{
    vec x,y; 
    a=b; // pointer assignment
    x=y; // NEW! element-wise assignment
    a=x; // pointer assignment
    x=a; // NEW! element-wise assignment
}

Bu 1978 yılında C revizyon yapı tayini ( http://cm.bell-labs.com/cm/cs/who/dmr/cchanges.pdf) eklendiğinde değiştirmedi. Kayıtları olsa bileedildifonksiyon, parametre olarak onlara C, Olası erken K onları atamak için değildi&R kopyalamak zorunda kaldığın için üye bilge memcpy ile ve yalnızca geçirmek C işaretçileri farklı türleri. Ödev (ve parametre aktarımı) şimdi sadece yapının ham bellek işlev, hedef'in olarak tanımlandı ve bu exsisting kod sonu yapamayınca kolayca adpoted. İstenmeyen bir yan etkisi olarak, bu örtülü olarak dizi atama bir tür tanıttı, ama bu gerçekten diziler kullanıldı yolu ile sorunları tanıtmak olamaz yani bir yerde bir yapı içinde happended,.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Central

    Android Cent

    13 Kasım 2008
  • calicoJake

    calicoJake

    29 EKİM 2007
  • circuschina

    circuschina

    16 Mart 2007