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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

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

Это не для средних любительских умов )).
Вот поэтому и не стоит их использовать - нарвётесь на удивительные вещи. Например, на такую. В этом компиляторе даже не компилируется. А в gcc-2.95 такое компилировалось, но работало не так, как ожидается - вызывалась функция базового класса, а не подклассов.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Принято ли в IDE добавлять хедер шаблонного класса ?
Начал изучать с++, был удивлен что нельзя выделить функции в отельный файл как уже привык для с проектов.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

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

Шаблонного? Шаблоны располагаются в h-файлах.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

pokk, шаблонный класc есть включаемый файл и добавляется обычным #include. Добавлять в проект IDE его есть смысл только тогда, когда он может модифицироваться, а собираете проект средствами IDE, а не собственным makefile. Иначе, при модификации включаемого файла, IDE или make не будут знать, что он изменился. А значит могут не пересобрать включающие этот файл исходники, решив, что их объектные файлы актуальны.
И функции, и методы в C++ вполне можно выделять в отдельный файл. Функции добавляются так же как в C. Ведь, строго говоря, в C++ функций нет. Есть совместимость с C, позволяющая использовать функции.
Методы, выносимые в отдельный файл, оформляются в виде наследуемого класса.
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

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

Начал изучать с++, был удивлен что нельзя выделить функции в отельный файл как уже привык для с проектов.
Видимо, я неправильно понял, в чём у вас проблема. Не могли бы вы объяснить, что вы хотите сделать по пунктам:
1) Что за шаблонный класс вы хотите добавить в ide? Что это значит и что имеется в виду?
2) Что значит, "функции в отдельный файл"? Какие функции? Шаблонные? Обычные? Методы класса? Что значит, "в отдельный файл"? У вас они должны быть объявлены в *.h и реализованы в *.cpp/*.c/*.cc.
Ведь, строго говоря, в C++ функций нет.
Что вы имеете в виду?
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

da-nie, только то, что сказал. Функции в C++ есть только на уровне совместимости с С. Сама же парадигма объектной ориентированости их исключает, предполагая, что все реализуется на методах.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

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

Сообщение 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; // успешное выполнение операции
}
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение 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 ни на что не влияет.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

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

da-nie, только то, что сказал. Функции в C++ есть только на уровне совместимости с С. Сама же парадигма объектной ориентированости их исключает, предполагая, что все реализуется на методах.
А С++ не только ООП ( кстати, ООП, говорят, сильно лучше в Objective C).
Ну и соответственно, я хотел вытащить функции(методы?) класса RingBuf, в отдельный файл .сpp и добавить его в IDE
Так нельзя. Все шаблоны только в заголовочных файлах. И компилятор без специализации шаблона не проверяет корректность кода.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение 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),};
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Немножко бред написан. Ну если нужен массив указателей на поля, которые uint8_t, ну так и делайте именно такой массив, uint8_t *array[3].
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3667838#p3667838"]делайте именно такой массив, uint8_t *array[3].[/uquote] делали,но на это я получаю ошибку Error initializer element is not constant
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

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

Вот так надо

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

uint8_t *Ptrmymassiv[3]={&mystruct.a,&mystruct.b,mystruct.c)};
Error initializer element is not constant
Это может быть ограничения компилятора.
Тогда сделайте так:

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

Ptrmymassiv[0]=&mystruct.a;
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="da-nie",url="/forum/viewtopic.php?p=3667847#p3667847"]Вот так надо[/uquote] Вот это похоже на правду! А ограничение по-моему тоже имеет место, т.к. с точкой я тоже пробовал,но массив инициализировался не корректно...Спасибо!!!! :beer:
1. Почему стрелка не канает?
2.Что это за ограничение?может его надо отключить?

Добавлено after 13 minutes 46 seconds:
[uquote="da-nie",url="/forum/viewtopic.php?p=3667847#p3667847"]

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

uint8_t *Ptrmymassiv[3]={&mystruct.a,&mystruct.b,mystruct.c)};
[/uquote] этот вариант без ошибок,но получаю странные данные

Добавлено after 5 minutes 41 second:
[uquote="da-nie",url="/forum/viewtopic.php?p=3667847#p3667847"]Тогда сделайте так:

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

Ptrmymassiv[0]=&mystruct.a;
[/uquote]
"Этот вариант заплевал всякой всячиной
Вложения
Скриншот 17-07-2019 230324.jpg
(162.62 КБ) 336 скачиваний
Скриншот 17-07-2019 225632.jpg
(43.33 КБ) 327 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Тут могут быть тонкости с выравниванием.

Вообще, код странный и ненужный. Зачем вообще может понадобиться хранить массив адресов элементов структуры, если одного адреса самой структуры вполне достаточно?
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3667874#p3667874"]Зачем вообще[/uquote]в данном случае мне нужно в цикле присваивать значения полями структуры.ну а после так же в цикле считывать, может даже выборочно. Почему структура, а не просто массив? работать с индексами массива не очень, у полей есть имя...

Добавлено after 9 minutes 31 second:
да и вообще хотелось бы просто узнать, как это возможно
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Тогда можно проще, через union:
Спойлер

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

typedef union {
    struct {
        uint8_t sec;
        uint8_t min;
        uint8_t hour;
    };
    uint8_t time[3];
} Rtc;

/*
Расположение в памяти::
|             rtc             |
| sec     | min     | hour    |
| time[0] | time[1] | time[3] |
*/

Rtc rtc;

void reset(void)
{
    for (uint8_t i = 0; i < 3; i++) {
        rtc.time[i] = 0;
    }
}

void setHour(uint8_t value)
{
    rtc.hour = value;
    
    // то же самое, что сделать rtc.time[0] = value;
}
В принципе, и в Вашем случае можно проще сделать - взять указатель на массив, привести его к указателю на тип поля и работать дальше с ним:
Спойлер

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

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

mytype mystruct;

void reset(void)
{
    uint8_t *p = (uint8_t*)&mystruct;
    
    for (int i = 0; i < 3; i++) {
        p[i] = 0;
    }
}
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Спасибо, варианты интересные, буду прорабатывать :write:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3667969#p3667969"]в данном случае мне нужно в цикле присваивать значения полями структуры.ну а после так же в цикле считывать, может даже выборочно[/uquote]
Для таких целей эффективней использовать union структуры с массивом.
Ответить

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