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

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

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

Сообщение VladislavS »

В arduino ide компилятор gcc, который С++ только в путь. Сам по себе C++ не даёт накладных расходов, если с головой подходить, а не так как matrex.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

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

Сам по себе C++ не даёт накладных расходов
А это смотря что делать. :) Может, мне полиморфизм нужен будет (а, собственно, привязку к разным дисплеям так очень удобно делать). А тут уже vtable появляется.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

С дуру и хрен сломать можно. Я же говорю - с головой. А с головой даже и экономить можно научиться.
matrex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 24, 2012 14:02:39

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

Сообщение matrex »

Из всего сказанного понял и сделал отдельный модуль:

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

#include <Arduino.h>
#include "U8glib.h" // Подключаем библиотеку U8glib
#include "Rtc_Pcf8563.h" // Часики

#ifndef _CLASSES_
#define _CLASSES_

U8GLIB_ST7920_128X64_1X u8g(10);
Rtc_Pcf8563 rtc;

#endif
Размер результирующего файла не изменился, но теперь подключая этот модуль к другим я могу обратиться к u8g и rtc. Идеологически это правильно я так понимаю? Завтра проверю в железе. Спасибо за помощь.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="matrex",url="/forum/viewtopic.php?p=3832691#p3832691"]Идеологически это правильно я так понимаю?[/uquote]Нет. Читайте про ключевое слово extern, для чего оно нужно и как применяется. Ну правда, это же основы, их надо знать обязательно.
matrex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 24, 2012 14:02:39

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

Сообщение matrex »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3832694#p3832694"][uquote="matrex",url="/forum/viewtopic.php?p=3832691#p3832691"]Идеологически это правильно я так понимаю?[/uquote]ключевое слово extern, для чего оно нужно и как применяется. Ну правда, это же основы, их надо знать обязательно.[/uquote]

Да не требуется там extern перестает компилироваться тогда. По ощущениям эти классы уже объявлены как extern сами по себе...

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

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

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

Из всего сказанного понял и сделал отдельный модуль:
Нет, не так. В h-файлах ничего не должно создаваться. Там только описание того, что модуль даёт на экспорт.
Всё созданное лежит в c-файлах модулей.

display.h

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

#ifndef DISPLAY_H
#define DISPLAY_H

#include <Arduino.h>
#include "U8glib.h"

U8GLIB_ST7920_128X64_1X* GetDisplayPtr(void);

#endif
display.c

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

#include "display.h"

static U8GLIB_ST7920_128X64_1X Display;

U8GLIB_ST7920_128X64_1X* GetDisplayPtr(void)
{ 
 return(&Display);
}
Да не требуется там extern перестает компилироваться тогда. По ощущениям эти классы уже объявлены как extern сами по себе...
extern там можно. Работать будет. Можно даже extern функций делать. Вы просто ещё не освоились с концепцией заголовок-реализация. Поэтому ставите extern не туда и подключаете не то (и создали, наверняка, объект в заголовочном файле). Но это плохой стиль. Приводит он к тому, что у вас состояние модуля (речь не о вашем классе дисплея - тут это действительно пофигу, он у вас один, но вот в будущем не привыкайте к такому стилю) меняется с разных точек. А если вы измените поведение? А если оно начнёт меняться непредсказуемо? Вот поэтому глобальные переменные вредны. Их стоит использовать разве что при ну очень жесткой экономии ресурсов.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="matrex",url="/forum/viewtopic.php?p=3832700#p3832700"]Да не требуется там extern перестает компилироваться тогда.[/uquote]Ну не требуется так не требуется. Трахайтесь дальше вместо того чтобы одну страницу по ссылке про extern изучить.
[uquote="matrex",url="/forum/viewtopic.php?p=3832700#p3832700"]По ощущениям эти классы уже объявлены как extern сами по себе...[/uquote] Ещё бы понятие класс и объект научиться отличать.
[uquote="matrex",url="/forum/viewtopic.php?p=3832700#p3832700"]Вот именно что основы я понимаю, знаю и понимаю ООП.[/uquote]Это видно, по тому как лихо вы объекты копируете и из/в функции передаёте.
[uquote="matrex",url="/forum/viewtopic.php?p=3832700#p3832700"]Все мои примеры основаны на опыте работы с Delphi,[/uquote]Ну ничего не поделаешь, взялись за С++, будьте добры изучить и подчиняться его правилам.

