1

Badaの経験がなくても、Badaアプリを1.2から2.0にアップグレードしようとしています。プロジェクトを構築してエミュレータで実行できますが、警告が大量に表示され、テキストボックスをクリックしてキーボードを取得し、エミュレータに何かを入力することができません。

残念ながら、警告メッセージは私には完全に不可解です。

SearchForm::SearchForm(void) :

「ここで初期化すると」という警告メッセージが表示されます

ここで初期化するとどうなりますか??!!

また、すべてのTryCatchステートメントは構文エラーを示しており、インターネットで見つけたものは何も満足していないようです。

result OnDraw()
{
    result r = E_SUCCESS;

    Canvas* readerCanvas = GetCanvasN();
    TryCatch(E_SUCCESS == GetLastResult(), "Failed to get canvas: %S", GetErrorMessage(r));

     if (readerCanvas)
     {
         Rectangle tempRect(0, 0, GetBounds().width, GetBounds().height);
         Point tempPoint(0, 0);
         r = readerCanvas->Copy(tempPoint, *iDrawingCanvas, tempRect);
         TryCatch(E_SUCCESS == r, "Failed to copy canvas: %S", GetErrorMessage(r));
         delete readerCanvas;
     }

    return r;

    CATCH:
        delete readerCanvas;
        return r;
}

TryCatch行には、「ステートメントは効果がありません」と表示されます。見つけた例と一致するように編集しようとすると、構文エラーが発生します。

これはどうしたの?

4

1 に答える 1

1

IDEの想定される悪いメッセージを、完全に文脈から外して部分的にのみ引用することで、それを上回ろうとしているようです。分解させてください:

TryCatch

マクロは次のように定義されます

TryCatch(condition, cleanup, message)

条件がfalseと評価されると、これはCATCHに移動します。次のようなマクロを考えることができます。

if (!condition)
{
    goto CATCH;
}

たとえば、次のように使用できます。

void TryCatchDemo::UseTryCatch(void)
{
    TryCatch(1==2, , "1 is NOT 2");

    AppLog("This should not appear");

    CATCH:
        AppLog("Catch block");
}

ここで、2番目のパラメーターは文字列リテラルです"Failed to get canvas: %S"。これは当然のことながら、ステートメントとして使用しても効果がありません。

    "does nothing";
    123;              // just like this

したがって、コンパイラは、おそらく他のことを念頭に置いているという事実を警告してくれます。また、これは構文エラーでstatement has no effectないことにも注意してください。

「ここで初期化したとき」

あなたの言語を知ってください!引用されたコードは、そもそもC++では合法ではありません。

  SearchForm::SearchForm(void) :

せいぜい、これはコンストラクター定義の始まりであり、初期化子リストと本体が欠落しています。C ++言語仕様では、クラスメンバーは、初期化子リストに表示される順序ではなく、宣言された順序で初期化されます。最小限の例:

struct X
{
     int a, b;
     X() : b(), a() {}
};

これにより、コンパイラの警告が発生します。

/tmp/test.cpp|3 col 13| warning: ‘X::b’ will be initialized after [-Wreorder]
/tmp/test.cpp|3 col 10| warning:   ‘int X::a’ [-Wreorder]
/tmp/test.cpp|4 col 6| warning:   when initialized here [-Wreorder]

ご覧のとおり、コードだけでなく警告もクリップしました。メッセージ全体とコード全体を読むと、修正は非常に明白になります。

struct X
{
     int a, b;
     X() : a(), b() {}
};

ボーナス:あなたが疑問に思っていた場合、なぜ順序が重要なのか、あなたがそうするときに何が起こるかを考えてください:

struct X
{
     int a, b;
     X() : b(), a(b) {} // OOPS!
};

お役に立てれば

マクロでのフォーマット文字列の使用

編集私はちょうどこれに注意しました:Try /Catchマクロ内でフォーマット文字列を使用することはおそらくサポートされていません:

メッセージパラメータをサポートする各マクロは、実際にはフォーマット文字列をサポートします。フォーマット文字列は、それをサポートするシステムのprintfのフォーマット文字列に似ています(badaはそれをサポートしていません)

于 2011-12-14T09:00:28.937 に答える