С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
kalaider
0 / 0 / 1
Регистрация: 24.10.2012
Сообщений: 31
1

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

06.12.2012, 16:26. Просмотров 534. Ответов 13

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 - нечто подобное. Что это значит и как с этим справиться?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 16:26
Ответы с готовыми решениями:

Не могу найти ошибку в коде
Привет всем. У меня не получается построить решение. Вот код. #include...

Не могу найти ошибку в коде
Работаю со связанным списком. нужно удалить из него указанный элемент. Вот код...

Не могу найти ошибку в коде
Здравствуйте еще раз! У меня возникла проблема: В написанном мною коде какая то...

Не могу найти ошибку в коде
Не могу найти ошибку в коде. Помогите плиз. Нужно вычислить приближённое...

Не могу найти ошибку в коде
Добрый вечер. Собственно, в универе дали задачу Программу я сделал,...

13
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
Завершенные тесты: 1
06.12.2012, 16:27 2
А можно весь код, пожалуйста???
0
Kuzia domovenok
2421 / 2151 / 525
Регистрация: 25.03.2012
Сообщений: 7,756
Записей в блоге: 1
06.12.2012, 16:28 3
что такое sort? Это std::sort?
И да, весь код, пожалуйста
Как реализован compare?
Почему compare принимает константные ссылки, а не значения?
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
Завершенные тесты: 1
06.12.2012, 16:29 4
Весь код дай пожалуйста. Я ничего не понимаю. Что за sort??? - stl или твоя ф-ия???
0
kalaider
0 / 0 / 1
Регистрация: 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 принимает константные ссылки, а не значения?
Если передавать значения, то они копируются. Я думаю, что копируется весь массив, представляемый ссылкой, а тогда будет утекать время и память на копирование и удаление, или я не прав?
0
Afflicted
Обитатель форума
199 / 182 / 54
Регистрация: 28.10.2012
Сообщений: 543
06.12.2012, 17:32 6
пф, легче не стало. sort - это что?
sort(population.begin(), population.end(), compare);
compare должно принимать два константных значения. В этом случае она ничего не принимает...
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
Завершенные тесты: 1
06.12.2012, 17:34 7
Дай абсолютно весь код. Или у тебя "Частично проприетарное программное обеспечение"???
0
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 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.
0
kalaider
0 / 0 / 1
Регистрация: 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]. Неправильно выразился.
0
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 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));
}
0
prazuber
111 / 111 / 13
Регистрация: 29.04.2010
Сообщений: 240
06.12.2012, 19:19 11
Как вариант, объявить функцию compare как static. Ведь она все равно не использует поля класса.
0
kalaider
0 / 0 / 1
Регистрация: 24.10.2012
Сообщений: 31
06.12.2012, 19:53  [ТС] 12
Понял. Через функтор. Буду пробовать.
0
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
06.12.2012, 19:59 13
kalaider, в действительности будет проще, как сказал PraZuBeR .
0
kalaider
0 / 0 / 1
Регистрация: 24.10.2012
Сообщений: 31
06.12.2012, 20:27  [ТС] 14
Цитата Сообщение от gray_fox Посмотреть сообщение
kalaider, в действительности будет проще, как сказал PraZuBeR .
Это в данном случае. Здесь можно. А в случае, если функция будет использовать нестатические функции-члены класса - уже нельзя.
0
06.12.2012, 20:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 20:27

Не могу найти ошибку в коде
Помогите пожалуйста найти ошибку в коде: #include &lt;fstream&gt; #include...

Не могу найти ошибку в коде
Игра &quot;БлэкДжек&quot; Ошибка - &quot;Прекращена работ программы&quot;. С чем это связано - не...

Не могу найти ошибку в коде
Доброго времени суток. Не могу найти ошибку в коде. Задача: Периодическая...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru