Особенности языка mql5, тонкости и приёмы работы - страница 320 1...313314315316317318319320321322323324325326327...339 Новый комментарий Botan626 2025.11.30 17:51 #3191 amrali #: Компилятор не может определить (будущее) значение времени выполнения для расширения макроса mcr(num) во время компиляции. В макросе mcr(z) используется оператор concat (##), поэтому он должен быть разрешен (расширен) только во время компиляции. Понятно. По-другому можно решить эту задачу? Возможно как-нибудь задавать имена переменных через условия? amrali 2025.11.30 21:08 #3192 Условие должно быть разрешено во время компиляции. Это можно сделать с помощью #ifdef и #ifndef. Botan626 2025.11.30 22:56 #3193 amrali #: Условие должно быть разрешено во время компиляции. Это можно сделать с помощью #ifdef и #ifndef. Такой код тоже не компилируется. char x3 = 0, x4 = 0, x5 = 0, o = 5; #define num o #define mcr(z) x##z = 5; mcr(num) Print("x3 = ",x3,", x4 = ",x4,", x5 = ",x5); o уже равно 5 и переменная x5 определена. Где ошибка? Alain Verleyen 2025.12.01 01:43 #3194 Andrei Iakovlev #:Такой код также не будет компилироваться. o уже равно 5 и переменная x5 определена. Где же ошибка? Препроцессор ничего не знает о значении 'o' или любой другой переменной. Чего вы на самом деле пытаетесь добиться? JRandomTrader 2025.12.01 01:50 #3195 Andrei Iakovlev #: Такой код тоже не компилируется. o уже равно 5 и переменная x5 определена. Где ошибка? Если хотите получить "вычисляемые" имена переменных, используйте массивы. Dominik Egert 2025.12.01 06:46 #3196 Alain Verleyen #:Препроцессор ничего не знает о значении 'o' или любой другой переменной. Чего вы на самом деле пытаетесь добиться? Полагаю, он ищет возможность прекомпилятора constexpr в C/C++.Препроцессор MQL не поддерживает функцию const expr. amrali 2025.12.01 07:06 #3197 Таким образом, вы можете использовать условия компиляции: #define mcr2(z) x##z = 5 #define mcr(z) mcr2(z) // откомментируйте следующую строку и перепроверьте //#define MYCOND #ifdef MYCOND #define num 3 #endif #ifndef MYCOND #define num 5 #endif void OnStart() { char x3 = 0, x4 = 0, x5 = 0; mcr(num); Print("x3 = ",x3,", x4 = ",x4,", x5 = ",x5); } Botan626 2025.12.01 12:08 #3198 amrali #: Таким образом, вы можете использовать условия компиляции Работает как надо. Спасибо. fxsaber 2025.12.11 19:30 #3199 Почему второй вариант работает в 20 раз медленнее? #import "msvcrt.dll" ulong memcpy( const int &dst, const ulong src, const int cnt ); ulong memcpy( const int &dst[], const int &src[], const int cnt ); #import void OnStart() { int Array[]; ArrayResize(Array, 1e8); ArrayInitialize(Array, 1); const ulong StartTime1 = GetMicrosecondCount(); const int Size1 = ArraySize(Array); int Sum1 = 0; for (int i = 0; i < Size1; i++) Sum1 += Array[i]; Print(GetMicrosecondCount() - StartTime1); // 32029 Print(Sum1); const ulong StartTime2 = GetMicrosecondCount(); const ulong Size2 = msvcrt::memcpy(Array, Array, 0) + Size1 * sizeof(int); int Sum2 = 0; int Value = 0; for (ulong i = msvcrt::memcpy(Array, Array, 0); i < Size2; i += sizeof(int)) { msvcrt::memcpy(Value, i, sizeof(int)); Sum2 += Value; } Print(GetMicrosecondCount() - StartTime2); // 686099 Print(Sum2); } amrali 2025.12.11 19:45 #3200 fxsaber #: Почему второй вариант в 20 раз медленнее? 1. вызов внешней DLL. 2. копирование из памяти. 1...313314315316317318319320321322323324325326327...339 Новый комментарий
Компилятор не может определить (будущее) значение времени выполнения для расширения макроса mcr(num) во время компиляции.
В макросе mcr(z) используется оператор concat (##), поэтому он должен быть разрешен (расширен) только во время компиляции.
Понятно.
По-другому можно решить эту задачу? Возможно как-нибудь задавать имена переменных через условия?
Условие должно быть разрешено во время компиляции. Это можно сделать с помощью #ifdef и #ifndef.
Такой код тоже не компилируется.
o уже равно 5 и переменная x5 определена. Где ошибка?
Такой код также не будет компилироваться.
o уже равно 5 и переменная x5 определена. Где же ошибка?
Препроцессор ничего не знает о значении 'o' или любой другой переменной.
Чего вы на самом деле пытаетесь добиться?
Такой код тоже не компилируется.
o уже равно 5 и переменная x5 определена. Где ошибка?
Препроцессор ничего не знает о значении 'o' или любой другой переменной.
Чего вы на самом деле пытаетесь добиться?
Таким образом, вы можете использовать условия компиляции
Работает как надо. Спасибо.
Почему второй вариант в 20 раз медленнее?
1. вызов внешней DLL.
2. копирование из памяти.