Страница 300 из 386

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

Добавлено: Сб апр 20, 2019 06:31:04
WiseLord
Ну... разбрасывание .c файлов по разным каталогам тоже не упрощает Makefile.

Честно говоря, я и сам в своих проектах часто использую маску по расширению .c, чтобы не переусложнять Makefile. Но всё-таки "в душе" считаю это не совсем правильным.

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

Добавлено: Сб апр 20, 2019 19:10:24
da-nie
Но всё-таки "в душе" считаю это не совсем правильным.
А напрасно. Когда количество файлов модулей подойдёт к тысяче, вам очень пригодится именно маска (поясню - речь не о микроконтроллерах, где такое вряд ли возможно, речь о программном обеспечении для PC). :)

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

Добавлено: Сб апр 20, 2019 20:32:15
WiseLord
В больших проектах уже работают другие системы сборки типа autotools, cmake, qmake и прочие, генерирующие Makefile.

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

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

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

Добавлено: Вт май 07, 2019 11:05:55
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);" то работает нормально. Как так то?

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

Добавлено: Вт май 07, 2019 11:36:54
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 };
Такая инициализация работает вне класса? Хм.

Вообще-то, очень не рекомендую делать указатели на функции класса. На то есть вот какие причины.

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

Добавлено: Вт май 07, 2019 13:26:23
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])(); }
};

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

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

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

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

Добавлено: Ср май 08, 2019 13:06:20
da-nie
Это не для средних любительских умов )).
Вот поэтому и не стоит их использовать - нарвётесь на удивительные вещи. Например, на такую. В этом компиляторе даже не компилируется. А в gcc-2.95 такое компилировалось, но работало не так, как ожидается - вызывалась функция базового класса, а не подклассов.

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

Добавлено: Вт июн 04, 2019 03:13:11
pokk
Принято ли в IDE добавлять хедер шаблонного класса ?
Начал изучать с++, был удивлен что нельзя выделить функции в отельный файл как уже привык для с проектов.

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

Добавлено: Вт июн 04, 2019 05:19:00
da-nie
Шаблонного? Шаблоны располагаются в h-файлах.

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

Добавлено: Вт июн 04, 2019 08:47:20
ПростоНуб
pokk, шаблонный класc есть включаемый файл и добавляется обычным #include. Добавлять в проект IDE его есть смысл только тогда, когда он может модифицироваться, а собираете проект средствами IDE, а не собственным makefile. Иначе, при модификации включаемого файла, IDE или make не будут знать, что он изменился. А значит могут не пересобрать включающие этот файл исходники, решив, что их объектные файлы актуальны.
И функции, и методы в C++ вполне можно выделять в отдельный файл. Функции добавляются так же как в C. Ведь, строго говоря, в C++ функций нет. Есть совместимость с C, позволяющая использовать функции.
Методы, выносимые в отдельный файл, оформляются в виде наследуемого класса.

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

