давно интересовался вопросом повторного включения модуля в многомодульном проэкте
тоесть
в главном модуле main усть #include <avr/io.h>
но он также нужен и в lcd.h и в ds18b20.h
что можете посоветовать ?
Код: Выделить всё
#ifndef MYFILE_H
#define MYFILE_H
// содержимое myfile.h
#enfidПочему-то в Keil'е это не работает, так же, как и рекомендуемая там форма записи:WiseLord писал(а): - В своих многократно включаемых хидерах (myfile.h) оборачивать их содержимое в "скобки" препроцессораКод: Выделить всё
#ifndef MYFILE_H #define MYFILE_H // содержимое myfile.h #enfid
Код: Выделить всё
#ifndef FILENAME_INCLUDED
#define FILENAME_INCLUDED
/* Header File Contents */
#endif
Собственно, обе записи ничем не отличаются.Zhuk72 писал(а):так же, как и рекомендуемая там форма записи
Должно быть #endifZhuk72 писал(а):Код: Выделить всё
#enfid
Разумеется. FILENAME заменяется, скажем, на INIT_H, MENU_H и т.д.WiseLord писал(а):Надеюсь, у Вас не во всех файлах именно "FILENAME_INCLUDED".
а на размере кода сие не сказывается ?WiseLord писал(а): - Просто включать <avr/io.h> в каждом файле
Код: Выделить всё
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;
HEADER wav_header;
Код: Выделить всё
*((uint8_t*)&wav_header)
*((uint8_t*)&wav_header + 5)
*((uint8_t*)&wav_header + 30)нахрена иметь структуру, чтобы потом обращаться к ее данным мимо поименованных полей?! ну берите тогда сырой массив, и обращайтесь, если с указателями траблыFreshMan писал(а):как обратится, считать данные, к примеру, с 0 или 5 или 30 байта данной структуры ?
Код: Выделить всё
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; // а теперь делаем бяку через полетребуется значение полей структуры вывести на LCD 16х2ARV писал(а):нахрена иметь структуру, чтобы потом обращаться к ее данным мимо поименованных полей?!
Код: Выделить всё
sprintf(str, "SampleRate = %lu", wav_header.SampleRate);согласен, ноARV писал(а):ну так и выводите поля структуры! нафига побайтно-то?
Код: Выделить всё
sprintf(str, "SampleRate = %lu", wav_header.SampleRate);str - это массив символов, т.е. строка. тип выводимого поля должен соответствовать формату вывода, но и только! компилятор не будет ругаться.FreshMan писал(а):компилятор начинает ругатся что тип массива str не соответствует выводимому полю структуры
я понятия не имею, как вы планируете выводить на ЖКИ 2х16 кучу полей из заголовка WAV-файла... и зачем это вообще делать... вы правы в одном: каждое поле придется выводить отдельным форматом, соответствующим этому полю, а вот строка-результат, которая будет хранить символьное представление полей, может быть одна и та же.FreshMan писал(а):под кажое поле надо свою выводную строку создавать ?
Код: Выделить всё
printf_P(PSTR("поле1=%d\nполе2=%d"), поле1, поле2);