Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Сб апр 20, 2019 06:31:04
Ну... разбрасывание .c файлов по разным каталогам тоже не упрощает Makefile.
Честно говоря, я и сам в своих проектах часто использую маску по расширению .c, чтобы не переусложнять Makefile. Но всё-таки "в душе" считаю это не совсем правильным.
Сб апр 20, 2019 19:10:24
Но всё-таки "в душе" считаю это не совсем правильным.
А напрасно. Когда количество файлов модулей подойдёт к тысяче, вам очень пригодится именно маска (поясню - речь не о микроконтроллерах, где такое вряд ли возможно, речь о программном обеспечении для PC).
Сб апр 20, 2019 20:32:15
В больших проектах уже работают другие системы сборки типа autotools, cmake, qmake и прочие, генерирующие Makefile.
Сб апр 20, 2019 22:50:22
Не обязательно. У меня есть проекты с сотнями исходных файлов, благополучно собирающиеся обычным GNU make. Необходимость в autotools/cmake возникает только на кроссплатформенных проектах, где действительно нужна автоконфигурация.
Для МК тоже бывают проекты с огромным количеством исходников. Другое дело, что бОльшая часть этих исходников является ресурсными файлами, а не кодом. Например, для каждого клиента можно выбрать свои фонты, иконки, сообщения, фоновый рисунок и логотип. В AT24C256 много ресурсов можно прошить )
Вт май 07, 2019 11:05:55
Как в .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);" то работает нормально. Как так то?
Вт май 07, 2019 11:36:54
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 };
Такая инициализация работает вне класса? Хм.
Вообще-то, очень не рекомендую делать указатели на функции класса.
На то есть вот какие причины.
Вт май 07, 2019 13:26:23
Как в .h файле в обьявлении класса обьявить массив указателей на методы этого-же класса?
- Код:
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])(); }
};
Ср май 08, 2019 10:01:53
Вообще-то, очень не рекомендую делать указатели на функции класса.
На то есть вот какие причины.Это не для средних любительских умов )).
ReflectorСпасибо! Это работает.
Ср май 08, 2019 13:06:20
Это не для средних любительских умов )).
Вот поэтому и не стоит их использовать - нарвётесь на удивительные вещи.
Например, на такую. В этом компиляторе даже не компилируется. А в gcc-2.95 такое компилировалось, но работало не так, как ожидается - вызывалась функция базового класса, а не подклассов.
Вт июн 04, 2019 03:13:11
Принято ли в IDE добавлять хедер шаблонного класса ?
Начал изучать с++, был удивлен что нельзя выделить функции в отельный файл как уже привык для с проектов.
Вт июн 04, 2019 05:19:00
Шаблонного? Шаблоны располагаются в h-файлах.
Вт июн 04, 2019 08:47:20
pokk, шаблонный класc есть включаемый файл и добавляется обычным #include. Добавлять в проект IDE его есть смысл только тогда, когда он может модифицироваться, а собираете проект средствами IDE, а не собственным makefile. Иначе, при модификации включаемого файла, IDE или make не будут знать, что он изменился. А значит могут не пересобрать включающие этот файл исходники, решив, что их объектные файлы актуальны.
И функции, и методы в C++ вполне можно выделять в отдельный файл. Функции добавляются так же как в C. Ведь, строго говоря, в C++ функций нет. Есть совместимость с C, позволяющая использовать функции.
Методы, выносимые в отдельный файл, оформляются в виде наследуемого класса.
Ср июн 05, 2019 05:19:18
Начал изучать с++, был удивлен что нельзя выделить функции в отельный файл как уже привык для с проектов.
Видимо, я неправильно понял, в чём у вас проблема. Не могли бы вы объяснить, что вы хотите сделать по пунктам:
1) Что за шаблонный класс вы хотите добавить в ide? Что это значит и что имеется в виду?
2) Что значит, "функции в отдельный файл"? Какие функции? Шаблонные? Обычные? Методы класса? Что значит, "в отдельный файл"? У вас они должны быть объявлены в *.h и реализованы в *.cpp/*.c/*.cc.
Ведь, строго говоря, в C++ функций нет.
Что вы имеете в виду?
Ср июн 05, 2019 07:08:13
da-nie, только то, что сказал. Функции в C++ есть только на уровне совместимости с С. Сама же парадигма объектной ориентированости их исключает, предполагая, что все реализуется на методах.
Ср июн 05, 2019 07:54:09
Функции в C++ есть только на уровне совместимости с С. Сама же парадигма объектной ориентированости их исключает, предполагая, что все реализуется на методах.
Даже если бы С++ был чисто ООП языком, что, естественно, не так, то все равно функции члены(методы), как уже видно из названия тоже являются функциями, просто они привязаны к классу. Ну будет доступ к функции через лишний указатель и что с того? А еще есть статические функции члены не привязанные к классу, а также шаблонные и лямбда функции, которых не было в С и они уж точно появились не для совместимости с последним...
Ср июн 05, 2019 09:41:18
Что за шаблонный класс вы хотите добавить в 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; // успешное выполнение операции
}
Ср июн 05, 2019 10:12:52
Если оставить как есть(не добавлять header в IDE), и сделать только inlude "RingBuf.h" , то после разрастания проекта как найти файл которые глубоко зарытый файл(file3.h) (main.cpp содержить file2.h ->....> file3.h )?
Надуманная проблема, добавление хедера в IDE ни на что не влияет.
Ср июн 05, 2019 17:12:15
da-nie, только то, что сказал. Функции в C++ есть только на уровне совместимости с С. Сама же парадигма объектной ориентированости их исключает, предполагая, что все реализуется на методах.
А С++ не только ООП ( кстати, ООП, говорят, сильно лучше в Objective C).
Ну и соответственно, я хотел вытащить функции(методы?) класса RingBuf, в отдельный файл .сpp и добавить его в IDE
Так нельзя. Все шаблоны только в заголовочных файлах. И компилятор без специализации шаблона не проверяет корректность кода.
Ср июл 17, 2019 21:02:32
Здравствуйте Уважаемые!
Столкнулся с такой ситуацией, что стало мне нужно в массив закинуть адреса полей структуры.Но что-то ничего не выходит, да и в сети не нашел ответа...Есть ли такая возможность в си?
Спойлер
- Код:
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),};
Ср июл 17, 2019 21:07:45
Немножко бред написан. Ну если нужен массив указателей на поля, которые uint8_t, ну так и делайте именно такой массив, uint8_t *array[3].
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.