Добавлено: Ср июн 05, 2019 05:19:18
da-nie
Начал изучать с++, был удивлен что нельзя выделить функции в отельный файл как уже привык для с проектов.
Видимо, я неправильно понял, в чём у вас проблема. Не могли бы вы объяснить, что вы хотите сделать по пунктам:
1) Что за шаблонный класс вы хотите добавить в ide? Что это значит и что имеется в виду?
2) Что значит, "функции в отдельный файл"? Какие функции? Шаблонные? Обычные? Методы класса? Что значит, "в отдельный файл"? У вас они должны быть объявлены в *.h и реализованы в *.cpp/*.c/*.cc.
Ведь, строго говоря, в C++ функций нет.
Что вы имеете в виду?

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

Добавлено: Ср июн 05, 2019 07:08:13
ПростоНуб
da-nie, только то, что сказал. Функции в C++ есть только на уровне совместимости с С. Сама же парадигма объектной ориентированости их исключает, предполагая, что все реализуется на методах.

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

Добавлено: Ср июн 05, 2019 07:54:09
Reflector
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3645486#p3645486"]Функции в C++ есть только на уровне совместимости с С. Сама же парадигма объектной ориентированости их исключает, предполагая, что все реализуется на методах.[/uquote]
Даже если бы С++ был чисто ООП языком, что, естественно, не так, то все равно функции члены(методы), как уже видно из названия тоже являются функциями, просто они привязаны к классу. Ну будет доступ к функции через лишний указатель и что с того? А еще есть статические функции члены не привязанные к классу, а также шаблонные и лямбда функции, которых не было в С и они уж точно появились не для совместимости с последним...

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

Добавлено: Ср июн 05, 2019 09:41:18
pokk
Что за шаблонный класс вы хотите добавить в ide?
Для изучения взял пример, создать класс кольцевых буферов(RingBuf), и через параметр шаблона передавать максимальный размер кольцевого буфера.
Ну и соответственно, я хотел вытащить функции(методы?) класса RingBuf, в отдельный файл .сpp и добавить его в IDE так как еще 100500 раз буду их изменять. В принципе я понимаю почему это нельзя сделать, и почему они только в H файле остаются. Я даже нашел что .сpp с методами инклудят в конце header'a, но по мне это все костыли. Если оставить как есть(не добавлять header в IDE), и сделать только inlude "RingBuf.h" , то после разрастания проекта как найти файл которые глубоко зарытый файл(file3.h) (main.cpp содержить file2.h ->....> file3.h )?
2) Что значит, "функции в отдельный файл"? Какие функции? Шаблонные? Обычные? Методы класса? Что значит, "в отдельный файл"? У вас они должны быть объявлены в *.h и реализованы в *.cpp/*.c/*.cc.
Вот наброски:

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


template <typename T,int T2>
class RingBuff
{
private:
    T *stackPtr;    // указатель на стек
    int size;       // размер стека
    T top;          // вершина стека
    T Array[T2];
public:
    RingBuff();// по умолчанию размер стека равен 10 элементам
    bool push(const T s); // поместить элемент в стек
};

//==========================
/*
    * @Описание:     Конструктор
    * @Параметр:    
    * @Возврат:     Нету
*/
template <typename T,int T2>RingBuff<T,T2>::RingBuff()
{
    stackPtr=Array;
    top=0;
}
//==========================
/*
    * @Описание:    Описание функции.
    * @Параметр:    
    * @Возврат:     Нету
*/
template <typename T,int T2>
bool RingBuff<T,T2>::push(const T value)
{
    if (top == size - 1)
        return false; // стек полон
 
    top++;
    stackPtr[top] = value; // помещаем элемент в стек
 
    return true; // успешное выполнение операции
}

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

Добавлено: Ср июн 05, 2019 10:12:52
Reflector
[uquote="pokk",url="/forum/viewtopic.php?p=3645550#p3645550"]Если оставить как есть(не добавлять header в IDE), и сделать только inlude "RingBuf.h" , то после разрастания проекта как найти файл которые глубоко зарытый файл(file3.h) (main.cpp содержить file2.h ->....> file3.h )?[/uquote]
Надуманная проблема, добавление хедера в IDE ни на что не влияет.

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

Добавлено: Ср июн 05, 2019 17:12:15
da-nie
da-nie, только то, что сказал. Функции в C++ есть только на уровне совместимости с С. Сама же парадигма объектной ориентированости их исключает, предполагая, что все реализуется на методах.
А С++ не только ООП ( кстати, ООП, говорят, сильно лучше в Objective C).
Ну и соответственно, я хотел вытащить функции(методы?) класса RingBuf, в отдельный файл .сpp и добавить его в IDE
Так нельзя. Все шаблоны только в заголовочных файлах. И компилятор без специализации шаблона не проверяет корректность кода.

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

Добавлено: Ср июл 17, 2019 21:02:32
ROMan2947
Здравствуйте Уважаемые!
Столкнулся с такой ситуацией, что стало мне нужно в массив закинуть адреса полей структуры.Но что-то ничего не выходит, да и в сети не нашел ответа...Есть ли такая возможность в си?
Спойлер

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

typedef struct
{
	uint8_t a;
	uint8_t b;
	uint8_t c;
}mytyp;

mytyp mystruct={0};
mytyp *Ptrmystruct=&mystruct;
	
mytyp *Ptrmymassiv[3]={&(Ptrmystruct->a),&(Ptrmystruct->b),&(Ptrmystruct->c),};

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

Добавлено: Ср июл 17, 2019 21:07:45
WiseLord
Немножко бред написан. Ну если нужен массив указателей на поля, которые uint8_t, ну так и делайте именно такой массив, uint8_t *array[3].