2014-10-04 17 views
5

Ben kodumu Valgrind aracını kullanarak hata ayıkladı. Bu hatayı bu işlevde gösterir. Hatanın ve işlevimin altında verdim. Burada sorunun ne olduğunu bilmiyorum Nasıl düzeltebilirim? Hatanım.Başlatılmamış değer, yığın ayırma tarafından oluşturuldu

başlatılmamış değeri 0x80996D7 bir yığın ayırma tarafından yaratıldı: cdtojd (std :: string const &)

Benim Kod olduğunu.

double cdtojd(const string &cdate); 

double cdtojd(const string &cdate) 
{ 
    int dd,mm,yy; 
    int y,m; 
    double jd=0; 

    //mm = atoi(cdate.substr(0,2).c_str()); 
    //dd = atoi(cdate.substr(2,2).c_str()); 
    //yy = atoi(cdate.substr(4,4).c_str()); 

    sscanf(cdate.c_str(),"%2d%2d%4d",&mm,&dd,&yy); 

    //cout<<mm<<"..."<<dd<<"...."<<yy<<endl; 

    y = (yy - 1900) * 372; 

    m = (mm-1) * 31; 

    jd = dd + m + y; 

    return jd; 
} 
+2

Hataları sscanf() denetlemeyi düşündünüz mü? –

+2

sscanf başarılı oldugunu kontrol edin – Igor

cevap

3

Hatanın anlamı, atamadan önce bir değişken kullanmanızdır. Bunun için geçerli olabilecek tek değişkenler dd, mm, yy'dur.

Bu, sscanf aramanızın üçünün hepsine yazılmadığı anlamına gelir. Tamamen belirtilmemiş bir tarihte iletirseniz, bu gerçekleşir.

Not: sscanf, kaç tane değişkene yazdığını bildiren bir değer döndürür. Geri dönüş değerini kontrol etmeli ve 3'e dönmezse (veya bazı varsayılan değerleri doldururken) iptal etmelisiniz, çünkü o zaman tüm alanlarınız doldurulmayacaktır.

+0

@SmithDwayne '"% 2d% 2d% 4d "' düsündüklerinizi yapmaz. Ayrıca, ISO 8601 sadece izin verilen tarih formatıdır. – o11c

1

sscanf için bir hata kontrol edilmez ve bu, bazı değişkenlerin başlatılmamış olarak kaldığı ve daha sonra kullanıldığı anlamına gelir, örn.

std::string str = "invalid"; 
unsigned int dd,mm,yy; 
cout << dd << " " << mm << " " << yy << endl; 
cout << "Arguments read: " << sscanf(str.c_str(),"%2d %2d %4d",&mm,&dd,&yy) << endl; 
cout << dd << " " << mm << " " << yy; 

Yukarıdaki kod çıkışı olarak yayarlar olabilir:

32550 3249645428 32550 
Arguments read: 0 
32550 3249645428 32550 

her üç argüman başlatılmamış kalır nerede.

İlgili konular