Ошибки, баги, вопросы - страница 2703

 
template <typename T>
int CMapManager::IncreaseArraySize( T &array[] )
{

}

Разве при компиляции этого кода не должна возникать ошибка того, что функция должна возвращать значение?

 
Alexey Kozitsyn:

Разве при компиляции этого кода не должна возникать ошибка того, что функция должна возвращать значение?

должна

скорее всего Вы не обращались к этому методу и компилятор не включил этот участок кода в исполняемый файл

 
Igor Makanu:

должна

скорее всего Вы не обращались к этому методу и компилятор не включил этот участок кода в исполняемый файл

Но если я в том же классе обозначу функцию Test() и реализую ее так:

int CMapManager::Test()
{
        
}

Ошибка возникнет, хотя я к этой функции также не обращался нигде.

 
Alexey Kozitsyn:

Но если я в том же классе обозначу функцию Test() и реализую ее так:

Ошибка возникнет, хотя я к этой функции также не обращался нигде.

потому что этот метод не является шаблоном - нет template 

шаблон, по сути, это макроподстановка в которую компилятор подставит необходимые типы при обнаружении вызовов функции(метода класса)

при вот такой "подстановке" будут "сгенерированы" функции с конкретными типами данных

вот примерно так это работает

 
Igor Makanu:

потому что этот метод не является шаблоном - нет template 

шаблон, по сути, это макроподстановка в которую компилятор подставит необходимые типы при обнаружении вызовов функции(метода класса)

при вот такой "подстановке" будут "сгенерированы" функции с конкретными типами данных

вот примерно так это работает

Примерно так я себе это и представляю, спасибо. Но, вопрос в другом, почему на этапе "до генерации" не сообщить, что нужно вернуть значение int?

Ведь, вне зависимости от сгенерированных функций, все они вернут значение типа int.

 
Alexey Kozitsyn:

Примерно так я себе это и представляю, спасибо. Но, вопрос в другом, почему на этапе "до генерации" не сообщить, что нужно вернуть значение int?

Ведь, вне зависимости от сгенерированных функций, все они вернут значение типа int.

мы с Вами на второй заход пошли - на один и тот же вопрос будем отвечать одинаковыми ответами )))

нет вызова - нет применения шаблона, все - это так работает - все 

)))

скрипт набросайте и попроверяйте

вот примерно так:

template <typename T>
T add(T a, T b)
{
  // return(a+b);
}
//+------------------------------------------------------------------+
void OnStart()
{
   Print("start");
  // Print(add(1.0 , 2.0));

}

так компилирует, потом раскрывайте коментарии - будут ошибки

 

где то что то пропустил, в общем ищу подвох в таком коде:

struct SMatrix
{
   SMatrix(){}
   SMatrix(int rows,int cols){ ArrayResize(this.ROW,rows); for(int i=0;i<rows; i++) ArrayResize(this.ROW[i].COL,cols); }
   struct SRow{float COL[];};
   SRow ROW[];
};

//+------------------------------------------------------------------+
void OnStart()
{
   SMatrix matrixA(10,2);
   int count = 0;
   for(int i = 0;i<10;i++)
   {
      for(int j=0;j<2;j++) matrixA.ROW[i].COL[j] = (float)count++; 
   }
   
   SMatrix matrixB = matrixA;
   for(int i=0;i<10;i++)
   {
      ArrayPrint(matrixB.ROW[i].COL);
   }
}

2020.04.12 01:40:16.652 tst (EURUSD,H1) 0.00000 1.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 2.00000 3.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 4.00000 5.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 6.00000 7.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 8.00000 9.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 10.00000 11.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 12.00000 13.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 14.00000 15.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 16.00000 17.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 18.00000 19.00000


 смущает, что так просто получилось создать двухмерный массив и присвоение без описания конструктора копирования работает из коробки

что в моем коде может работать некорректно? 

 

На всякий случай спрошу, есть ли способ заставить функцию StringToCharArray копировать байты без преобразований? Перепробовал все CP_XXX, ни один не обеспечивает копии "1 в 1" в общем случае. Вот такой пример:

void OnStart()
{
  uchar buffer[];
  string data = " test";
  StringSetCharacter(data, 0, 0x81); // just an example, can be obtained in other ways
  StringToCharArray(data, buffer);
  // buffer[0] = (uchar)data[0];     // correct/direct copy
  ArrayPrint(buffer);
}

Способ получения байта 0x81 может быть разный, здесь установлен "в лоб" для простоты. Если не использовать ручное побайтовое копирование (как в закоментированной строчке), функция StringToCharArray преобразует байт 129 (0x81) в 63.

Пока пришлось заменить StringToCharArray на цикл, но может есть секретный CP_XXX?

 
Stanislav Korotky:

На всякий случай спрошу, есть ли способ заставить функцию StringToCharArray копировать байты без преобразований? Перепробовал все CP_XXX, ни один не обеспечивает копии "1 в 1" в общем случае. Вот такой пример:

Способ получения байта 0x81 может быть разный, здесь установлен "в лоб" для простоты. Если не использовать ручное побайтовое копирование (как в закоментированной строчке), функция StringToCharArray преобразует байт 129 (0x81) в 63.

Пока пришлось заменить StringToCharArray на цикл, но может есть секретный CP_XXX?

void OnStart()
{
   uchar buffer[];
   string data = CharToString(0x81) + " test";
   StringToCharArray(data, buffer,0,StringLen(data));
   ArrayPrint(buffer);
}

2020.04.12 15:57:37.812 tst1 (EURUSD,H1) 129  32 116 101 115 116

Причина обращения: