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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Есть IDE, которые всё подряд из папки компилят, но это как-то нефеншуйно.
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1454
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Отнюдь. Только не всё подряд, а определённые типы файлов. Вон FeCat-у именно так и хотелось бы.)
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

Сообщение FeCat »

Я правильно понимаю, что если появилась необходимость подключить к проекту "C++" файлы "C", то делаем так:
extern "C"{
#include "timer8.h"
};
Файл timer8.c добавится в проект "C++"(через IDE) как "C".
Аналогично можно делать вставки кода не на языке "файла".
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="FeCat",url="/forum/viewtopic.php?p=3617127#p3617127"]Файл timer8.c добавится в проект "C++"(через IDE) как "C".[/uquote]Не добавится он в проект. Его нужно самому добавлять, ручками. Чтобы он отображался в дереве проекта.
Как это делается конкретно в вашем IDE - не в курсе. Погуглите.
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

В любой IDE нужно добавлять ручками исходные файлы в проект.
Нет... Есть IDE, которые сканируют каталог и всё, что там найдено считают файлами проекта и подвергают компиляции. Типичный пример - IDE Momentics в QNX 6.3 (на базе Eclipse вроде она).
Есть IDE, которые всё подряд из папки компилят, но это как-то нефеншуйно.
Но, кстати, очень удобно. В отличие от Visual Studio с логическими папками (которые ещё создать надо ручками), проектом очень просто управлять - создал папки и скопировал файлы и попросил пересканировать.
А вот есть всякие Keil, которые сами чего-то там из CMSIS и HAL компилируют из исходников, но в проекте этих файлов исходников не отображается (или я не в курсе, как его заставить их показать). Вот это неудобно.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

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

Сообщение WiseLord »

Тупо подключать и компилировать все .c файлы из каталога - плохая идея. Компилятору следут передавать только нужные файлы.

Почему - ответ простой. Если у меня в проекте поддерживается, например, 20 разных контроллеров дисплея, а собираю я под какой-то конкретный, то компилировать 19 ненужных файлов нет смысла.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

da-nie писал(а):на базе Eclipse вроде она
да, Eclipse CDT по умолчанию именно так и делает: всё, что в папке проекта, считает компилируемыми файлами. однако, легко можно исключить любой файл и даже папку целиком из этого списка.
WiseLord писал(а):Если у меня в проекте поддерживается, например, 20 разных контроллеров дисплея, а собираю я под какой-то конкретный, то компилировать 19 ненужных файлов нет смысла
как правило, в IDE это решается при помощи конфигурации разных target-ов, и в упомянутой мною Eclipse именно так.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

[uquote="FeCat",url="/forum/viewtopic.php?p=3617127#p3617127"]то делаем так:
extern "C"{
#include "timer8.h"
};[/uquote]
Наоборот, удобней в любой заголовочный файл C в начало поставить

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

#ifdef __cplusplus
extern "C" {
#endif
, а в конец:

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

#ifdef __cplusplus
}
#endif
WiseLord писал(а):Тупо подключать и компилировать все .c файлы из каталога - плохая идея.
По разному бывает. Я часто настраиваю makefile именно таким образом. А вот все условно включаемое размещаю в соответствующих поддиректориях, нередко даже с симлинками. Тогда настройка на конкретную сборку вызывает подключение еще одной или нескольких поддиректорий (или конкретных файлов).
В сложных сборках, когда этих самых исходных файлов десяток видов, а людей, работающих над проектом не мало, удобней минимально трогать общий makefile.
С/С++ иходники еще ничего. А вот когда ворох мелких ресурсных файлов, причем взаимосвязанных, задолбаешься постоянно makefile мержить.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

[uquote="FeCat",url="/forum/viewtopic.php?p=3617072#p3617072"]Если в .h файле добавить "#include "timer8.c"" то ошибки нет. Но это же идеологически не правильно.
Пишу в AtmelStudio7.
Как правильно делать?[/uquote]
Надо в cи файле написать #Include "timer8.h"
Прорезались зубы
Аватара пользователя
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

Сообщение FeCat »

Огромное спасибо ответившим. Вроде в голове прояснилось.
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3617201#p3617201"]Тупо подключать и компилировать все .c файлы из каталога - плохая идея.[/uquote]на самом деле, это очень удобно - заметно упрощается makefile и вообще управление проектом. Не хочешь, чтобы файл компилировался - просто не клади его в этот каталог :dont_know:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Ну... разбрасывание .c файлов по разным каталогам тоже не упрощает Makefile.

