реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Closed TopicStart new topic
> static variable
Baser
сообщение Apr 7 2016, 08:50
Сообщение #16


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(esaulenka @ Apr 7 2016, 10:03) *
При этом проекты не сказать, чтоб прямо сложные. Пара сотен килобайт исходников - это немного совсем...

Цитата(zltigo @ Apr 7 2016, 10:35) *
некую приблуду для которой требовалась, то, что я назвал, "оконной библиотекой" - то есть всякие окошки, текстовые естественно, но все же типа "Windows"

Вот я и говорю, что проекты слишком малы для плюсов - я в основном ваяю различные интеллектуальные датчики и небольшие платы управления. До сотни килобайт еще не добирался sm.gif

Вот начал делать один прибор уже с графическим дисплеем, там да, уже чувствуется необходимость увеличения абстракции верхнего уровня софта.
Так что 100 КБайт кода - это по моим ощущением и есть примерная граница необходимости качественного скачка sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 7 2016, 10:49
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Я и мигалку светодиодов на плюсах пишу. В общем, с упомянутм мнением дядьки Шилдта в корне не согласен.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 8 2016, 05:31
Сообщение #18


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (Сергей Борщ @ Apr 7 2016, 16:49) *
Я и мигалку светодиодов на плюсах пишу. В общем, с упомянутм мнением дядьки Шилдта в корне не согласен.

+1. Дело не в объёме, а в подходе, в другом ощутительном состоянии, когда используешь С++. Кстати, это состояние можно испытывать и при сугубо сишном подходе (о чём выше сказано), но на плюсах это достигается проще, без помех.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 8 2016, 08:45
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



может быть дядька Шилдт имел ввиду объектно-ориентированный подход, а не сам язык С++, который к объектно-ориентированному подходу достаточно перпендикулярен?
Я не понимаю, что может мешать в программе класса "мигалка светодиодом" использовать перегрузку операторов:
CODE
void print(char const * string);
void print(int number);

void test()
{
    print("I = ");
    print(123);
}
// вместо дающего точно такой же выходной код сишного
void print_string(char const * string);
void print_number(int number);

void test()
{
    print_string("I = ");
    print_number(123);
}

что мешает объявлять типы структур более короткой записью, без typedef:
CODE
struct a_t
{
    int B;
    int C;
};
a_t A;

// вместо дающего точно такой же выходной код сишного
typedef struct
{
    int B;
    int C;
} a_t;
a_t A;

что мешает использовать шаблоны
CODE
void send(void const * from, size_t size);

template<typename T>
inline void send(T & data) { send(&data, sizeof(data)); }

uint32_t A;
uint8_t B;
struct c_t { uint32_t A; uint8_t B; char Name[20]; } C;

void test()
{
    send(A);
    send(B);
    send(C);
}

// вместо дающего точно такой же выходной код сишного
void test1()
{
    send(&A, sizeof(A));
    send(&B, sizeof(B));
    send(&C, sizeof(C));
}

что мешает использовать объявления структур внутри структур
CODE
struct config_t
{
   struct module_a_t
   {
       ....
   };
   struct module_b_t
   {
      ....
   };
   module_a_t A;
   module_b_t B;
} Config;

config::module_a_t * pModule_A_cfg = &Config.A;
// вместо дающего точно такой же выходной код сишного
typedef struct
{
   ....
} module_a_config_t;
typedef struct
{
    ....
} module_b_config_t;
typedef struct
{
   module_a_config_t A;
   module_b_config_t B;
} config_t;
config_t Config;

module_a_config_t * pModule_A_cfg = &Config.A;


что мешает использовать хотя бы простейшие объекты?
CODE
class a_t
{
public:
    void do_process();
private
    ... какие-то данные ....    
}
a_t A, B;
void test()
{
    A.do_process();
    B.do_process();
}

// вместо дающего точно такой же выходной код сишного
typedef struct
{
    ... какие-то данные ....    
} a_t;
a_t A, B;
void do_process(a_t * data);

void test()
{
    do_process(&A);
    do_process(&B);
}


