Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Сб апр 20, 2019 06:31:04

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

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

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

Сб апр 20, 2019 19:10:24

Но всё-таки "в душе" считаю это не совсем правильным.


А напрасно. Когда количество файлов модулей подойдёт к тысяче, вам очень пригодится именно маска (поясню - речь не о микроконтроллерах, где такое вряд ли возможно, речь о программном обеспечении для PC). :)

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

Сб апр 20, 2019 20:32:15

В больших проектах уже работают другие системы сборки типа autotools, cmake, qmake и прочие, генерирующие Makefile.

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

Сб апр 20, 2019 22:50:22

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

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

Вт май 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);" то работает нормально. Как так то?

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

Вт май 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 };


Такая инициализация работает вне класса? Хм.

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

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

Вт май 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])(); }
};

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

Ср май 08, 2019 10:01:53

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

Это не для средних любительских умов )).

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

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

Ср май 08, 2019 13:06:20

Это не для средних любительских умов )).


Вот поэтому и не стоит их использовать - нарвётесь на удивительные вещи. Например, на такую. В этом компиляторе даже не компилируется. А в gcc-2.95 такое компилировалось, но работало не так, как ожидается - вызывалась функция базового класса, а не подклассов.

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

Вт июн 04, 2019 03:13:11

Принято ли в IDE добавлять хедер шаблонного класса ?
Начал изучать с++, был удивлен что нельзя выделить функции в отельный файл как уже привык для с проектов.

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

Вт июн 04, 2019 05:19:00

Шаблонного? Шаблоны располагаются в 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

Начал изучать с++, был удивлен что нельзя выделить функции в отельный файл как уже привык для с проектов.


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

Ведь, строго говоря, в C++ функций нет.


Что вы имеете в виду?

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

Ср июн 05, 2019 07:08:13

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

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

Ср июн 05, 2019 07:54:09

Функции в C++ есть только на уровне совместимости с С. Сама же парадигма объектной ориентированости их исключает, предполагая, что все реализуется на методах.

Даже если бы С++ был чисто ООП языком, что, естественно, не так, то все равно функции члены(методы), как уже видно из названия тоже являются функциями, просто они привязаны к классу. Ну будет доступ к функции через лишний указатель и что с того? А еще есть статические функции члены не привязанные к классу, а также шаблонные и лямбда функции, которых не было в С и они уж точно появились не для совместимости с последним...

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

Ср июн 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; // успешное выполнение операции
}

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

Ср июн 05, 2019 10:12:52

Если оставить как есть(не добавлять header в IDE), и сделать только inlude "RingBuf.h" , то после разрастания проекта как найти файл которые глубоко зарытый файл(file3.h) (main.cpp содержить file2.h ->....> file3.h )?

Надуманная проблема, добавление хедера в IDE ни на что не влияет.

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

Ср июн 05, 2019 17:12:15

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


А С++ не только ООП ( кстати, ООП, говорят, сильно лучше в Objective C).

Ну и соответственно, я хотел вытащить функции(методы?) класса RingBuf, в отдельный файл .сpp и добавить его в IDE


Так нельзя. Все шаблоны только в заголовочных файлах. И компилятор без специализации шаблона не проверяет корректность кода.

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

Ср июл 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),};

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

Ср июл 17, 2019 21:07:45

Немножко бред написан. Ну если нужен массив указателей на поля, которые uint8_t, ну так и делайте именно такой массив, uint8_t *array[3].
Ответить