Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Re: Вопросы по С/С++ (СИ)

Чт янв 26, 2017 14:38:55

Код:
*((uint8_t*)&wav_header)
*((uint8_t*)&wav_header + 5)
*((uint8_t*)&wav_header + 30)

Re: Вопросы по С/С++ (СИ)

Чт янв 26, 2017 17:19:51

WiseLord, насколько я понимаю то wav_header является сам по себе указателем на нулевой байт структуры ?
как правильно понимать (uint8_t*)&wav_header) ? :dont_know:

Re: Вопросы по С/С++ (СИ)

Чт янв 26, 2017 17:42:37

wav_header - структура
&wav_header - указатель на неё
(uint8_t*)&wav_header - приводим указатель к типу (uint8_t*)
*(uint8_t*)&wav_header - читаем по этому указателю число типа uint8_t
*((uint8_t*)&wav_header + 5 ) - читаем по (этому указателю + 5 байтов смещение) число типа uint8_t

Re: Вопросы по С/С++ (СИ)

Чт янв 26, 2017 18:42:12

FreshMan писал(а):как обратится, считать данные, к примеру, с 0 или 5 или 30 байта данной структуры ?
нахрена иметь структуру, чтобы потом обращаться к ее данным мимо поименованных полей?! ну берите тогда сырой массив, и обращайтесь, если с указателями траблы
или при помощи union совместите массив со структурой и ковыряйтесь там хоть так, хоть эдак
Код:
typedef struct{
   char chunkId[4];
   char format[4];
   char subchunk1Id[4];
   unsigned short audioFormat;
   unsigned short numChannels;
   unsigned long sampleRate;
   unsigned long byteRate;
   unsigned short blockAlign;
   unsigned short bitsPerSample;
   char subchunk2Id[4];
   unsigned long subchunk2Size;
}HEADER;

typedef union{
   unsigned char raw_bytes[sizeof(HEADER)];
   HEADER struct_data;
} COMMON_HEADER;

COMMON_HEADER wav_header;

wav_hader.raw_bytes[15] = 0; // обнуляем 15-й байт в структуре, наплевав на ее поля
wav_header.struc_data.audioFormat = 12; // а теперь делаем бяку через поле

Re: Вопросы по С/С++ (СИ)

Чт янв 26, 2017 18:53:03

ARV писал(а):нахрена иметь структуру, чтобы потом обращаться к ее данным мимо поименованных полей?!

требуется значение полей структуры вывести на LCD 16х2
как я понимаю надо последовательно байт за байтом превращать в строку и выводить на экран
если знаете что-то попроще - поправте

Re: Вопросы по С/С++ (СИ)

Чт янв 26, 2017 18:59:38

ну так и выводите поля структуры! нафига побайтно-то?
Код:
sprintf(str, "SampleRate = %lu", wav_header.SampleRate);

Re: Вопросы по С/С++ (СИ)

Пт янв 27, 2017 09:27:25

ARV писал(а):ну так и выводите поля структуры! нафига побайтно-то?

согласен, но
поля структуры имеют разный тип
и если сделать так как вы советуете
Код:
sprintf(str, "SampleRate = %lu", wav_header.SampleRate);

то компилятор начинает ругатся что тип массива str не соответствует выводимому полю структуры
под кажое поле надо свою выводную строку создавать ?

Re: Вопросы по С/С++ (СИ)

Пт янв 27, 2017 09:42:54

FreshMan писал(а):компилятор начинает ругатся что тип массива str не соответствует выводимому полю структуры
str - это массив символов, т.е. строка. тип выводимого поля должен соответствовать формату вывода, но и только! компилятор не будет ругаться.
главное - в str должно быть достаточно места, чтобы влезло полное представление соответствующего числа в виде символов, т.е. для unsigned long не менее 11 байтов.

FreshMan писал(а):под кажое поле надо свою выводную строку создавать ?
я понятия не имею, как вы планируете выводить на ЖКИ 2х16 кучу полей из заголовка WAV-файла... и зачем это вообще делать... вы правы в одном: каждое поле придется выводить отдельным форматом, соответствующим этому полю, а вот строка-результат, которая будет хранить символьное представление полей, может быть одна и та же.

чтобы меньше ломать голову с выводом на ЖКИ, раз уж вы решили это делать при помощи стандартных функций вывода, я рекомендую воспользоваться моими рекомендациями и работать примерно так:
Код:
printf_P(PSTR("поле1=%d\nполе2=%d"), поле1, поле2);
не забывая вовремя ставить курсор в первую позицию первой строки.

Re: Вопросы по С/С++ (СИ)

Пт янв 27, 2017 09:43:09

Можно просто привести к тому типу, что в формате заявлен:
Код:
sprintf(str, "SampleRate = %lu", (unsigned long)wav_header.SampleRate);

Re: Вопросы по С/С++ (СИ)

Пт янв 27, 2017 09:52:31

согласет
вот только char str[];
а поля структуры имеют тип намного больше char

Re: Вопросы по С/С++ (СИ)

