Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > сортировать массив экземпляров класса


Автор: Экскалупатор 1.5.2011, 22:27
Всем привет. есть такая проблемка.
у меня имеется код на С++
Код

class A
{
    int a;
public:
    A(int q)
    {
        a = q;
    }
    int GetValue()
    {
        return a;
    }
};

у меня есть массив этих классов. вопрос как отсортировать массив этих классов по значению в a, в порядке убывания. понятно что надо как то получить значение а(я так понимаю что для этого нужно вызвать метод GetValue()) и потом по возвращенному значению нужно отсортировать. пока что у меня получилось отсортировать просто массив целых чисел. а вот как быть с массивом объектов классов, в которых есть целые числа я что то не соображу. сортировка должна выполняться в ассемблерной вставке в C++(пишу в VS2008).  smile 
заранее спасибо.

Добавлено @ 22:40
Код

    A ** mas = new A*[10];
    for (int i = 0; i < 10; ++i)
    {
        mas[i] = new A(i);
    }


т.е. допустим у меня есть указатель(mas) на массив объектов класса А, в ассемблерной вставке у меня есть адрес начала массива, но вот как обратиться к конкретному элементу этого массива и вызвав метод получить значение, я что то допереть не могу...

Автор: Экскалупатор 3.5.2011, 00:56
не ужели нету способа вызвать функцию экземпляра класса? и получить из нее значение? очень надо, может есть какой то обходной путь?

Автор: Игорь1024 3.5.2011, 07:54
Интереный вопрос. Но дело в том, как на низком уровне представлены технологии ООП? Я вот не знаю, но может гугл скажет. А почему вам на асме так критично? На плюсах намного быстрее бы получилось (я про время реализации задачи).

Автор: Экскалупатор 3.5.2011, 12:37
критично потому что такое условие задачи(курсовая). я так понимаю код на С++ все равно компилятор как то представляет в машинных командах. вопрос как это сделать самому.

Автор: Игорь1024 3.5.2011, 14:01
Честно говоря я не натыкался на построение ООП'ых структур, но можно самому покопать.
Вот косвенно относящееся к теме http://www.wasm.ru/article.php?article=oop_from_low
Может чем поможет.

Автор: 586 3.5.2011, 22:21
Цитата(Экскалупатор @  1.5.2011,  22:27 Найти цитируемый пост)
понятно что надо как то получить значение а(я так понимаю что для этого нужно вызвать метод GetValue()) и потом по возвращенному значению нужно отсортировать.

Не обязательно, можно обратиться к переменной напрямую.

Метод вызвать из асм вставки тоже  не проблема:
Код
#include <iostream>

class A
{
    int a;
public:
    A(int q)
    {
        a = q;
    }
    int GetValue()
    {
        return a;
    }
};

int main()
{
    A a(22);
    int x = 0;

    __asm {
        lea ecx, a
        call A::GetValue
        mov x, eax
    }
    std::cout << x;
}

Автор: Экскалупатор 4.5.2011, 09:57
586, спасибо чел, ты прямо спас проект. я уже хотел начать как нибудь изголяться и искать дурацкие пути решения...

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

class A
{
public:
    int a;
    A(int q)
    {
        a = q;
    }
    int GetValue()
    {
        return a;
    }
};
void main (void)
{
    setlocale(LC_ALL,"Rus"); /* Для русского языка */
    int len = 10;
    A ** mas = new A*[len];
    for (int i = 0; i < len; ++i)
    {
        mas[i] = new A(i);
        std::cout<<mas[i]->GetValue()<<" ";
    }
    std::cout<<std::endl;
    int b;
    _asm
    {
        mov edi, mas[0] ;в одну строку поместить адрес первого элемента массива у меня не получилось
        mov ecx, [edi]
        mov b, eax
    }
        std::cout<<b<<" ";
    getch();
}


для того что бы перейти к следующему элементу массива, я так понимаю что мне нужно изменять адрес хранящийся в ebi на длину класса в памяти? но как узнать сколько конкретно байт занимает класс? оговорюсь, что в этом примере у меня просто класс заглушка, для того что бы разобраться как сортировать вообще, реальный класс на много больше. так вот как узнать размер класса, сколько он будет занимать в памяти? и я так понимаю что если у меня в классе есть строки то в классе это только указатель на строку, и его длина не меняется с изменением самой строки, а сама строка хранится где то в другом месте?

Автор: 586 4.5.2011, 19:17
Цитата(Экскалупатор @  4.5.2011,  09:57 Найти цитируемый пост)
для того что бы перейти к следующему элементу массива, я так понимаю что мне нужно изменять адрес хранящийся в edi на длину класса в памяти?

В данном случае у тебя массив указателей, и увеличивать edi надо на 4.

Код
class A
{
    int a;
public:
    A(int q)
    {
        a = q;
    }
    int GetValue()
    {
        return a;
    }
};

int main()
{
    A a(22);
    int x = 0, y = 0;

    A **arr = new A*[2];
    arr[0] = new A(11);
    arr[1] = new A(12);

    __asm {
        mov edi, arr
        mov ecx, [edi]
        call A::GetValue
        mov x, eax

        add edi, 4
        mov ecx, [edi]
        call A::GetValue
        mov y, eax
    }

    std::cout << x << ' ' << y;
}


Цитата(Экскалупатор @  4.5.2011,  09:57 Найти цитируемый пост)
оговорюсь, что в этом примере у меня просто класс заглушка, для того что бы разобраться как сортировать вообще, реальный класс на много больше. так вот как узнать размер класса, сколько он будет занимать в памяти?

Достаточно всего лишь поменять указатели местами в массиве.

Цитата(Экскалупатор @  4.5.2011,  09:57 Найти цитируемый пост)
и я так понимаю что если у меня в классе есть строки то в классе это только указатель на строку, и его длина не меняется с изменением самой строки, а сама строка хранится где то в другом месте? 

Да.

Автор: Экскалупатор 4.5.2011, 22:16
586, да, уже догадался, чето сразу тупил только. а как быть если бы у меня был массив не указателей? т.е. был массив экземпляров, а не массив указателей?

Автор: 586 4.5.2011, 22:33
Цитата(Экскалупатор @  4.5.2011,  22:16 Найти цитируемый пост)
а как быть если бы у меня был массив не указателей? т.е. был массив экземпляров, а не массив указателей? 

Размер можно вычислить через sizeof. Если объект не сложный (как к твоём примере), то содержимое этого объекта можно просто скопировать. Сложные объекты можно скопировать с помощью конструктора копирования или перегруженного оператора присвоения.

Автор: Экскалупатор 5.5.2011, 01:24
586, хм. спасибо. попробую разобраться во всем этом...

Автор: Экскалупатор 8.5.2011, 23:13
подскажите еще, как сравнивать значения с плавающей запятой? к примеру типа double?

Автор: 500mhz 9.5.2011, 09:58
какбы для работы с запятой наверно лучше мат. сопроцесор использовать.

Автор: Экскалупатор 9.5.2011, 11:04
как?  smile 
я в асме совсем недавно. хотелось бы живой примерчик, небольшой такой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)