Добавлено after 4 minutes 24 seconds:
[uquote="da-nie",url="/forum/viewtopic.php?p=3832702#p3832702"]Вот поэтому глобальные переменные вредны. Их стоит использовать разве что при ну очень жесткой экономии ресурсов.[/uquote]Тут не просто переменные, а объект неизвестного размера. Где же его ещё создавать, не в стеке или куче же. Да ещё чтобы доступен из других единиц трансляции был.
matrex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 24, 2012 14:02:39

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

Сообщение matrex »

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

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

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

Тут не просто переменные, а объект неизвестного размера. Где же его ещё создавать, не в стеке или куче же. Да ещё чтобы доступен из других единиц трансляции был.
Так я несколько не об этом. Я имел в виду, что эту переменную нужно запирать в модуле, чтобы её не было видно глобально во всей программе.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="da-nie",url="/forum/viewtopic.php?p=3832796#p3832796"]Так я несколько не об этом. Я имел в виду, что эту переменную нужно запирать в модуле, чтобы её не было видно глобально во всей программе.[/uquote]Зачем? Это глобальный ОБЪЕКТ - экран. Работа с ним осуществляется через его методы. Что там ещё прятать? Всё и так внутри объекта. То что автор решил его тягать как обычную переменную по функциям... Ну это он ССЗБ.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

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

То что автор решил его тягать как обычную переменную по функциям... Ну это он ССЗБ.
Вот это и прятать.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение NStorm »

А кстати, в плюсах если объект передавать как указатель в аргументах функции, накладных расходов же будет?

Добавлено after 1 minute 53 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3832683#p3832683"]В arduino ide компилятор gcc, который С++ только в путь. Сам по себе C++ не даёт накладных расходов, если с головой подходить, а не так как matrex.[/uquote]
Не просто в путь. Весь Arduino Core (те самые библиотеки, на которых все строится в ардуино) основан на плюсах с ооп. Тот же Serial - объект. И многие другие вещи классами описаны.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="NStorm",url="/forum/viewtopic.php?p=3832871#p3832871"]А кстати, в плюсах если объект передавать как указатель в аргументах функции, накладных расходов же будет?[/uquote]В этом случае передаётся не "объект как указатель", а указатель. Накладные будут при доступе по этому указателю. Насколько большие зависит от архитектуры. При развитых типах адресации может и не быть накладных.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

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

Накладные будут при доступе по этому указателю.
Не должно быть. Когда вызывается функция класса, ей так или иначе передаётся указатель на класс. Исключение - статические функции.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
matrex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 24, 2012 14:02:39

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

Сообщение matrex »

Ну раз пошел у нас такой задушевный диалог, разрешите еще вопрос. Как правильно инициализировать структуру (по сути массив) нулями. В идеале одной командой сразу всю.

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

// данные с датчиков
struct rSENSORS
{
    float aPRESSURE[SENSOR_COUNT_DATA]; // Давление
    float aTMP_IN[SENSOR_COUNT_DATA];   // Температура внутри помещения
    float aTMP_OUT[SENSOR_COUNT_DATA];  // Температура на улице
    uint8_t aHOUR[SENSOR_COUNT_DATA];   // Час снятия показания
    uint8_t aMINUTE[SENSOR_COUNT_DATA]; // Минута снятия показания
};
Делаю "в лоб" (работает, но не изящно, знаю что можно лучше):

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

    rSENSORS dt;

    for (uint8_t cnt = 0; cnt < (SENSOR_COUNT_DATA - 1); cnt++)
    {
        dt.aPRESSURE[cnt] = 0;
        dt.aTMP_IN[cnt] = 0;
        dt.aTMP_OUT[cnt] = 0;
        dt.aHOUR[cnt] = 0;
        dt.aMINUTE[cnt] = 0;
    }