Честно говоря, я и сам в своих проектах часто использую маску по расширению .c, чтобы не переусложнять Makefile. Но всё-таки "в душе" считаю это не совсем правильным.
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Но всё-таки "в душе" считаю это не совсем правильным.
А напрасно. Когда количество файлов модулей подойдёт к тысяче, вам очень пригодится именно маска (поясню - речь не о микроконтроллерах, где такое вряд ли возможно, речь о программном обеспечении для PC). :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

В больших проектах уже работают другие системы сборки типа autotools, cmake, qmake и прочие, генерирующие Makefile.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Не обязательно. У меня есть проекты с сотнями исходных файлов, благополучно собирающиеся обычным GNU make. Необходимость в autotools/cmake возникает только на кроссплатформенных проектах, где действительно нужна автоконфигурация.
Для МК тоже бывают проекты с огромным количеством исходников. Другое дело, что бОльшая часть этих исходников является ресурсными файлами, а не кодом. Например, для каждого клиента можно выбрать свои фонты, иконки, сообщения, фоновый рисунок и логотип. В AT24C256 много ресурсов можно прошить )
Прорезались зубы
Аватара пользователя
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

Сообщение FeCat »

Как в .h файле в обьявлении класса обьявить массив указателей на методы этого-же класса?
Если делаю так:
Спойлер.h

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

#ifndef __SENSORCONF_H__
#define __SENSORCONF_H__

#include <avr/io.h>

class SensorConf
{
	//variables
	public:
	public:
	int Alarm_1_TemperatureVal;
	unsigned char MenuN;	// номер функцию меню
	void menu_1(void);
	void menu_2(void);
	void menu_3(void);
	void menu_4(void);
	void menu_5(void);
	void menu_6(void);
	void menu_7(void);
	void menu_8(void);
	void menu_0(void);
	
	void (SensorConf::*Menu[10])(void);    //  ТУТ ЗАТЫК
	
	static unsigned char Sensor_Namber;
	
	void menu_start(void);
	
	protected:
	private:

	//functions
	public:
	SensorConf();
}; //SensorConf

#endif //__SENSORCONF_H__

.cpp

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

#include "SensorConf.h"

	void SensorConf::menu_1(void){};
	void SensorConf::menu_2(void){};
	void SensorConf::menu_3(void){};
	void SensorConf::menu_4(void){};
	void SensorConf::menu_5(void){};
	void SensorConf::menu_6(void){};
	void SensorConf::menu_7(void){};
	void SensorConf::menu_8(void){};
	void SensorConf::menu_0(void){};

	void (SensorConf::*Menu[10])(void) = {
		&SensorConf::menu_0,
		&SensorConf::menu_1,
		&SensorConf::menu_2,
		&SensorConf::menu_3,
		&SensorConf::menu_4,
		&SensorConf::menu_5,
		&SensorConf::menu_6,
		&SensorConf::menu_7,
		&SensorConf::menu_8,
		&SensorConf::menu_0	};
	
	void SensorConf::menu_start(void)
	{
		(this->*Menu[MenuN])();
	};

	SensorConf::SensorConf()
	{
		MenuN = 1;
		Alarm_1_TemperatureVal = 24;
	};
То при вызове "menu_start" микроконтроллер уходит с брос, судя по отладке массив "Menu" заполнен нулями.
Если в хедере закомментировать "void (SensorConf::*Menu[10])(void);" то работает нормально. Как так то?
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

void (SensorConf::*Menu[10])(void) = {
&SensorConf::menu_0,
&SensorConf::menu_1,
&SensorConf::menu_2,
&SensorConf::menu_3,
&SensorConf::menu_4,
&SensorConf::menu_5,
&SensorConf::menu_6,
&SensorConf::menu_7,
&SensorConf::menu_8,
&SensorConf::menu_0 };
Такая инициализация работает вне класса? Хм.

Вообще-то, очень не рекомендую делать указатели на функции класса. На то есть вот какие причины.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="FeCat",url="/forum/viewtopic.php?p=3629388#p3629388"]Как в .h файле в обьявлении класса обьявить массив указателей на методы этого-же класса?[/uquote]

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

class SensorConf
{
public:
	using FP = void(SensorConf::*)();
	FP Menu[10] = { &SensorConf::menu_1, &SensorConf::menu_2, ... };
	uint8_t MenuN;
	static uint8_t SensorNumber;

	void menu_1();
	void menu_2();
	...

	void menu_start() { (this->*Menu[MenuN])(); }
};
Прорезались зубы
Аватара пользователя
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

Сообщение FeCat »

[uquote="da-nie",url="/forum/viewtopic.php?p=3629399#p3629399"]Вообще-то, очень не рекомендую делать указатели на функции класса. На то есть вот какие причины.[/uquote]
Это не для средних любительских умов )).

Reflector
Спасибо! Это работает.
Ответить

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