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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
#1

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

06.12.2012, 16:26. Просмотров 497. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу найти ошибку в коде (C++):

Не могу найти ошибку в коде - C++
Доброго времени суток. Не могу найти ошибку в коде. Задача: Периодическая функция F(x) определена на всей числовой прямой и имеет период...

Не могу найти ошибку в коде - C++
Работаю со связанным списком. нужно удалить из него указанный элемент. Вот код функции удаления: void List::Delete(int Number){ ...

Не могу найти ошибку в коде - C++
Не могу найти ошибку в коде. Помогите плиз. Нужно вычислить приближённое значение суммы этого бесконечного ряда. #include &lt;iostream&gt;...

Не могу найти ошибку в коде - C++
Помогите пожалуйста найти ошибку в коде: #include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; const int n = 8; ...

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

Не могу найти ошибку в коде - C++
Задание такое: в текстовом файле находятся данные про радиусы основ и высот 15 конусов. Нужно записать в другой файл таблицу, которая...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
06.12.2012, 16:27 #2
А можно весь код, пожалуйста???
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
06.12.2012, 16:28 #3
что такое sort? Это std::sort?
И да, весь код, пожалуйста
Как реализован compare?
Почему compare принимает константные ссылки, а не значения?
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
06.12.2012, 16:29 #4
Весь код дай пожалуйста. Я ничего не понимаю. Что за sort??? - stl или твоя ф-ия???
0
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 принимает константные ссылки, а не значения?
Если передавать значения, то они копируются. Я думаю, что копируется весь массив, представляемый ссылкой, а тогда будет утекать время и память на копирование и удаление, или я не прав?
0
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 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 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
06.12.2012, 17:34 #7
Дай абсолютно весь код. Или у тебя "Частично проприетарное программное обеспечение"???
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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 / 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]. Неправильно выразился.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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
110 / 110 / 3
Регистрация: 29.04.2010
Сообщений: 240
06.12.2012, 19:19 #11
Как вариант, объявить функцию compare как static. Ведь она все равно не использует поля класса.
0
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
06.12.2012, 19:53  [ТС] #12
Понял. Через функтор. Буду пробовать.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
06.12.2012, 19:59 #13
kalaider, в действительности будет проще, как сказал PraZuBeR .
0
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
06.12.2012, 20:27  [ТС] #14
Цитата Сообщение от gray_fox Посмотреть сообщение
kalaider, в действительности будет проще, как сказал PraZuBeR .
Это в данном случае. Здесь можно. А в случае, если функция будет использовать нестатические функции-члены класса - уже нельзя.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 20:27
Привет! Вот еще темы с ответами:

Не могу найти ошибку в коде - C++
Привет всем. У меня не получается построить решение. Вот код. #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;clocale&gt; using...

Не могу найти ошибку в коде :( - C++
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; void main () { clrscr(); float eps=0.0001; float x,S,ocr; scanf...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.12.2012, 20:27
Ответ Создать тему
Опции темы

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