2016-03-21 24 views
0

Günlerin bir dizi listesi arasında dolaşan ve ilk 7 gün içinde geçiş yaptığımda, program çöküyor, yeniden başlatılmasını istediğimde, değişken num'te bir int depolayan bir for döngüsüm var 1. günde ve '1' maymununa dönüşür ... ancak ilk döngüden sonra çöker.Döngü çöküyor ... segFault C++

Neyi yanlış yapıyorum? beklenen büyüklükte

C++

//********************************************************************************************* 
//        function prototype 
//********************************************************************************************* 
void collectFood(string days[]); 



int main(){ 

    //array to hold week days 
    string days[7] = {"Mon", "Tue", "Wen", "Thur", "Fri", "Sat", "Sun"}; 

    collectFood(days); 

} 
//********************************************************************************************* 
//     function to collect foods amounts 
//********************************************************************************************* 
void collectFood(string days[]){  
    int num = 0; 

    // for loop for each monkey 
    for (int monkey=0; monkey < 3; monkey++){ 
     // for loop to take 7 days worth of food per monkey 
     for (int day=0; day < sizeof(days); day++){ 
      cout << "Enter the pounds of food eaten by monkey " << monkey 
      << " on " << days[day] << ": "; 
      cin >> num ; 
     } 
    } 
} 
+4

'sizeof (gün);' Oldukça eminim ki, ne düşündüğünüzü kastetmiyor. 64bitlik bir platformda ** 8 ** olacak; 7 değil (ve 32bit platformda sadece 4 olacak). Diziinizin büyüklüğünü değil * * işaretçisinin boyutunu kullanıyorsunuz. – WhozCraig

+0

Günün bildirisinde “7” yi atlayın, daha sonra “sizeof (days)' use 'days-> length()' yerine kullanın. –

cevap

1

Sen hesaplama kullandığınız bağlamda doğru değil. Basit bir C-tipi dizi (içinde bulunduğunuz türden bağımsız olarak sahip olduğunuz şey), basit bir parametre olarak geçtiğinde işaretçi-türü olarak ifade edilir.

Böylece

bu:

void collectFood(string *days) 

ve sizeof(days) gerçekten işaretçi string için boyutu olduğunu açıkça ortaya çıkmaktadır:

void collectFood(string days[]) 

bu eşdeğerdir. Platformunuzda, bu bağlamda bir işaretçi sekiz bayt olacağını düşündüğünüzde, muhtemelen 64 bit kodu derlediğinizden emin olabilirsiniz ve bu nedenle dizinin gerçek boyutunu bir öğe ile aşacaksınız.

Bunu yapmanın birçok yolu vardır. Dizinin büyüklüğünü açıklayan collectFood işlevinize ekstra bir parametre bildirmeniz yeterlidir. main() bunun gibi collectFood çağırma

void collectFood(string days[], size_t N) 

ve For döngüsü koşulu içinde N kullanın:

collectFood(days, sizeof(days)/sizeof(*days)); 

alternatif dizi çıkarılabilir olmayan bir daktilo parametre alır bir şablon olacağını referans geçirilir: tekrar

template<size_t N> 
void collectFood(string (&days)[N]) 
{ 
    ... 
} 

ve u, Sayım sınırı olarak koşul içinde se N. Bu durumda, main()'dan gelen çağrı, şimdi sahip olduğunuz gibi kalır. N çağrı tarafından çıkarılacaktır. Ek bir avantaj olarak, bir ham işaretçiyi yanlışlıkla bu işleve iletemezsiniz; , bildirilmiş bir dizi türü olmalıdır, yoksa büyüklük çıkarılabilir ve derleyici size bir hata bildirir.

Başka yollar da var, ancak bunların ilkini, sadece uzunluğu geçip resmi bir parametre olarak ilan etmek, muhtemelen sizin için en kolay olanıdır.

Şansın en iyisi.

+0

Dürüst olacağım, kullandığınız bazı ifadeler bilgi tabanımın dışında. Ve farkettim ki, "sizeof()", düşündüğüm şeyi yapmaz. Bir nedenden ötürü, bu yüzden sizeof() 'nin dizinin uzunluğunu bana vereceğini düşündüm. Bu yüzden her şeyi anlamıyorum .... bu "string * days" dizinin yerini işaret eden bir işaretçidir, doğru mu? Benim kafamın karıştığı şey, "ek bir parametre" diyerek "dizinin büyüklüğüdür". Ayrıca, şablonlar hakkında hiçbir bilgim yok, ama ne olduğuyla ilgili fikri anlıyorum. – waterunnr4

+0

Sadece "7" dizilimin uzunluğunu kullanmaya çalışıyorum, simpiler yolu olur muydu? Bana gösterdiğiniz şey muhtemelen uygun ve bilgi tabanımdan çıkış yolunda ilerliyor. Örneğin, "7" ile büyüklük (gün) 'i değiştirebilirim ve istediğim şeyi yapabilirim, ancak dizinin büyüklüğünü geçmek için böyle bir şekilde yapmaya çalışıyordum. boyutları değiştirmek ve bilgi tabanı benim dizisi 7 günlük bir set değilse, eğer bu mantıklı olursa, for döngüsünün dizisinin boyutunu belirlemek için bir şey kullanabilirim. – waterunnr4

+0

@ waterunnr4 En basit yol, size * gösterdiğim ilk * ve anlaması en kolay yoldur. C++ ile daha da deneyimli hale geldikçe, size gösterdiğim şablon yöntemi gibi size daha fazla seçenek sunulacak. Sonunda muhtemelen std :: array <> ',' std :: vector <> ', vb.'ye taşınırsınız. Zamanla birlikte gelir. – WhozCraig

1

Sanırım sizeof (günler) kullanırken iç döngüdür. Diziyi bir işleve ilettiğinizde, dizinin ilk öğesine yalnızca bir işaretçi iletir, dizinin tamamını değil.

Bunu, dizinin boyutlarını bildiren bir işlev parametresi ekleyerek veya size size size bir size() yöntemi olan std :: vektörünü kullanarak geçiş yapabilirsiniz.Kişisel olarak std :: vector ile giderdim.