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

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

Сообщение FreshMan »

интересует мнение опытных писателей кода относительно #pragma once
давно интересовался вопросом повторного включения модуля в многомодульном проэкте
тоесть
в главном модуле main усть #include <avr/io.h>
но он также нужен и в lcd.h и в ds18b20.h
что можете посоветовать ?
Tell Me The Truth
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

- Не использовать #pragma once
- Просто включать <avr/io.h> в каждом файле
- В своих многократно включаемых хидерах (myfile.h) оборачивать их содержимое в "скобки" препроцессора

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

#ifndef MYFILE_H
#define MYFILE_H

// содержимое myfile.h

#enfid
https://ru.wikipedia.org/wiki/Include_guard
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

WiseLord писал(а): - В своих многократно включаемых хидерах (myfile.h) оборачивать их содержимое в "скобки" препроцессора

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

#ifndef MYFILE_H
#define MYFILE_H

// содержимое myfile.h

#enfid
Почему-то в Keil'е это не работает, так же, как и рекомендуемая там форма записи:

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

#ifndef FILENAME_INCLUDED
#define FILENAME_INCLUDED

/* Header File Contents */

#endif
Либо я (что более вероятно) делаю это не так, как нужно.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 306
Зарегистрирован: Сб мар 17, 2012 20:31:44
Откуда: Нью Йорк

Сообщение A. Fig Lee »

Не может быть, чтоб не работало
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

Сам понимаю, что не правильно это, но тем не менее в Мплабе нормально, а Кайл ругается.
Каждый имеет право на свое личное ошибочное мнение.

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

Сообщение WiseLord »

Zhuk72 писал(а):так же, как и рекомендуемая там форма записи
Собственно, обе записи ничем не отличаются.

Надеюсь, у Вас не во всех файлах именно "FILENAME_INCLUDED". У каждого хидера должно быть своё уникальное имя для макроса. Я обычно предпочитаю для файла типа FileName.h выбирать имя FILENAME_H.

И про keil - точно что-то не так делаете. Потому что та же STDPERIPH библиотека для STM32 точно с такими же макросами реализована.
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

Zhuk72 писал(а):
Должно быть #endif
Опечатка?
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

опечатка
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

WiseLord писал(а):Надеюсь, у Вас не во всех файлах именно "FILENAME_INCLUDED".
Разумеется. FILENAME заменяется, скажем, на INIT_H, MENU_H и т.д.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

WiseLord писал(а): - Просто включать <avr/io.h> в каждом файле
а на размере кода сие не сказывается ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

С чего бы вдруг?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

есть некая структура

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

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;
как обратится, считать данные, к примеру, с 0 или 5 или 30 байта данной структуры ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

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

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

Сообщение FreshMan »

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

Сообщение 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

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

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

Сообщение FreshMan »

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

Сообщение ARV »

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

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

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

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

Сообщение FreshMan »

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

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

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

Сообщение ARV »

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

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

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

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

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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