и таких примеров можно привести великое множество. Еще раз подчеркиваю - эти исходники дают абсолютно идентичный выходной код, но на С++ они короче, а значит их легче писать, в них труднее запутаться или допустить описку.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 8 2016, 09:00
Сообщение #20


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



По-моему, в С так же можно использовать структуры, как и в С++.
Из приведенных выше примеров привлекает полиморфизм.
А до классов надо еще дорасти. У меня сотни функций, в какие объекты их пихать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 8 2016, 10:28
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ViKo @ Apr 8 2016, 11:00) *
По-моему, в С так же можно использовать структуры, как и в С++.
Покажите, как сделать такое:
CODE
struct config_t
{
   struct module_a_t
   {
       ....
   };
   struct module_b_t
   {
      ....
   };
   module_a_t A;
   module_b_t B;
} Config;

Как это делается в Сях я показал, там больше писанины и нет сокрытия имен.
QUOTE (ViKo @ Apr 8 2016, 11:00) *
Из приведенных выше примеров привлекает полиморфизм.
В приведенных выше примерах полиморфизма не было. Полиморфизм - это уже объектно-ориентированное программирование.
QUOTE (ViKo @ Apr 8 2016, 11:00) *
А до классов надо еще дорасти. У меня сотни функций, в какие объекты их пихать?
Пихайте куда угодно (сколько информации в вопросе - столько и в ответе).
Ваши функции не используют данные? Если используют - имеет смысл их логически объединить. функция + данные - это уже класс. а если несколько функций используют некоторую общую часть данных - напрашивается структура классов, где базовый работает с общей частью данных, а наследники - с общими данными через базовый класс и со своими личными данными - каждый по-своему.

P.S. Если кто-то смотрел исходник openOCD - там полиморфизм реализован на чистых Сях. Это тихий ужас и закат солнца вручную.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 8 2016, 11:33
Сообщение #22


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А как называется свойство, когда функции с одинаковым именем работают с разными типами данных?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 8 2016, 11:47
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Apr 8 2016, 14:33) *
А как называется свойство, когда функции с одинаковым именем работают с разными типами данных?

Перегрузка функций.



QUOTE (Сергей Борщ @ Apr 8 2016, 13:28) *
Покажите, как сделать такое:
CODE
struct config_t
{
   struct module_a_t
   {
       ....
   };
   struct module_b_t
   {
      ....
   };
   module_a_t A;
   module_b_t B;
} Config;


Так:

CODE
typedef struct config_t
{
   struct
   {
....
   }A;
   struct
   {
....
    }B;
} Config;


QUOTE
в Сях я показал, там больше писанины и нет сокрытия имен.

Писанины в Сях оказалось меньше, а имена вообще отсутствуют за ненадобностью sm.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Baser
сообщение Apr 8 2016, 12:03
Сообщение #24


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(Сергей Борщ @ Apr 8 2016, 11:45) *
может быть дядька Шилдт имел ввиду объектно-ориентированный подход, а не сам язык С++, который к объектно-ориентированному подходу достаточно перпендикулярен?
Я не понимаю, что может мешать в программе класса "мигалка светодиодом" использовать перегрузку операторов:
что мешает объявлять типы структур более короткой записью, без typedef:
что мешает использовать шаблоны
что мешает использовать объявления структур внутри структур
что мешает использовать хотя бы простейшие объекты?

и таких примеров можно привести великое множество. Еще раз подчеркиваю - эти исходники дают абсолютно идентичный выходной код, но на С++ они короче, а значит их легче писать, в них труднее запутаться или допустить описку.

Тут я могу ответить только за себя - применять эти небольшие улучшения/расширения си, конечно можно, но я не вижу качественного улучшения. Поэтому и не применяю, тем более что накопилось много долгоиграющих проектов на разных МК под разными компиляторами, которые периодически нужно подкручивать и кидать куски кода туда-сюда. ANSI C поддерживает весь зоопарк применяемых мною инстументов, а вот плюсы - увы...
Тем более, что ошибки/опечатки в аналогах всех вышеупомянутых улучшений хорошо отлавливаются компиляторами и тут проблем нет.

