2016-08-29 6 views
4

Visual Studioでは、forループが正しくないと伝えています。 エラーメッセージは以下のとおりです。OK なぜforループは正しくありませんか?

  • 予期しない

    • bool型が欠落している未宣言の識別子
    • です。前}

    に関する情報:

    が長い-MoveNextブール

    for (size_t i = 0, bool ok = recordset.Select(Adress::getSQLStatement() + "Where A05.recid = %ld", i); ok; ok = recordset.MoveNext(), i++) { 
        at(i).Save(recordset); 
    } 
    
    +12

    1つのステートメントで2種類の変数を定義することはできないためです。 – StenSoft

    +0

    助けてくれてありがとう –

    答えて

    6

    それは、ようだStenSoftは語りました。しかし、ループの最初のステートメントで無名構造を定義し、それを初期化することができます。

    #include <iostream> 
    using namespace std; 
    
    int main() { 
        for (struct {size_t i; bool ok;} s = {0, true}; s.ok; ++s.i) { 
         s.ok = s.i < 10; 
         cout << s.i; 
        } 
        return 0; 
    } 
    

    しかし、IMHO、while it worksでも、それは価値があります。コードを再構成する方が良い。

    +0

    私はOP – Bernhard

    +0

    @Bernhardのwhileループを提案しています。答えを記録する必要があります:) – StoryTeller

    +0

    私はその解決策の最初の試みを知っています –

    2

    まずオフを返す-recordset.Select、あなたはもちろん、あなたを書き換えることができますループはそうです:

    { 
        bool ok = recordset.Select(...); 
        for (std::size_t i = 0; ok; ok = recordset.MoveNext(), ++i) 
        { 
         /* ... */ 
        } 
    } 
    

    しかし、ここでのメタレッスンは、ほぼすべてのループがfor -loopsであり、構造が異なると思うときは、もう一度考えてください。あなたのロジックをより明確にするために、おそらくfor -loopsの書き換えがあります。現在のコードでは、最初のエラーと後で「レコードがありません」というエラーは区別されません。新しいコードでは、それは今、明示的に可能です:

    if (bool ok = recordset.select(...)) 
    { 
        for (std::size_t i = 0; ok; ok = recordset.MoveNext(), ++i) { /* ... */ } 
    } 
    else 
    { 
        // handle initial error 
    } 
    

    私は多分、冗長ok変数を取り除くになります。

    if (recordset.select(...)) 
    { 
        for (std::size_t i = 0; ; ++i) 
        { 
         /* ... */ 
    
         if (!recordset.MoveNext()) break; 
        } 
    } 
    else 
    { 
        // handle initial error 
    } 
    
    関連する問題