Как запихнуть строки в ресурсы или мультиязычный советник - страница 3

 
Alexey Volchanskiy:

В конструкторе никакие массивы нельзя проинициализировать одной строкой типа 

Можно только поэлементно

Но можно задать начальные значения массивам с модификатором static или const static. Пример:

А какой в этом смысл, почему не сделать проще, и ничего не усложнять? Я чего-то не понимаю...
 
Vitaly Muzichenko:
А какой в этом смысл, почему не сделать проще, и ничего не усложнять? Я чего-то не понимаю...

Разумеется, можно и без класса обойтись. Я так и писал с самого начала, сделать 2-х мерный массив 

#define STR_COUNT 256
const string langStr[2][STR_COUNT] = {тут инициализируем}

 И потом выбирать строки, подставляя нужный индекс в нулевое измерение массива, выбирая таким образом язык. Зачем нужен класс? Возможно, в процесе разработки встанут новые задачи, удобно все это инкапсулировать в классе. Но пока выгода и правда неясна.

 

А вот такой класс сделал:

//+------------------------------------------------------------------+
//|                                                    Languages.mqh |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CLng
  {
private:

public:
                     CLng();
                    ~CLng();
   //--- get text
   virtual string    GetText(const int row);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CLng::CLng()
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CLng::~CLng()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string CLng::GetText(const int row)
  {
   string ru[9]=
     {
      "Аа",
      "Бб",
      "Вв",
      "Гг",
      "Дд",
      "Ее",
      "Ёё",
      "Жж",
      "Зз"
     };
   string en[9]=
     {
      "Aa",
      "Bb",
      "Cc",
      "Dd",
      "Ee",
      "Ff",
      "Gg",
      "Hh",
      "Ii"
     };
//---
   int size=8;
   if(row<0 || row>size)
     {
      return(NULL);
     }
//---
   string language=TerminalInfoString(TERMINAL_LANGUAGE);
   if(language=="Russian")
     {
      return(ru[row]);
     }
   else
     {
      return(en[row]);
     }
  }
//+------------------------------------------------------------------+
 
Alexey Volchanskiy:

Разумеется, можно и без класса обойтись. Я так и писал с самого начала, сделать 2-х мерный массив 

 И потом выбирать строки, подставляя нужный индекс в нулевое измерение массива, выбирая таким образом язык. Зачем нужен класс? Возможно, в процесе разработки встанут новые задачи, удобно все это инкапсулировать в классе. Но пока выгода и правда неясна.

Я к тому, что перевод в латиницу и перевод в нормальный язык, это две абсолютно разные вещи. Вы ведь не будете использовать в разных проектах один и тот-же текст перевода, что в свою очередь сводит к нулю весь смысл затеи.
 
Karputov Vladimir:

А вот такой класс сделал:

Ну как-то при каждом получении строки создавать массивы на стеке... не очень красиво и быстро. Это ведь рантайму придется копировать участки памяти из областей строковых констант, где изначально хранятся эти строки, в область стека. А если это килобайты или больше?

Это я сужу, как бы это было бы реализовано компилятором С++. В свое время много возился с отладкой/оптимизацией С++ кода на языке ассемблера. Могу предположить, что и в MQL сделано примерно так же.

 
Vitaly Muzichenko:
Я к тому, что перевод в латиницу и перевод в нормальный язык, это две абсолютно разные вещи. Вы ведь не будете использовать в разных проектах один и тот-же текст перевода, что в свою очередь сводит к нулю весь смысл затеи.

А у нас тут мозговой штурм, можем и какую-нибудь Кортану с подружкой Сири присобачить ))

На самом деле, на форуме так редко встречаются интересные технические темы, что иногда хочется порассуждать о вариантах.

Пожалуй, надо открыть ветку по созданию граального индикатора с нуля, растрясти народ после мрачной зимы ))

 
Alexey Volchanskiy:

Ну как-то при каждом получении строки создавать массивы на стеке... не очень красиво и быстро. Это ведь рантайму придется копировать участки памяти из областей строковых констант, где изначально хранятся эти строки, в область стека. А если это килобайты или больше?

Это я сужу, как бы это было бы реализовано компилятором С++. В свое время много возился с отладкой/оптимизацией С++ кода на языке ассемблера. Могу предположить, что и в MQL сделано примерно так же.

На самом деле сколько раз за всю программу будут дёргаться из массива строки? До двух десятков обращений за раз. Не более.
 

А может просто? Двухмерный массив, в первом измерении язык, во втором фраза, константы:

#define MES_HELLOW 0;

#define MES_BUY 1; 

string ar[]={{"привет","пока"},{"hellow","bye"}}  

int lng=0; 

int init(){

   lng=1; // выбор языка

   Alert(ar[lng][MES_HELLOW]);

}

int deinit(){
        Alert(ar[lng][MES_BUY]);

} 
 
Dmitry Fedoseev:

А может просто? Двухмерный массив, в первом измерении язык, во втором фраза, константы:

Тоже неплохо. Вот так будет компилироваться:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#define MES_HELLOW 0
#define MES_BUY 1
string ar[][2]=
  {
     {"Привет","пока"},
     {"Hi","buy"},
     {"Salut","tandis que"},
     {"Hallo","Tsch?ss"}
  };
int lng=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   for(int i=0;i<ArrayRange(ar,0);i++)
     {
      Comment(ar[i][MES_HELLOW]);
      ChartRedraw();
      Sleep(2000);
      Comment(ar[i][MES_BUY]);
      ChartRedraw();
      Sleep(2000);
     }
   Comment("");
  }
//+------------------------------------------------------------------+

Правда удобство будет если количество элементов во втором измерении не более 10 или 20 - иначе банально слова будут вылезать за экран и будет сложно вносить правки и поддерживать синхронность фраз на разных языках.

 
Karputov Vladimir:

Тоже неплохо. Вот так будет компилироваться:

Правда удобство будет если количество элементов во втором измерении не более 10 или 20 - иначе банально слова будут вылезать за экран и будет сложно вносить правки и поддерживать синхронность фраз на разных языках.

Тогда можно по первому измерению фразу, по второму язык. Еще можно в столбик записывать и нумеровать.
Причина обращения: