0

この関数を書きました。デバッグ中に、関数の最後で宣言に移動string cmonth[]し、関数の最後に戻り、string cmonth[]宣言に戻ることが約 10 回見られました。次に、関数の最初の行に戻り、関数の最後の行に約 100 回以上戻ります。

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++ の仕組みですか? ご協力ありがとうございました。

4

2 に答える 2

2

それは問題ないように見えますが、いくつかの一般的な指針:

月のforループチェックは、月が見つかった場合でもすべての月を通過しますが、それは不要なようです。

常にすべての変数を初期化する習慣を身に付ける必要があります。デバッグ モードでは変数を初期化できますが、リリース モードでは通常初期化されません。

正規表現が返す文字列が期待どおりの形式であることを確認するために、いくつかのチェックを追加する必要があります。たとえば、長さを確認します。strtok_s()トークンがスペースで区切られている場合は、文字列を分解するために使用することもできます。トークンが常に特定の長さを持っているか、特定のインデックスにあると予想するよりも安全かもしれません。

ファイルから読み込むときに、ファイルが 200 行を超える場合にエラーを防止するためのチェックは行われません。これを考慮する必要があります。例えばwhile (infile.good() && i < 200)

于 2012-08-02T06:48:00.383 に答える
0

デバッグ ビルドですか、それともリリース ビルドですか。また、C++ コード レベルまたはアセンブラー レベルでデバッグしましたか?

リリース ビルドでは、コンパイラは初期関数に存在しないさまざまなコード ジャンプを生成する場合があります。

于 2012-08-02T06:22:34.493 に答える