Пишу тут, потому что похоже с такими проблемами сталкиваются только новички. Задача звучит так: считать из файла данные в массив, обработать их и нарисовать. Вопрос как считать из файла? Самый простой способ который мне пришел в голову это воспользоваться 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, так как там будет видно по имени знаковые или без знаковые они.
Знаковый или нет? char
Модератор: Модераторы разделов
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Знаковый или нет? char
1. Всегда можно делать преобразование типов.
2. signed char/unsigned char можно использовать, если нужно точно знаковое/беззнаковое.
2. signed char/unsigned char можно использовать, если нужно точно знаковое/беззнаковое.
-
- Сообщения: 428
- ОС: openSUSE 12.3
Re: Знаковый или нет? char
1. Можно, но код читабельнее не станет.
2. Тоже можно, но тогда можно огрести с проблемами с int, который тоже неопределенного размера, поэтому (u)int8/16/32/64_t мне кажется более удачным выбором теперь.
2. Тоже можно, но тогда можно огрести с проблемами с int, который тоже неопределенного размера, поэтому (u)int8/16/32/64_t мне кажется более удачным выбором теперь.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Знаковый или нет? char
Если нужен конкретный размер типа, то да, stdint.h надо использовать.
-
- Сообщения: 992
- ОС: openSUSE
Re: Знаковый или нет? char
Warlornhor писал(а): ↑28.05.2013 16:03Самый простой способ который мне пришел в голову это воспользоваться fstream и собственно функцией read. Эта функция работает с char.
Эта функция работает с void *
Проверьте endian на десктопе и малине - первое что в голову приходит раз там 16 бит в little и для их конструкции используете сдвиги.
Вообще что касается зкнаковости для себя пришёл к выводу что signed можно использовать тогда и только тогда когда знак для величины имеет физический смысл. Например, байт с ASCII кодом или счётчик итераций такого смысла не имеют. Во всех остальных случаях только unsigned и stdint.h
-
- Сообщения: 428
- ОС: openSUSE 12.3
Re: Знаковый или нет? char
Неа, либо я не умею читать. http://www.cplusplus.com/reference/istream/istream/read/ , а вот http://www.cplusplus.com/reference/cstdio/fread/ с void*. Задача успешно решена, просто написал о возникших трудностях. Еще формат хранения S16_LE в понятиях ALSA это как раз 16-битный знаковый little endian.
-
- Сообщения: 992
- ОС: openSUSE