C против C ++ - PullRequest
       5

C против C ++

3 голосов
/ 09 июня 2010

Итак, мне нужно написать программу, которая будет выполнять итерации по изображению и записывать местоположения пикселей, соответствующие каждому цветному пикселю, который появляется в нем. Например, учитывая

http://www.socuteurl.com/fishywishykissy

Мне нужно найти координаты всех желтых, фиолетовых, темно-розовых и т. Д. Пикселей.

В C ++ я бы использовал для этого хеш-таблицу. Я бы перебирал изображение, проверял значение каждого пикселя, просматривал это значение и либо добавлял к вектору координат пикселей, если он был найден, либо добавлял новую запись в таблицу, если значение еще не было там.

Проблема в том, что мне может понадобиться написать эту программу на чистом C, а не на C ++. Как бы я сделал это в C? Я чувствую, что реализация хеш-таблицы была бы довольно неприятной и подверженной ошибкам: я должен избегать этого?

Я довольно неопытен в C и у меня достаточно опыта работы с C ++, если это имеет значение.

Спасибо.

Ответы [ 7 ]

6 голосов
/ 09 июня 2010

Нет алгоритма / структуры данных, которые вы можете реализовать в C ++, которые вы не можете реализовать в C. Иногда это возможно более элегантно в C ++, но это никогда не невозможно в C.

Вот несколько реализаций C-хеш-таблицы: http://www.google.ca/search?q=hash+table+c

Вы также можете быть заинтересованы в этой ООП в C против C ++: http://www.eventhelix.com/realtimemantra/basics/object_oriented_programming_in_c.htm

В целом, если вы используете классы в C ++, вы можете использовать структуры + функции в C.

6 голосов
/ 09 июня 2010

Вот альтернативный алгоритм, который использует немного дополнительной памяти, но прост в реализации.

Просмотрите изображение и для каждого пикселя добавьте его в новый массив вместе с его координатами. Если значение пикселя равно (R, G, B), поместите значения (R, G, B, X, Y) в новый массив.

Используйте qsort для сортировки нового массива. Теперь все пиксели одного цвета будут сгруппированы.

1 голос
/ 09 июня 2010

Вы можете рассмотреть возможность использования uthash , что позволит вам хранить структуры в хэш-таблице. Затем просто определите struct для хранения информации о числе пикселей / числе, и все готово.

Или вы можете бросить свой собственный HashTable на C, хотя это будет в основном как учебное упражнение.

0 голосов
/ 09 июня 2010

Попробуйте это.

Выделите второе изображение, где каждый элемент имеет размер одной координаты. Выделите другой массив с размером максимального количества цветов. Инициализируйте этот массив с неверными координатами (скажем, (-1, -1)). Итерация по изображению. Для каждого найденного цвета найдите соответствующую запись в массиве. Сохраните значение в массиве в соответствующей позиции на втором изображении и сохраните текущую координату в этом месте в массиве.

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

(Не знаю, имеет ли мое объяснение смысл, жалуйтесь, если нет).

0 голосов
/ 09 июня 2010

Ответы на этот вопрос SO имеют указатели на множество опций для контейнерных библиотек в C, которые могут оказаться полезными:

0 голосов
/ 09 июня 2010

Для стандартных функций проверьте файл заголовка search.h и предоставляемые им функции.Они могут быть громоздкими в использовании, но иногда все же полезны.

В частности: man hsearch и man tsearch

0 голосов
/ 09 июня 2010

Вы должны быть в состоянии найти хорошо протестированные реализации хеш-таблиц и связанных списков для C.

Просто из любопытства, зачем вам использовать этот язык?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...