![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ANTON_AL |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Доброго дня!
Есть картинка, представленная в виде двумерного массива. Эта картинка играет роль маски в операции по обработке изображений. Если значение пикселя == 0, следовательно - элемент не учитывается, иначе, если > 0 - то учитывается. Возникает задача подсчитать элементы маски, которые > 0. Вот код
Казалось бы, ничего подозрительного, но выражение
. . . работает не так, как хотелось бы. Необходимо, чтобы функция была именно такой, как представлена, т.е., чтобы выполнялось поэлементное сравнение. Как видно из кода, указатель на BYTE преобразуется в указатель на bool, что и является причиной ошибки. Вот в этом и вопрос - как написать универсальную функцию, которая подсчитывает количество элементов с указанным значением ? Основное требование: если в неё подать массив типа BYTE, то она должна подсчитать количество ненулевых значений ( с шаблонным параметром - bool ) Это сообщение отредактировал(а) ANTON_AL - 16.7.2008, 13:27 |
||||
|
|||||
| Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Я так понял, функция написана в предположении, что bool ~ 1 биту, это не так, размеры всех встроенных типов кратны char. Чтобы анализировать битовое представление, нужно использовать арифметические операции % и /.
-------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
так ты приводишь указатель, 255 от этого не станет равным true, который в свою очередь равен 1(скорее всего) |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
в функции count, вместо переменной step, нужно использовать sizeof(T)
а вместо
правильнее будет написать:
Добавлено через 57 секунд в общем параметры step и pitch являются лишними |
||||
|
|||||
| Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Да что ж такое, так и не начал стандарт читать:
ISO/IEC 14882:1998, 4.12. -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
| ANTON_AL |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Lazin
Нет, параметр step требуется для обработки отдельного канала изображения (чтобы шагать через 3 байта). Вообще, вопрос у меня не в этом. Не смотрите на pitch и step. . . Ulysses4j,
нет, не было такого предположения. Я знаю, сколько занимает каждый тип данных. Если прогнать программу в отладчике, то он будет показывать "верные" значения. ( см. приложение). Тут причина в том, что если берем значение a по указателю
то не происходит конверсии в тип bool. ( это и понятно ), происходит лишь интрерпретация куска памяти как bool. Операция == выполняется побитово. Из за этого и получается
А вообще, на 90 % уверен, что такая задача не решаема универсальным способом. Это сообщение отредактировал(а) ANTON_AL - 16.7.2008, 14:33 Присоединённый файл ( Кол-во скачиваний: 10 )
capture.JPG 157,82 Kb |
||||||||
|
|||||||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
вообще-то указателя на бит не бывает а что-бы анализировать битовое представление нужно использовать битовые операции >> << & | ~ |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
vs2008 выводятся 3 еденицы ни о чем Вам не говорит? Прежде чем чем то тыкать, проверяем |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ANTON_AL, на скриншоте вызов count<bool> или count<BYTE>?
|
|||
|
||||
| Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Дело не в can be, а в том что я перепутал преобразования (bool*)(·) и (bool)(·). Если вам не нравится, когда вам тыкают, прошу прощения, впредь буду более бережным к вашим чувствам.
А где я сказал, что бывают указатели на бит? Я сказал, что смотря на функцию складывается впечатление, что человек хотел проходить указателем по битам.
Можно эти, можно арифметические, как я сказал. Арифметические намного легче воспринимаются, имхо. Хотя от задачи тоже зависит. -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
count<bool> |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
программа работать не будет, и это правильно, ибо у типа bool есть только 2 значения: true и false. всё остальное - кривизна. никакие 0, 1, 255, -999, 1000000 и прочие чудеса к bool неприминимы.
выход - написать отдельную шаблонную спецификацию для bool T tmp = pSrc[y*pitch + x * step]; bool a = static_cast<bool>(tmp != 0); кому же такая индексация по указателю приведет к UB при использовани двумерного динамического массива (BYTE**). Это сообщение отредактировал(а) Rififi - 16.7.2008, 15:01 |
|||
|
||||
| ANTON_AL |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Rififi, да, я к этому и сколняюсь.
Я во втором ответе приводил пример, который демонстрирует интерпретацию памяти и побитовые свойства ==.
. . . но небольшая модификация меня смутила:
Ведь, наскольно я понимаю, выражение
даёт уже приведение значения к типу bool, а не интерпретацию памяти. Но, на практике - это не так. Что в таком случае происходит?? Это сообщение отредактировал(а) ANTON_AL - 16.7.2008, 15:29 |
||||||
|
|||||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
очевидно у компилятора другие соображения. если посмотреть на ассемблерный листиг условия, то он выглядит так: [nocode] if ( (bool)*(bool*)&a == (bool)*(bool*)&b ) 0055C18C movzx eax,byte ptr [a] 0055C190 movzx ecx,byte ptr 0055C194 cmp eax,ecx [/nocode] то есть происходит именно [B]интерпретация памяти, даже несмотря на явный кастинг Добавлено через 5 минут и 54 секунды PS. как тут бишь отменить парсинг BB-кодов? что-то не нашел... ну и хрен с ними (: Это сообщение отредактировал(а) Rififi - 16.7.2008, 15:58 |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
для этого нужно перегрузить функцию сравнения, например так :
естественно cmp_bool можно заменить на cmp<T> со специализацией под bool и дабавить ее по умолчанию в список параметров для count Это сообщение отредактировал(а) mes - 17.7.2008, 00:22 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |