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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Код: Выделить всё

*((uint8_t*)&wav_header)
*((uint8_t*)&wav_header + 5)
*((uint8_t*)&wav_header + 30)
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

WiseLord, насколько я понимаю то wav_header является сам по себе указателем на нулевой байт структуры ?
как правильно понимать (uint8_t*)&wav_header) ? :dont_know:
Tell Me The Truth
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

wav_header - структура
&wav_header - указатель на неё
(uint8_t*)&wav_header - приводим указатель к типу (uint8_t*)
*(uint8_t*)&wav_header - читаем по этому указателю число типа uint8_t
*((uint8_t*)&wav_header + 5 ) - читаем по (этому указателю + 5 байтов смещение) число типа uint8_t
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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; // а теперь делаем бяку через поле
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

ARV писал(а):нахрена иметь структуру, чтобы потом обращаться к ее данным мимо поименованных полей?!
требуется значение полей структуры вывести на LCD 16х2
как я понимаю надо последовательно байт за байтом превращать в строку и выводить на экран
если знаете что-то попроще - поправте
Tell Me The Truth
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Код: Выделить всё

sprintf(str, "SampleRate = %lu", wav_header.SampleRate);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

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

Код: Выделить всё

sprintf(str, "SampleRate = %lu", wav_header.SampleRate);
то компилятор начинает ругатся что тип массива str не соответствует выводимому полю структуры
под кажое поле надо свою выводную строку создавать ?
Tell Me The Truth
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

чтобы меньше ломать голову с выводом на ЖКИ, раз уж вы решили это делать при помощи стандартных функций вывода, я рекомендую воспользоваться моими рекомендациями и работать примерно так:

Код: Выделить всё

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

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Можно просто привести к тому типу, что в формате заявлен:

Код: Выделить всё

sprintf(str, "SampleRate = %lu", (unsigned long)wav_header.SampleRate);
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

согласет
вот только char str[];
а поля структуры имеют тип намного больше char
Tell Me The Truth
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А какая разница? Какого бы типа ни было поле, приведя его к long, а потом отформатировав sprintf-ом, получите в любом случае строковое представление этого поля.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

т.е. для sprintf(str, "SampleRate = %lu", (unsigned long)wav_header.SampleRate); должно быть char str[24];
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

понемного начинает приходить понимание :)
ARV писал(а): должно быть char str[24];
а почему компилятор выдает предуприждение когда я делаю безразмерный массив ?
где-то читал что он в таком случае должен сам определить его размер
Tell Me The Truth
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

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

Код: Выделить всё

char str[] = "фгчтрчгтр";
размер массива будет исчислен с учётом \0 терминатора. Если использовать его как целевой для sprintf, нужно быть уверенным, что его размера хватит, чтобы вместить результат с учётом терминатора. В противном случае переменные, имевшие несчастье быть объявленными за str будут перезаписаны "мусором" без их на то желания. ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
vitalekmail
Родился
Сообщения: 6
Зарегистрирован: Вс янв 29, 2017 20:16:32

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

Сообщение vitalekmail »

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

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

Сообщение uk8amk »

vitalekmail писал(а):Нужно загрузить картинку с флешки,
1. При большом желании да. Надо учесть отличия компиляторов. При необходимости внести изменения в коды библиотеки.
2. Подключить к проекту для атмеги можно преобразованные файлы через bmp2c или bin2c. Если картинка на внешней флешке, то побайтовым считыванием картинки в ОЗУ контроллера. Затем делайте с картинкой что хотите если вообще памяти контроллера для хранения хватит. Но я бы взял для графики хотя бы атмега64 с внешней микросхемой ОЗУ.
3. CImg похоже для компьютеров без дефицита памяти и производительности. При необходимости можно подсмотреть реализацию нужного алгоритма и написать своё с учётом ресурсов системы.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Подскажите, можно ли про инициализировать массив не по порядку, а выборочно указать элементы инициализации
примерно как в структуре
.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,......}
};
На такое компилятор ругается.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

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

Код: Выделить всё

	flash const long int array[2][7] = {
			{ 123, 1, 2, 3, },
			{ 123, 1, 2, 3, }
	};
«И всё-таки она вертится!»
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Apparatchik, это и так понятно. акцент был
можно ли про инициализировать массив не по порядку
flash const long int array[2][7] = {
{ 123, 1, 2, 3, }, // Эта первая строка
{ 123, 1, 2, 3, } // Это нулевая строка
};
Ответить

Вернуться в «Разные вопросы по МК»