forked from rosh/MQL5Book
121 lines
3.2 KiB
MQL5
121 lines
3.2 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| FuncOverload.mq5 |
| |||
//| Copyright 2021, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
| |||
#property copyright "Copyright 2021, MetaQuotes Ltd."
| |||
#property link "https://www.mql5.com"
| |||
#property version "1.00"
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Transpose 2x2 matrix |
| |||
//+------------------------------------------------------------------+
| |||
void Transpose(double &m[][2])
| |||
{
| |||
double temp = m[1][0];
| |||
m[1][0] = m[0][1];
| |||
m[0][1] = temp;
| |||
}
| |||
| |||
/*
| |||
// BUG1
| |||
// if uncommented, this function raises compiler error
| |||
// 'Transpose' - ambiguous call to overloaded function with the same parameters
| |||
| |||
void Transpose(double &m[][2], bool fast = false)
| |||
{
| |||
// ...
| |||
}
| |||
*/
| |||
| |||
/*
| |||
// BUG2
| |||
// if uncommented, this function rasies compiler error
| |||
// 'Swap' - function already defined and has body
| |||
| |||
void Swap(double &m[][3], int i, int j)
| |||
{
| |||
// ...
| |||
}
| |||
*/
| |||
| |||
void SwapByReference(double &m[][3], int &i, int &j)
| |||
{
| |||
Print(__FUNCSIG__);
| |||
// ...
| |||
}
| |||
| |||
void SwapByReference(double &m[][3], const int &i, const int &j)
| |||
{
| |||
Print(__FUNCSIG__);
| |||
// ...
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| aux function for matrix transpose |
| |||
//+------------------------------------------------------------------+
| |||
void Swap(double &m[][3], const int i, const int j)
| |||
{
| |||
static double temp;
| |||
| |||
temp = m[i][j];
| |||
m[i][j] = m[j][i];
| |||
m[j][i] = temp;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Transpose 3x3 matrix |
| |||
//+------------------------------------------------------------------+
| |||
void Transpose(double &m[][3])
| |||
{
| |||
Swap(m, 0, 1);
| |||
Swap(m, 0, 2);
| |||
Swap(m, 1, 2);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Summation overloads |
| |||
//+------------------------------------------------------------------+
| |||
double sum(double v1, double v2)
| |||
{
| |||
return v1 + v2;
| |||
}
| |||
| |||
int sum(int v1, int v2)
| |||
{
| |||
return v1 + v2;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
double a[2][2] = {{1, 2}, {3, 4}};
| |||
Print("Before Transpose 2x2");
| |||
ArrayPrint(a);
| |||
Transpose(a);
| |||
Print("After Transpose 2x2");
| |||
ArrayPrint(a);
| |||
| |||
double b[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
| |||
Print("Before Transpose 3x3");
| |||
ArrayPrint(b);
| |||
Transpose(b);
| |||
Print("After Transpose 3x3");
| |||
ArrayPrint(b);
| |||
| |||
{
| |||
int i = 0, j = 1;
| |||
SwapByReference(b, i, j);
| |||
}
| |||
| |||
{
| |||
const int i = 0, j = 1;
| |||
SwapByReference(b, i, j);
| |||
}
| |||
| |||
// error
| |||
// sum(1, 3.14); // ambiguous call to overloaded function
| |||
}
|