Знаковый или нет? char

Модератор: Модераторы разделов

Warlornhor
Сообщения: 428
ОС: openSUSE 12.3

Знаковый или нет? char

Сообщение Warlornhor »

Пишу тут, потому что похоже с такими проблемами сталкиваются только новички. Задача звучит так: считать из файла данные в массив, обработать их и нарисовать. Вопрос как считать из файла? Самый простой способ который мне пришел в голову это воспользоваться fstream и собственно функцией read. Эта функция работает с char. Особенность обработки данных в том что это на самом деле звуковой поток в wav файле в формате S16_LE и приходилось заниматься побитовыми сдвигами и т.п. Написал программку пользуясь fstream, проверил - работает. Казалось бы, компилировал под linux компилятором gcc 4.7 x86 процессор, в чем может быть сложность переноса этой же самой программы на raspberry? Там как бы Debian, стоит gcc 4.6 программа собирается нормально без ошибок, но не работает. Корень зла был в том что оказывается спецификация по типам в С говорит что char может быть как знаковый так и не знаковый по умолчанию зависит от компилятора и платформы. Пришлось переделывать во первых на fread из stdio, во вторых на использование типов из stdint.

Мораль, которую я для себя вынес:
1. Если нужна работа с бинарными файлами, то лучше пользоваться fread, так как там есть возможность считывать данные в массив любого типа
2. Нужно работать с типами целых числе из stdint, так как там будет видно по имени знаковые или без знаковые они.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Знаковый или нет? char

Сообщение NickLion »

1. Всегда можно делать преобразование типов.
2. signed char/unsigned char можно использовать, если нужно точно знаковое/беззнаковое.
Спасибо сказали:
Warlornhor
Сообщения: 428
ОС: openSUSE 12.3

Re: Знаковый или нет? char

Сообщение Warlornhor »

1. Можно, но код читабельнее не станет.
2. Тоже можно, но тогда можно огрести с проблемами с int, который тоже неопределенного размера, поэтому (u)int8/16/32/64_t мне кажется более удачным выбором теперь.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Знаковый или нет? char

Сообщение NickLion »

Если нужен конкретный размер типа, то да, stdint.h надо использовать.
Спасибо сказали:
IMB
Сообщения: 2565
ОС: Debian

Re: Знаковый или нет? char

Сообщение IMB »

man 2 read
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE

Re: Знаковый или нет? char

Сообщение FlySnake »

Warlornhor писал(а):
28.05.2013 16:03
Самый простой способ который мне пришел в голову это воспользоваться fstream и собственно функцией read. Эта функция работает с char.

Эта функция работает с void *
Проверьте endian на десктопе и малине - первое что в голову приходит раз там 16 бит в little и для их конструкции используете сдвиги.

Вообще что касается зкнаковости для себя пришёл к выводу что signed можно использовать тогда и только тогда когда знак для величины имеет физический смысл. Например, байт с ASCII кодом или счётчик итераций такого смысла не имеют. Во всех остальных случаях только unsigned и stdint.h
Спасибо сказали:
Warlornhor
Сообщения: 428
ОС: openSUSE 12.3

Re: Знаковый или нет? char

Сообщение Warlornhor »

Неа, либо я не умею читать. http://www.cplusplus.com/reference/istream/istream/read/ , а вот http://www.cplusplus.com/reference/cstdio/fread/ с void*. Задача успешно решена, просто написал о возникших трудностях. Еще формат хранения S16_LE в понятиях ALSA это как раз 16-битный знаковый little endian.
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE

Re: Знаковый или нет? char

Сообщение FlySnake »

А, точно, попутал с вызовом read о котором писал IMB
Спасибо сказали: