Цитата:
Сообщение от
AndyD
Да и сравнивать надо значения одно типа (или сравниваемых, типа int и real). Потому как сказать, что больше или меньше 2 или 'Sumit Loya' невозможно. Да и что даст такое сравнение - то же непонятно.
вот правильный пример - обратите внимание на типы значений в окошках, которые показывают содержимое контейнера.
X++:
static void sortContainer(Args _args)
{
container con = [5,1,2,'Sumit Loya',9, 'Ashish singh', NoYes::No];
int len = conlen(con); // вычисляем только один раз!
int i;
int j;
// принимаем значения любого типа
// однако сравниваем как строки!
int cmp(anytype a, anytype b)
{
// Здесь конечно надо бы возвращать три значения 1; 0; -1
// но раз уж используем метод пузырька,
// упрощаем не сильно заморачиваясь по поводу производительности
// главное - методика сравнение двух anytype значений
return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1; // дает runtime error если внутри контейнера есть контейнер!
// дает разные результаты, если выполняется в среде с разными языками
}
// меняем местами значения внутри контейнера
void swapIf(int _i, int _j)
{
anytype a = conpeek(con, _i); // значения с типом anytype примут тип при первой инициализации
anytype b = conpeek(con, _j); // повторные присваивания уже не изменят тип переменной anytype,
// поэтому обмен приходится делать в локальном методе
if( cmp(a, b) > 0 )
{
con = conpoke(con, _j, a);
con = conpoke(con, _i, b);
}
}
;
conview(Con,"con: before");
// Sort the container
for (i = 1; i < len; ++i)
{
for (j = i + 1; j <= len; ++j)
{
swapif(i, j);
}
}
conview(Con,"con: after");
}