2011-07-01 19 views
1
struct ScheduleTaskInfo 
{ 
unsigned int nTaskID; 
    __time64_t timeStartTime; 
__time64_t timeEndTime; 
}; 

typedef list<ScheduleTaskInfo> SchedulerList; 

SchedulerList::iterator itrSchedulerList;  
for(itrSchedulerList = gSchedulerList.begin();itrSchedulerList != gSchedulerList.end();itrSchedulerList++) 
{ 
    SYSTEMTIME st; 
    GetLocalTime(&st); 

    CTime ctSyatemTime(st); 

    if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime()) 
    { 

     itrSchedulerList = gSchedulerList.erase(itrSchedulerList);   
    } 

} 

これを実行すると、forループがクラッシュしています。これはerase(); 私はここで何か間違ったことをやっている?あなたのようにelse-blockitrSchedulerList++を記述する必要があり、このリストの要素を消去する際の問題

+0

デバッガで実行しようとしましたか? – GWW

+0

ええ、知りたいことは何ですか? –

+0

セグメンテーションフォルトはどの回線から発生していますか?エラーは何ですか? – GWW

答えて

6

で私を提案してください:

for(itrSchedulerList = gSchedulerList.begin(); 
        itrSchedulerList !=gSchedulerList.end();) 
{ 
    SYSTEMTIME st; 
    GetLocalTime(&st); 

    CTime ctSyatemTime(st); 

    if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime()) 
    { 

     itrSchedulerList = gSchedulerList.erase(itrSchedulerList);   
    } 
    else 
     itrSchedulerList++; 
} 

これは、あなたがリストの終わりを超えて、それをインクリメントしていないことを保証します。 erase()は、あなたのバージョンのforループでインクリメントされるエンドイテレータを返すことがあります。

+0

私はたぶん 'while'ループを明快に使うでしょう。 – GWW

+1

素晴らしい!それは働いた –

+0

同じコードは同様にベクトルのために働くでしょうか? –

2

戻り値をeraseに再割り当てするときは、イテレータをインクリメントしないでください。これは、効果的に1つの要素をスキップするためです。余分なelseブロックにそれを置く:

if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime()) 
{ 

    itrSchedulerList = gSchedulerList.erase(itrSchedulerList);   
} 
else 
{ 
    ++itrSchedulerList; 
} 

そして、forループの外にそれを取ります。

+0

素晴らしい!出来た –

関連する問題