Пытаюсь через memset (в начале вроде как работало, но потом из-за того что похоже подход не верный, начали разрушаться переменные):

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

memset(dt.aPRESSURE, 0, sizeof dt.aPRESSURE);	
memset(dt.aTMP_IN, 0, sizeof dt.aTMP_IN);	
memset(dt.aTMP_OUT, 0, sizeof dt.aTMP_OUT);	
memset(dt.aHOUR, 0, sizeof dt.aHOUR);	
memset(dt.aMINUTE, 0, sizeof dt.aMINUTE);	
В итоге - никак не инициализирую массив (все работает, экономит десяток байт) - вроде как из спецификации CPP там должны находиться нули по умолчанию, но меня терзают сомнения, а предыдущий опыт говорит о том, что переменные лучше инициализировать явно во избежании лишних проблем.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

matrex писал(а):Делаю "в лоб"
а вот так не в лоб?

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

typedef struct
{
    float aPRESSURE[SENSOR_COUNT_DATA]; // Давление
    float aTMP_IN[SENSOR_COUNT_DATA];   // Температура внутри помещения
    float aTMP_OUT[SENSOR_COUNT_DATA];  // Температура на улице
    uint8_t aHOUR[SENSOR_COUNT_DATA];   // Час снятия показания
    uint8_t aMINUTE[SENSOR_COUNT_DATA]; // Минута снятия показания
}  rSENSORS;

rSENSORS dt;

	memset(&dt, 0, sizeof(rSENSORS));
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="matrex",url="/forum/viewtopic.php?p=3832994#p3832994"]Вроде как из спецификации CPP там должны находиться нули по умолчанию[/uquote]Это верно для глобальных переменных. Всё остальное будь добр инициализировать.

Добавлено after 2 minutes 45 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3833003#p3833003"]

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

memset(&dt, 0, sizeof(rSENSORS));
[/uquote]На ARM нужно 10 раз подумать прежде чем так делать, чтобы исключить невыровненный доступ там где его нет и в HardFault не улететь. Можно, но с головой!
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение NStorm »

А зачем вы создали структуру из массивов? У вас же размерность одинаковая. Сделайте массив структур.

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

struct rSENSORS
{
    float aPRESSURE; // Давление
    float aTMP_IN;   // Температура внутри помещения
    float aTMP_OUT;  // Температура на улице
    uint8_t aHOUR;   // Час снятия показания
    uint8_t aMINUTE; // Минута снятия показания
} dt[SENSOR_COUNT_DATA];
Если уже отличное от нулей, то тогда можно делать так:

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

...
} dt[SENSOR_COUNT_DATA] = { [1].aPRESSURE = 123, [2].aHOUR = 12 };
Можно в т.ч. написать = { 0 }.

Или сделать уже memset(dt, 0, sizeof dt);. Одна инструкция, а не для каждого члена структуры, как у вас.

Песочница: https://godbolt.org/z/2JgWai

Если настаиваете на вашей структуре с массивами, то тогда можно и так обнулять:

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

dt = (struct rSENSORS){ 0 };
Последний раз редактировалось NStorm Пн апр 27, 2020 12:48:09, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

VladislavS писал(а):На ARM нужно 10 раз подумать прежде чем так делать, чтобы исключить невыровненный доступ там где его нет и в HardFault не улететь.
было бы конструктивно объяснить, как следует поступать, чтобы не нарваться. причем без привзяки к ARM, а вообще по правильному для С++, раз уж тема об этом языке.
NStorm писал(а):Или сделать уже memset(dt, 0, sizeof dt);
это чем-то отличается от предложенного мной?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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