Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировать массив экземпляров класса 
:(
    Опции темы
Экскалупатор
Дата 1.5.2011, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



Всем привет. есть такая проблемка.
у меня имеется код на С++
Код

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) на массив объектов класса А, в ассемблерной вставке у меня есть адрес начала массива, но вот как обратиться к конкретному элементу этого массива и вызвав метод получить значение, я что то допереть не могу...

Это сообщение отредактировал(а) Экскалупатор - 1.5.2011, 22:41
PM MAIL ICQ   Вверх
Экскалупатор
Дата 3.5.2011, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



не ужели нету способа вызвать функцию экземпляра класса? и получить из нее значение? очень надо, может есть какой то обходной путь?
PM MAIL ICQ   Вверх
Игорь1024
Дата 3.5.2011, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

Репутация: нет
Всего: нет



Интереный вопрос. Но дело в том, как на низком уровне представлены технологии ООП? Я вот не знаю, но может гугл скажет. А почему вам на асме так критично? На плюсах намного быстрее бы получилось (я про время реализации задачи).
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
Экскалупатор
Дата 3.5.2011, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



критично потому что такое условие задачи(курсовая). я так понимаю код на С++ все равно компилятор как то представляет в машинных командах. вопрос как это сделать самому.
PM MAIL ICQ   Вверх
Игорь1024
Дата 3.5.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

Репутация: нет
Всего: нет



Честно говоря я не натыкался на построение ООП'ых структур, но можно самому покопать.
Вот косвенно относящееся к теме http://www.wasm.ru/article.php?article=oop_from_low
Может чем поможет.
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
586
Дата 3.5.2011, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата(Экскалупатор @  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;
}

PM   Вверх
Экскалупатор
Дата 4.5.2011, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



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 на длину класса в памяти? но как узнать сколько конкретно байт занимает класс? оговорюсь, что в этом примере у меня просто класс заглушка, для того что бы разобраться как сортировать вообще, реальный класс на много больше. так вот как узнать размер класса, сколько он будет занимать в памяти? и я так понимаю что если у меня в классе есть строки то в классе это только указатель на строку, и его длина не меняется с изменением самой строки, а сама строка хранится где то в другом месте?
PM MAIL ICQ   Вверх
586
Дата 4.5.2011, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата(Экскалупатор @  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 Найти цитируемый пост)
и я так понимаю что если у меня в классе есть строки то в классе это только указатель на строку, и его длина не меняется с изменением самой строки, а сама строка хранится где то в другом месте? 

Да.
PM   Вверх
Экскалупатор
Дата 4.5.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



586, да, уже догадался, чето сразу тупил только. а как быть если бы у меня был массив не указателей? т.е. был массив экземпляров, а не массив указателей?
PM MAIL ICQ   Вверх
586
Дата 4.5.2011, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



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

Размер можно вычислить через sizeof. Если объект не сложный (как к твоём примере), то содержимое этого объекта можно просто скопировать. Сложные объекты можно скопировать с помощью конструктора копирования или перегруженного оператора присвоения.
PM   Вверх
Экскалупатор
Дата 5.5.2011, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



586, хм. спасибо. попробую разобраться во всем этом...
PM MAIL ICQ   Вверх
Экскалупатор
Дата 8.5.2011, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



подскажите еще, как сравнивать значения с плавающей запятой? к примеру типа double?
PM MAIL ICQ   Вверх
500mhz
Дата 9.5.2011, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



какбы для работы с запятой наверно лучше мат. сопроцесор использовать.


--------------------

PM MAIL ICQ   Вверх
Экскалупатор
Дата 9.5.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



как?  smile 
я в асме совсем недавно. хотелось бы живой примерчик, небольшой такой.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.