Есть ли в Bada IDE завершение кода и содержательные сообщения об ошибках? - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь обновить приложение Bada с 1.2 до 2.0 без опыта работы с Bada. У меня есть проект сборки, и я могу запустить его в эмуляторе, но я получаю множество предупреждений и не могу щелкнуть текстовые поля, чтобы получить клавиатуру и ввести что-либо в эмулятор.

К сожалению, предупреждающие сообщения для меня совершенно загадочны, например

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 написано, что «оператор не имеет никакого эффекта», если я пытаюсь отредактировать его в соответствии с найденными примерами, я получаю синтаксическую ошибку.

Что с этим?

1 Ответ

1 голос
/ 14 декабря 2011

Похоже, вы пытаетесь превзойти предполагаемые плохие сообщения вашей IDE, цитируя их полностью вне контекста и только частично.Позвольте мне разобрать его:

TryCatch

Макрос определен как

TryCatch(condition, cleanup, message)

Когда условие оценивается как ложное, оно переходит в 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");
}

Теперь ваш второй параметр - строковый литерал, "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 НЕ поддерживает ее)

...