Пт янв 27, 2017 09:54:50

А какая разница? Какого бы типа ни было поле, приведя его к long, а потом отформатировав sprintf-ом, получите в любом случае строковое представление этого поля.

Re: Вопросы по С/С++ (СИ)

Пт янв 27, 2017 10:08:36

FreshMan писал(а):вот только char str[];
так вообще нельзя! str должен быть заведомо бОльшего размера, чем самая длинная строка, формируемая sprintf-ом!

т.е. для sprintf(str, "SampleRate = %lu", (unsigned long)wav_header.SampleRate); должно быть char str[24];

Re: Вопросы по С/С++ (СИ)

Пт янв 27, 2017 10:18:53

понемного начинает приходить понимание :)
ARV писал(а): должно быть char str[24];

а почему компилятор выдает предуприждение когда я делаю безразмерный массив ?
где-то читал что он в таком случае должен сам определить его размер

Re: Вопросы по С/С++ (СИ)

Пт янв 27, 2017 10:31:41

FreshMan писал(а):где-то читал что он в таком случае должен сам определить его размер
я думаю, если вы вспомните, где это читали и найдете ту книжку, ее надо будет бросить в печку - компилятор никому ничего не должен.

массив "пустого размера" - это обычный УКАЗАТЕЛЬ. память, на которую он будет указывать - это проблема программиста.

Re: Вопросы по С/С++ (СИ)

Пт янв 27, 2017 11:21:44

FreshMan писал(а):а почему компилятор выдает предуприждение когда я делаю безразмерный массив ?

Здесь не так радостно принимают людей как их деньги. © Общаясь с программируюшими на их любимые темы говорите сразу кодом. В противном случае, до наработки вами общей с ними терминологии, будете терять время на выяснение того, что же вы имели ввиду, и того что вы сказали им на самом деле. :) Иными словами: -"Какой код, и что сказал компилятор?"
FreshMan писал(а):где-то читал что он в таком случае должен сам определить его размер

Если имелись ввиду конструкции типа:
Код:
char str[] = "фгчтрчгтр";

размер массива будет исчислен с учётом \0 терминатора. Если использовать его как целевой для sprintf, нужно быть уверенным, что его размера хватит, чтобы вместить результат с учётом терминатора. В противном случае переменные, имевшие несчастье быть объявленными за str будут перезаписаны "мусором" без их на то желания. ;)

Re: Вопросы по С/С++ (СИ)

Пн фев 27, 2017 17:40:05

Нужно загрузить картинку с флешки, преобразовать контур и сохранить обратно. Лабораторка такая у сестры. В визуал студии с помощью библиотеки CImg мы научились преобразовывать контур :)
Подключаем флешку по этой инстструкции (используя модуль FatFs) https://nagits.wordpress.com/2010/10/18/avr_sd/
И вообщем такие вопросы:
1) Возможно ли подключить CImg к проекту Atmel Studio?
2) Как загрузить bmp картинку в микроконтроллер atmega32?
3) Если 1 или 2 никак не получится сделать (или не целесообразно), то как можно решить задачу по-другому?

Re: Вопросы по С/С++ (СИ)

Вт фев 28, 2017 08:57:10

vitalekmail писал(а):Нужно загрузить картинку с флешки,

1. При большом желании да. Надо учесть отличия компиляторов. При необходимости внести изменения в коды библиотеки.
2. Подключить к проекту для атмеги можно преобразованные файлы через bmp2c или bin2c. Если картинка на внешней флешке, то побайтовым считыванием картинки в ОЗУ контроллера. Затем делайте с картинкой что хотите если вообще памяти контроллера для хранения хватит. Но я бы взял для графики хотя бы атмега64 с внешней микросхемой ОЗУ.
3. CImg похоже для компьютеров без дефицита памяти и производительности. При необходимости можно подсмотреть реализацию нужного алгоритма и написать своё с учётом ресурсов системы.

Re: Вопросы по С/С++ (СИ)

Пт мар 03, 2017 11:18:15

Подскажите, можно ли про инициализировать массив не по порядку, а выборочно указать элементы инициализации
примерно как в структуре
.sn = {255, 255, 0, 0},
.gw = {192, 168, 0, 0},

Только для двухмерного массива
Код:
flash const long int array[2][7]={
   .[0]={123,1,2,3,......},
   .[1]={123,1,2,3,......}
};

На такое компилятор ругается.

Re: Вопросы по С/С++ (СИ)

Пт мар 03, 2017 11:54:23

pokk писал(а):На такое компилятор ругается.

Код:
   flash const long int array[2][7] = {
         { 123, 1, 2, 3, },
         { 123, 1, 2, 3, }
   };

Re: Вопросы по С/С++ (СИ)

Пт мар 03, 2017 16:38:34

Apparatchik, это и так понятно. акцент был
можно ли про инициализировать массив не по порядку


flash const long int array[2][7] = {
{ 123, 1, 2, 3, }, // Эта первая строка
{ 123, 1, 2, 3, } // Это нулевая строка
};
Ответить