Форум программистов, компьютерный форум CyberForum.ru

Не могу найти ошибку в коде - C++

Восстановить пароль Регистрация
 
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
06.12.2012, 16:26     Не могу найти ошибку в коде #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class genetic {
        typedef bool* chr;
        typedef vector<chr> vals;
 
        vals population;
 
        bool compare(const chr &, const chr &);
      public:
        int doGenetic();
};
int genetic::doGenetic() {
        sort(population.begin(), population.end(), compare);
}
//тело функции compare
Компиляторы ругаются. Visual C++ пишет, что невозможно преобразовать функцию "bool compare" в "bool (__thiscall*) compare". GCC - нечто подобное. Что это значит и как с этим справиться?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 16:26     Не могу найти ошибку в коде
Посмотрите здесь:

Не могу найти ошибку в коде C++
C++ Не могу найти ошибку в коде :(
C++ Не могу найти ошибку в коде
Не могу найти ошибку в коде C++
C++ Не могу найти ошибку в коде
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
379 / 225 / 2
Регистрация: 17.12.2011
Сообщений: 816
Записей в блоге: 1
06.12.2012, 16:27     Не могу найти ошибку в коде #2
А можно весь код, пожалуйста???
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
06.12.2012, 16:28     Не могу найти ошибку в коде #3
что такое sort? Это std::sort?
И да, весь код, пожалуйста
Как реализован compare?
Почему compare принимает константные ссылки, а не значения?
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
379 / 225 / 2
Регистрация: 17.12.2011
Сообщений: 816
Записей в блоге: 1
06.12.2012, 16:29     Не могу найти ошибку в коде #4
Весь код дай пожалуйста. Я ничего не понимаю. Что за sort??? - stl или твоя ф-ия???
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
06.12.2012, 17:17  [ТС]     Не могу найти ошибку в коде #5
Извиняюсь, выдрал часть кода без include.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <algorithm>
#include <сstring>
#include <vector>
 
class genetic {
    typedef bool* chr;
    typedef vector<chr> vals;
 
    vals population;
    int n;
 
    bool compare(const chr &, const chr &);
  public:
    int doGenetic();
};
 
int genetic::doGenetic() {
    sort(population.begin(), population.end(), compare);
}
 
bool genetic::compare(const chr &chr1, const chr &chr2) {
    return memcmp(chr1, chr2, n * sizeof(chr));
}
n - число элементов в массивах в векторе (chr - это bool[n]).

Почему compare принимает константные ссылки, а не значения?
Если передавать значения, то они копируются. Я думаю, что копируется весь массив, представляемый ссылкой, а тогда будет утекать время и память на копирование и удаление, или я не прав?
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
06.12.2012, 17:32     Не могу найти ошибку в коде #6
пф, легче не стало. sort - это что?
sort(population.begin(), population.end(), compare);
compare должно принимать два константных значения. В этом случае она ничего не принимает...
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
379 / 225 / 2
Регистрация: 17.12.2011
Сообщений: 816
Записей в блоге: 1
06.12.2012, 17:34     Не могу найти ошибку в коде #7
Дай абсолютно весь код. Или у тебя "Частично проприетарное программное обеспечение"???
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.12.2012, 17:43     Не могу найти ошибку в коде #8
Цитата Сообщение от kalaider Посмотреть сообщение
chr - это bool[n]
Нет, это
Цитата Сообщение от kalaider Посмотреть сообщение
bool*
Цитата Сообщение от kalaider Посмотреть сообщение
Если передавать значения, то они копируются.
У тебя chr - указатель на bool, т.е. const chr & - это const bool* &. Смысла передавать ссылку на константный указатель вместо указателя мало.

Добавлено через 8 минут
Цитата Сообщение от kalaider Посмотреть сообщение
sort(population.begin(), population.end(), compare);
Вот это кстати не скомпилируется, потому что compare - метод класса и неявно, кроме остальных аргументов, принимает ещё и указатель на объект класса genetic.
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
06.12.2012, 18:52  [ТС]     Не могу найти ошибку в коде #9
chr - указатель на bool
Т.е, копируется только указатель. Понял. Значит ссылки уберу.

sort(population.begin(), population.end(), compare);
Вот это кстати не скомпилируется, потому что compare - метод класса и неявно, кроме остальных аргументов, принимает ещё и указатель на объект класса genetic.
А как тогда нужно передавать ссылку на функцию в метод STL sort? this->compare(const chr &, const chr &)?

chr - это bool[n]
Я имел в виду, что по данному указателю располагается массив bool[n]. Неправильно выразился.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.12.2012, 19:14     Не могу найти ошибку в коде #10
Если есть bind, то
C++
1
2
3
4
5
6
#include <functional>
// ...
int genetic::doGenetic() {
    using namespace std::placeholders;
    sort(population.begin(), population.end(), std::bind(&genetic::compare, this, _1, _2));
}
Иначе можно вручную добавить функтор как посредника, примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct genetic_compare_adaptor {
 
   explicit genetic_compare_adaptor(genetic const* object) : object(object) {}
 
   bool operator ()(bool const* lhs, bool const* rhs) const {
      return object->compare(lhs, rhs) < 0;
   }
 
private:
   genetic const* object;
};
// ...
int genetic::doGenetic() {
   std::sort(population.begin(), population.end(), genetic_compare_adaptor(this));
}
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
06.12.2012, 19:19     Не могу найти ошибку в коде #11
Как вариант, объявить функцию compare как static. Ведь она все равно не использует поля класса.
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
06.12.2012, 19:53  [ТС]     Не могу найти ошибку в коде #12
Понял. Через функтор. Буду пробовать.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.12.2012, 19:59     Не могу найти ошибку в коде #13
kalaider, в действительности будет проще, как сказал PraZuBeR .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 20:27     Не могу найти ошибку в коде
Еще ссылки по теме:

Не могу найти ошибку в коде C++
Не могу найти ошибку в коде C++
C++ Не могу найти ошибку в коде

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
06.12.2012, 20:27  [ТС]     Не могу найти ошибку в коде #14
Цитата Сообщение от gray_fox Посмотреть сообщение
kalaider, в действительности будет проще, как сказал PraZuBeR .
Это в данном случае. Здесь можно. А в случае, если функция будет использовать нестатические функции-члены класса - уже нельзя.
Yandex
Объявления
06.12.2012, 20:27     Не могу найти ошибку в коде
Ответ Создать тему

Метки
коде, могу, Найти
Опции темы

Текущее время: 13:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru