EditorSetString, const-корректность

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
Centaur
Posts: 1083
Joined: Tue 05 Apr, 2005 20:09
Location: Novosibirsk, Russia
Been thanked: 2 times

EditorSetString, const-корректность

Post by Centaur »

Впервые пытаюсь писать плагин для редактора. Наткнулся на такую вещь:

Code: Select all

struct EditorSetString
{
  int StringNumber;
  char *StringText;
  char *StringEOL;
  int StringLength;
};
Если трактовать это объявление по стандарту C++, то получается, что функция EditorControl(ECTL_SETSTRING, &setString) оставляет за собой право менять строки, переданные ей через указатели setString.StringText и setString.StringEOL.

Пользуюсь FAR Manager’ом 1.70b5 build 1634, Programming FAR Plugins Encyclopedia for Developers 1.70.6 SR2028.

Разъясните ситуацию, пожалуйста :)
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Post by t-rex »

Менять нельзя, это енц где то даже написано.
User avatar
Centaur
Posts: 1083
Joined: Tue 05 Apr, 2005 20:09
Location: Novosibirsk, Russia
Been thanked: 2 times

Post by Centaur »

Неа, мимо. В энциклопедии написано, что я не имею права менять строки, переданные мне из ECTL_GETSTRING:

Code: Select all

struct EditorGetString
{
  int StringNumber;
  const char *StringText;
  const char *StringEOL;
  int StringLength;
  int SelStart;
  int SelEnd;
};
StringText
Указывает на данные строки. Вы не должны их изменять. Помните, что среди этих данных могут быть нулевые символы.
А в EditorSetString соответствующие поля не-const, поэтому, например, не проходит такое:

Code: Select all

void setCurrentLine(const std::string& text)
{
  EditorSetString setString;
  setString.StringNumber = -1;
  setString.StringText = text.c_str();
  setString.StringEOL = 0;
  setString.StringLength = text.size();
  FarManager.EditorControl(ECTL_SETSTRING, &setString);
}
Приходится писать

Code: Select all

  setString.StringText = const_cast<char*>(text.c_str());
что не есть совсем красиво.

Другими словами, у меня есть строка. Она моя, я хочу, чтобы её без моего ведома никто не менял. Я её пытаюсь передавать по указателю на константу. А ECTL_SETSTRING требует от меня указатель на неконстанту, из чего я могу заподозрить, что FAR попытается мою строку изменить.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Post by t-rex »

А понял, сорри читал не внимательно. В общем это пока не очень реально исправить, есть ещё не мало таких мест в plugin.hpp, постепенно это правится, раньше было хуже.
Post Reply

Return to “Разработка плагинов”