2012-08-02 112 views
0

我寫了這個函數。在調試過程中,我看到在函數的最後,它會轉到string cmonth[]聲明,然後返回到函數的最後,然後返回string cmonth[]聲明約10次。然後它返回到函數的第一行,然後返回到函數的最後一行大約100次或更多。C++怪異循環

int CheckLastDate(string file) 
{ 
string line, dline[200]; 
int i = 0; 
regex rxdate("[[:digit:]].:[[:digit:]].:[[:digit:]]."); 
ifstream infile; 
infile.open(file.c_str()); 

if(! infile.is_open()) return -1; 

while (infile.good()) 
{ 
    getline(infile, line); 
    if(regex_search(line, rxdate)) 
    { 
     dline[i] = line; 
     i++; 
    } 
} 
i--; //needed b/c dline starts at 0; 
infile.close(); 

int imonth, day, hour, min, sec, year; 
string month, ampm; 
string cmonth[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 

month = dline[i].substr(5,3); 
//convert month to number 
for(int j = 0; j<12; j++) 
{ 
    if(month == cmonth[j]) imonth=j+1; 
} 

day = atoi(dline[i].substr(9, 2).c_str()); 
hour = atoi(dline[i].substr(12, 2).c_str()); 
min = atoi(dline[i].substr(15, 2).c_str()); 
sec = atoi(dline[i].substr(18, 2).c_str()); 
ampm = dline[i].substr(21, 2); 
year = atoi(dline[i].substr(24, 4).c_str()); 

if(ampm == "PM" && hour != 12) { hour += 12; } //turn into 24 hours 
else if(ampm == "AM" && hour == 12) { hour = 0; } 

time_t now, dif; //dif = date in file 
double diff; 
time(&now); 
struct tm * timeinfo; 
timeinfo = localtime(&now); 
timeinfo->tm_mon = imonth - 1; 
timeinfo->tm_mday = day; 
timeinfo->tm_hour = hour; 
timeinfo->tm_min = min; 
timeinfo->tm_sec = sec; 
timeinfo->tm_year = year - 1900; 
timeinfo->tm_isdst = -1; //-1 = no info 
dif = mktime(timeinfo); 
diff = difftime(now, dif); 

if(diff >= 86400) return 1; //more then 24 hours 
else return 0; 
} 

有什麼不對嗎,還是C++的工作原理? 謝謝你的幫助。

+2

這可能是析構函數調用。 – Mat 2012-08-02 06:21:39

+1

你確定你建立了正確的源代碼嗎?如果源代碼與編譯的程序不匹配(即,您進行了更新但未編譯它),那麼調試器將顯得非常奇怪。 – 2012-08-02 06:22:23

+2

也許您在調試時打開了優化?或者在「發佈模式」下調試?優化對代碼做了奇怪的事情,使其很難調試。 – jahhaj 2012-08-02 06:22:25

回答

0

它是調試還是發佈版本?另外,您是否在C++代碼級別或彙編級別進行調試?

在發佈版本中,編譯器可能會生成初始函數中不存在的各種代碼跳轉。

+0

我在調試模式下進行調試。另外,我在C++代碼級調試。 – 2012-08-02 06:27:50

2

它看起來不錯,但一些普通指針:

您的循環檢查月經過所有月份甚至當它發現一個月, 似乎沒有必要。

你應該習慣總是初始化所有變量。在調試模式下,變量可能會被初始化,但在釋放模式下,它們通常不會。

您應該添加一些檢查以確保正則表達式返回的字符串具有您期望的格式。例如檢查長度。如果令牌以空格分隔,則還可以使用strtok_s()來分隔字符串。它可能比期望令牌更安全,總是具有一定的長度或者處於特定的索引。

當您從文件讀入時,如果文件有超過200行,則沒有檢查以防止出現錯誤。你應該考慮這個。例如while (infile.good() && i < 200)

+0

謝謝你的提示。 – 2012-08-02 06:51:51

+0

這是我正在拆分的字符串類型:「Thu,Aug 02 12:56:43 AM 2012 EDT」 – 2012-08-02 06:56:07

+0

另外,我正在使用Debian Linux和Boost(僅用於正則表達式)。 – 2012-08-02 07:01:26