Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - страница 22 1...151617181920212223242526272829...36 Новый комментарий fxsaber 2023.02.14 19:06 #211 Stanislav Korotky #: Как раз наоборот. Данная ошибка подтверждает, что шаблон берется в расчет и компилятор не может узнать тип. Вызов f<int> - однозначно, шаблон. Вызов f в себе не содержит никакого намека на шаблон. Можно подумать, что f == f<void>, но и такого нет. Stanislav Korotky 2023.02.14 19:26 #212 fxsaber #: Вызов f в себе не содержит никакого намека на шаблон. Можно подумать, что f == f<void>, но и такого нет. Для шаблонных функций всегда работает правило (попытки) неявного выведения типа по вызову, если тип-параметр(ы) не указаны явно. fxsaber 2023.02.14 19:48 #213 Stanislav Korotky #: Для шаблонных функций всегда работает правило (попытки) неявного выведения типа по вызову, если тип-параметр(ы) не указаны явно. Нужной шаблонной сигнатуры не находит (доказательство) - надо искать среди остальных. Этого не происходит. Другие языки с таким же поведением? Alain Verleyen 2023.02.14 20:03 #214 fxsaber # : Нужной шаблонной сигнатуры не находит ( доказательство ) - надо искать среди остальных. Этого не происходит. Другие языки с таким же поведением? Нет, он отлично компилируется и работает с C++ (без использования NULL, который отличается от C++). fxsaber 2023.02.14 20:59 #215 Alain Verleyen #: Нет, он отлично компилируется и работает с C++ (без использования NULL, который отличается от C++). Спасибо! Slava 2023.02.15 09:10 #216 Alain Verleyen #: Нет, он отлично компилируется и работает с C++ (без использования NULL, который отличается от C++). Не все фичи C++ реализованы. Некоторые реализованы с ошибкой. Но в данном случае, с высоты 30-летнего опыта программирования на C++, я бы сказал: "не надо так делать". Это - путь к трудноуловимым ошибкам. Больше скажу. Одинаковые имена методов разных (но похожих классов) (особенно в больших проектах) затрудняют поиск вызовов этих методов по проекту Ошибки, баги, вопросы Особенности языка mql5, тонкости Вопрос по массивам к fxsaber 2023.02.15 09:40 #217 Slava #: Одинаковые имена методов разных (но похожих классов) (особенно в больших проектах) затрудняют поиск вызовов этих методов по проекту Как практикуете наименования тогда? Rashid Umarov 2023.02.15 10:56 #218 Denis Kirichenko #: Если код из примера представить как скрипт: То после компиляции имеем: Другие примеры из раздела "Преобразования матриц" компилируются нормально. Если конечно пример подразумевает своё воспроизведение. Если нет, то вопрос снимается... Вот рабочий пример #property script_show_inputs //--- input parameters input int InpSize1 =512; input int InpSize2 =256; input int InpSize3 =1024; //+------------------------------------------------------------------+ //| Заполнение тестовой невырожденной матрицы | //+------------------------------------------------------------------+ template<typename T> void MatrixFill(matrix<T> &matrix_a) { ulong size_m=matrix_a.Rows(); ulong size_k=matrix_a.Cols(); T value=0.0; //--- заполним матрицу for(ulong i=0; i<size_m; i++) { for(ulong j=0; j<size_k; j++) { if(i==j) matrix_a[i][j]=T(1.0+i); else { value+=1.0; matrix_a[i][j]=value; } } } } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ int OnStart() { int errors=0; errors+=TestEigen<double>(InpSize1); errors+=TestEigen<double>(InpSize2); errors+=TestEigen<double>(InpSize3); errors+=TestEigen<float>(InpSize1); errors+=TestEigen<float>(InpSize2); errors+=TestEigen<float>(InpSize3); //--- Print("Test ", errors?"failed":"passed"); return(errors); } /* Результат Eigen solver of double matrix 512 x 512 passed vectors=489 time=4268.506 ms Eigen solver of double matrix 256 x 256 passed vectors=251 time=417.610 ms Eigen solver of double matrix 1024 x 1024 passed vectors=916 time=43708.280 ms Eigen solver of float matrix 512 x 512 passed vectors=1 time=2508.357 ms Eigen solver of float matrix 256 x 256 passed vectors=1 time=188.859 ms Eigen solver of float matrix 1024 x 1024 passed vectors=1 time=27209.666 ms Test passed */ //+------------------------------------------------------------------+ //| Тестирование метода Eig | //+------------------------------------------------------------------+ template<typename T> int TestEigen(const int size_m) { int vectors=0; matrix<T> matrix_a(size_m, size_m); matrix<T> matrix_v(size_m, size_m); vector<T> vector_e(size_m); //--- заполним квадратную матрицу MatrixFill(matrix_a); //--- будем мерить микросекунды ulong t1=GetMicrosecondCount(); //--- Eigen Solver matrix_a.Eig(matrix_v, vector_e); //--- замерим ulong t2=GetMicrosecondCount(); //--- проверим правильность A * v = lambda * v for(ulong n=0; n<vector_e.Size(); n++) { vector<T> eigen_vector=matrix_v.Col(n); vector<T> vector_c1 =eigen_vector*vector_e[n]; vector<T> vector_c2 =matrix_a.MatMul(eigen_vector); //--- слишком много делений, потому ослабим проверку на точность до 10-го знака ulong errors=vector_c1.CompareByDigits(vector_c2, sizeof(T)==sizeof(double) ? 10 : 5); if(int(errors)<size_m/10) vectors++; } double elapsed_time=double(t2-t1)/1000.0; printf("Eigen solver of %s matrix %d x %d %s vectors=%d time=%.3f ms", typename(T), size_m, size_m, vectors>0?"passed":"failed", vectors, elapsed_time); return(vectors==0); } Slava 2023.02.15 12:07 #219 fxsaber #: Как практикуете наименования тогда? Имя класса + имя метода. Например, TerminalShutdown, TesterShutdown, SymbolShutdown etc В одном и том же классе не должно быть одинаковых имён методов. Пусть даже и разные типы входных параметров. Например, ObjectInitFromFile и ObjectInitFromArray fxsaber 2023.02.15 12:20 #220 Slava #: Имя класса + имя метода. Например, TerminalShutdown, TesterShutdown, SymbolShutdown etc Правильно понял? class Terminal { void TerminalShutdown() {} }; class Tester { void TesterShutdown() {} }; 1...151617181920212223242526272829...36 Новый комментарий
Как раз наоборот. Данная ошибка подтверждает, что шаблон берется в расчет и компилятор не может узнать тип.
Вызов f<int> - однозначно, шаблон.
Вызов f в себе не содержит никакого намека на шаблон. Можно подумать, что f == f<void>, но и такого нет.
Вызов f в себе не содержит никакого намека на шаблон. Можно подумать, что f == f<void>, но и такого нет.
Для шаблонных функций всегда работает правило (попытки) неявного выведения типа по вызову, если тип-параметр(ы) не указаны явно.
Для шаблонных функций всегда работает правило (попытки) неявного выведения типа по вызову, если тип-параметр(ы) не указаны явно.
Нужной шаблонной сигнатуры не находит (доказательство) - надо искать среди остальных. Этого не происходит. Другие языки с таким же поведением?
Нужной шаблонной сигнатуры не находит ( доказательство ) - надо искать среди остальных. Этого не происходит. Другие языки с таким же поведением?
Нет, он отлично компилируется и работает с C++ (без использования NULL, который отличается от C++).
Спасибо!
Нет, он отлично компилируется и работает с C++ (без использования NULL, который отличается от C++).
Не все фичи C++ реализованы. Некоторые реализованы с ошибкой.
Но в данном случае, с высоты 30-летнего опыта программирования на C++, я бы сказал: "не надо так делать". Это - путь к трудноуловимым ошибкам.
Больше скажу. Одинаковые имена методов разных (но похожих классов) (особенно в больших проектах) затрудняют поиск вызовов этих методов по проекту
Одинаковые имена методов разных (но похожих классов) (особенно в больших проектах) затрудняют поиск вызовов этих методов по проекту
Как практикуете наименования тогда?
Если код из примера представить как скрипт:
То после компиляции имеем:
Другие примеры из раздела "Преобразования матриц" компилируются нормально.
Если конечно пример подразумевает своё воспроизведение. Если нет, то вопрос снимается...
Вот рабочий пример
Как практикуете наименования тогда?
Имя класса + имя метода. Например, TerminalShutdown, TesterShutdown, SymbolShutdown etc
В одном и том же классе не должно быть одинаковых имён методов. Пусть даже и разные типы входных параметров. Например, ObjectInitFromFile и ObjectInitFromArray
Имя класса + имя метода. Например, TerminalShutdown, TesterShutdown, SymbolShutdown etc
Правильно понял?