А применение объектно-ориентированного подхода это уже отдельный вопрос и к вышеприведенным примерам отношения не имеющий, и на маленьких проектах ИМХО себя не оправдывающий.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 8 2016, 12:52
Сообщение #25


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (zltigo @ Apr 8 2016, 13:47) *
Писанины в Сях оказалось меньше, а имена вообще отсутствуют за ненадобностью sm.gif.
И как теперь объявить указатель на структуру А?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 8 2016, 13:26
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Сергей Борщ @ Apr 8 2016, 15:52) *
И как теперь объявить указатель на структуру А?

Не понял. Ты же хотел скрыть имена? Вот они и "скрыты". И вообще, что такое указатель на струкруру внутри структуры без использования наружной структуры? На кой он может быть нужен?

Можешь написать на базе своего-же сишного примера, для чего это такое? В чем цимус:
a = &c.A;
a->x;
перед
s = &c;
s->A.x;

Тем более, что ценой нескольких слов typedef в хидре можно и в Си так-же получать доступ.
Только вот от паковки структуры с таким доступом будет снос крыши.

P.S.
Если бы С++ структуры давали хоть сколь-нибудь существенное преимущество перед возможностями С99, то я бы при своей любви к описанию данных, уже точно писал на С++.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 8 2016, 13:45
Сообщение #27


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (zltigo @ Apr 8 2016, 15:26) *
Не понял. Ты же хотел скрыть имена? Вот они и "скрыты".
Они не то чтобы скрыты - это структуры безымянного типа. Плюсы позволяют иметь типы с именами, но при этом не засоряющие глобальную область видимости.

QUOTE (zltigo @ Apr 8 2016, 15:26) *
И вообще, что такое указатель на струкруру внутри структуры без использования наружной структуры? На кой он может быть нужен?
Кто сказал, что без использования наружной? Выше был пример: есть наружная структура - глобальный конфиг системы. Она состоит из конфигов конкретных составляющих систему модулей. Работая с конфигом конкретного модуля удобно получить указатель (или ссылку, такого в голых Сях вообще нет) на конфиг конкретного модуля (выше показывал: config::module_a_t * pModule_A_cfg = &Config.A; или еще проще: auto pModule_A_cfg = &Config.A;). При этом в глобальной области видимости у меня только один тип - config_t.

QUOTE (zltigo @ Apr 8 2016, 15:26) *
Если бы С++ структуры давали хоть сколь-нибудь существенное преимущество перед возможностями С99, то я бы при своей любви к описанию данных, уже точно писал на С++.
"Ты видишь суслика? А он есть!". Наследование, объявление типов и функций внутри структур - весьма существенное преимущество.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 8 2016, 14:11
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE
"Ты видишь суслика? А он есть!". Наследование, объявление типов и функций внутри структур - весьма существенное преимущество.


QUOTE (Сергей Борщ @ Apr 8 2016, 16:45) *
При этом в глобальной области видимости у меня только один тип - config_t.

Если ограничение глобальной видимости и неиспользование typedef это единственное практически извлекаемое из всего этого преимущество, то оно меня не слишком восхитило sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 11 2016, 05:56
Сообщение #29


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Сергей Борщ @ Apr 8 2016, 13:28) *
В приведенных выше примерах полиморфизма не было. Полиморфизм - это уже объектно-ориентированное программирование.

И Шилдт в "Полном справочнике по С++" (гл. 11), и Википедия сообщают, что перегрузка функций является формой полиморфизма.
https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%...%86%D0%B8%D0%B9
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%...B8%D0%BA%D0%B0)
Сергей Борщ, "поздравляю... вы неправы.
Go to the top of the page
 
+Quote Post
Herz
сообщение Apr 11 2016, 07:30
Сообщение #30


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Господа! Напоминаю, тема была открыта совсем не для сравнения С с С++.
Поскольку ответ на вопрос автора получен, тему закрыл во избежание очередного холивара.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 21:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016