классы
- Войдите на сайт для отправки комментариев
Вс, 26/03/2017 - 16:06
Гуру, помогите, плиз.
Учусь писать библиотеки. Хочу внутри класса создать метод типа "структура"
struct stru { int a; int b; bool c; } class CL { public: stru metod1(); private: protected: }
Как правильно это сделать. Структура будет использоваться не только для данного класса.
Спасибо.
Я не гуру, но вроде не правильно.
Строки 6 и 14 должны заканчиваться на ;
Вы точно уверены, что хотите это делать? Вы знаете как правильно выделить память под такую структуру, как проинициализировать её, как потом освободить и т.п.? Это не так просто. Даже если Ваш код заработает, он может транжирить память и выдавать прочие подобные фокусы. Если Вы только начинаете работу с классами, то мможет Вам лучше передавать Вашему методу ссылку на готовую структуру, а в методе просто заполнять её?
Строки 6 и 14 должны заканчиваться на ;
Принимается. Но не существенно.
Вы точно уверены, что хотите это делать? Вы знаете как правильно выделить память под такую структуру, как проинициализировать её, как потом освободить и т.п.? Это не так просто. Даже если Ваш код заработает, он может транжирить память и выдавать прочие подобные фокусы. Если Вы только начинаете работу с классами, то мможет Вам лучше передавать Вашему методу ссылку на готовую структуру, а в методе просто заполнять её?
Я пытаюсь упорядочить (структуировать) свой уже готовый проект, где в общей куче все это работает, но читабильность (переносимость, портируемость) кода никакая. Памяти у меня до и больше (esp8266).
Чтобы было больше конкретики попробуйте оформить в класс пример с датчиком DHT11/21 с методами init и get_data, причем get_data должен возвращать сразу и влажность и температуру.
Сколько бы ни было памяти, если ее неправильно расходовать, то она все равно кончится.
Проект готовый(рабочий) и проводится его модернизация (оптимизация) памяти должно хватить
попробуйте оформить в класс пример с датчиком DHT11/21 с методами init и get_data, причем get_data должен возвращать сразу и влажность и температуру.
Не хочу :)
Но, если бы мне нужно было возвращать сразу и влажность и температуру, я бы возвращал один int (в самом крайнем случае long), но никак не на лету созданную структуру.
А создавать объект в функции и возвращать его по фэншую?
Ну, тогда делайте.
Гуру огорчены этой темой. Гуру считают что обявить класс с структурой можна так
Или даже так.
Но гуру сильно опечалены рассуждениями о выделении и освобождении памяти. Они не видят таких проблем при наличии структуры в классе.
Еще Гуру хотят напомнить, что класс и библиотека - разные вещи. Возможен класс в скетче и библиотека без класса. Потому ТС зря выбрал сложный путь освоения двух новых сущностей сразу.
Возвращать из функции и передавать в нее указатели по феншую. А выделять память на том же уровне, где и освобождать. Поле данных класса особого смысла передавать в его методы параметром и возвращать не имеет.
Гуру огорчены этой темой. Гуру считают что обявить класс с структурой можна так
Или даже так.
Но гуру сильно опечалены рассуждениями о выделении и освобождении памяти. Они не видят таких проблем при наличии структуры в классе.
Еще Гуру хотят напомнить, что класс и библиотека - разные вещи. Возможен класс в скетче и библиотека без класса. Потому ТС зря выбрал сложный путь освоения двух новых сущностей сразу.
Возвращать из функции и передавать в нее указатели по феншую. А выделять память на том же уровне, где и освобождать. Поле данных класса особого смысла передавать в его методы параметром и возвращать не имеет.
Не один из описываемыз методов не подходит. Патамушта
Структура будет использоваться не только для данного класса.
Я в курсе, что можно и без классов, но "Хочу и псе тут! (с классами)"
Имхуется мне, что структура как тип данных памяти особо не занимает. Компилятор определяет размер структуры в байтах и сравнивает потом на соответствие типов внутри структуры (когда начинаешь работать с методом который имеет тип этой структуры). А память выделяется под экзэмпляр типа "структура" или под экзэмпляр же класса. (Это мое имхо)
Я порешал так:
На этом вопросы по теме считаю исчерпанными.
Есть не по теме.
Как (и где) правильно объявить экземпляр внешнего класса, используемый методом
Например так:
///Имхуется мне, что структура как тип данных памяти особо не занимает.
Почти да. Иногда выравнивание немного добавляет.
///Структура будет использоваться не только для данного класса.
Так она паблик! пользуйте на здорове везде где хочется, хоть тип, хот экземпляр.
///Как (и где) правильно объявить экземпляр внешнего класса, используемый методом
Все необходимое для работы класса логично создавать в конструкторе класа. Но это очень не догма. Если надо в любом методе - не беда, но приделить особое внимание освобождению и утечкам памяти. Например деструктор должен озаботится что там насоздавалось по ходу жизни класса и поудалять все. Но вобщето злоупотреблять ООП для МК не стоит, оно не оправдывается.
Например деструктор должен озаботится что там насоздавалось по ходу жизни класса и поудалять все. Но вобщето злоупотреблять ООП для МК не стоит, оно не оправдывается.
Вот как раз с надеждой на деструктор все и пишется. Метод раз вызвал -> данные поимел -> и забыл как страшный сон (почистил все нафиг).
А мк тоже всякие бывают (2мб оперативы тоже уже реальность;)
Например деструктор должен озаботится что там насоздавалось по ходу жизни класса и поудалять все. Но вобщето злоупотреблять ООП для МК не стоит, оно не оправдывается.
Вот как раз с надеждой на деструктор все и пишется. Метод раз вызвал -> данные поимел -> и забыл как страшный сон (почистил все нафиг).
А ежели дважды метод вызвал - все пропало? ;)
Ушёл за попкорном.
А мк тоже всякие бывают (2мб оперативы тоже уже реальность;)
Хоть 22Мб. Основная задача - работа с железом, его состав постоянный, следовательно динамически чего создавать нет смысла. И следом безсмысленным становится весь подход.
А мк тоже всякие бывают (2мб оперативы тоже уже реальность;)
Хоть 22Мб. Основная задача - работа с железом, его состав постоянный, следовательно динамически чего создавать нет смысла. И следом безсмысленным становится весь подход.
Это тоже не всегда так. К примеру есть у вас метеостанция на мк. В моем случае девайс могет работать с рядом датчиков, несколькими дисплеями, а также пользовать (или нет) некоторые сетевые сервисы. Т.е функционал и состав железа это нифига не const.
А еще мне стало нехватать ног, и я тупо (в прямом смысле походу) решил сменить мк.
Вот тут то и началось веселье на которое у kisoft ни какого попкорна не хватит
// К примеру есть у вас метеостанция на мк.
Нету. И нефиг на меня наговаривать.
// моем случае девайс могет работать с рядом датчиков, несколькими дисплеями
Значить выделяйте по максимуму. А воще сферического коня в вакууме нече обсуждать. Проект в студию, тогда поржем.
Это тоже не всегда так. К примеру есть у вас метеостанция на мк. В моем случае девайс могет работать с рядом датчиков, несколькими дисплеями, а также пользовать (или нет) некоторые сетевые сервисы. Т.е функционал и состав железа это нифига не const.
А еще мне стало нехватать ног, и я тупо (в прямом смысле походу) решил сменить мк. \
Самое удивительное, что дополнительные ноги можно подключить через канал поддерживающий цепочку 74HC595 , или другого железа. Вот ради ног менять МК не имеет смысла. А вот манеру программирования менять тяжко.
Это тоже не всегда так. К примеру есть у вас метеостанция на мк. В моем случае девайс могет работать с рядом датчиков, несколькими дисплеями, а также пользовать (или нет) некоторые сетевые сервисы. Т.е функционал и состав железа это нифига не const.
А еще мне стало нехватать ног, и я тупо (в прямом смысле походу) решил сменить мк. \
Самое удивительное, что дополнительные ноги можно подключить через канал поддерживающий цепочку 74HC595 , или другого железа. Вот ради ног менять МК не имеет смысла. А вот манеру программирования менять тяжко.
Схему в студию. Как подкючить microSD и допустим MAX7219 к одним и тем же ногам?
у kisoft ни какого попкорна не хватит
Вы недооцениваете запасы попкорна уважаемого коллеги.
Да в легкую 74HC595 к Ардуине, А ваши microSD и MAX7219 на выход.
Скетч https://yadi.sk/d/WaW7iUgj3GPUvp
Но вам придется написать свою библиотеку под microSD и MAX7219 работающие под такой канал, и да работать будет медленее. что для microSD и MAX7219 не сильно критично. Опять же зачем MAX7219 подключать через 74HC595 , если можно их обьединить в единый канал.
//Как подкючить microSD и допустим MAX7219
)))действительно, как два SPI поцепить на одну шину.
//Но вам придется написать свою библиотеку
просто форум библиотекарей! Уже любой пук в либу оформляют. Потому и либки под ардуины такого "ароматного" качества.
//Как подкючить microSD и допустим MAX7219
)))действительно, как два SPI поцепить на одну шину.
//Но вам придется написать свою библиотеку
просто форум библиотекарей! Уже любой пук в либу оформляют. Потому и либки под ардуины такого "ароматного" качества.
++
Разумеется. Зачем писать одно и тоже в каждой новой программе, когда можно код заимствовать. Вот только библиотека в Ардуине бедная , можно сказать самиздат. Поэтому и качество "литературы" херовое. О своей "литературе" ничего сказать не могу, так как раз в пол года меняется концепция. И с точки зрения новой концепции "старый" мой код становится "устаревшим". А новая концепция немного не доработана. Конечно хотелось бы найти "взрослый" учебник для программирования под Ардуиной. Но кроме "старого" и "нового" заветов ничего путного нет.
когда можно код заимствовать... раз в пол года меняется концепция
[/quote]
Противоречие, однако;)
Написать код, обеспечивающий функционал для конкретного проекта в много раз проще чем либу с некоторой универсальностю, тем более концептуально вывереную. А тем более отладить эту либу во всех её возможностях.А слепленая кое-как по одному проекту либка с этим проектом и умрет. Нефиг даже и старатся, только время убивается. Это пагубная практика.
Противоречие, однако;)
Написать код, обеспечивающий функционал для конкретного проекта в много раз проще чем либу с некоторой универсальностю, тем более концептуально вывереную. А тем более отладить эту либу во всех её возможностях.А слепленая кое-как по одному проекту либка с этим проектом и умрет. Нефиг даже и старатся, только время убивается. Это пагубная практика.
ПС: Я узнал просто очень много нового и под неожиданым углом. Вот из-за этого у меняется стиль . Написание библиотек навека , позволяет много раз шлифовать код. И да научился пользоваться Ctrl+F в неожиданых ситуациях.
Во во. Пагубная практика учится.
Учится не пагубно, пагубно посреди процесса фиксировать состояние в коде и осчастливливать мир новой либой. В если найдут? Либу в смысле;) Оч неудобная ситуация получится, вам начнут расказывать как она плоха, а вы уже и сами это знаете, научились ведь еще чемуто. За подробностями к Архату, он этот путь боли потоптал прилично)))
Я узнал просто очень много нового и под неожиданым углом. Вот из-за этого у меняется стиль .
Угу. И либы тоже шлифовать. И старые проекты которые перестают собиратся тоже доковыривать, а потом тестить. Процесс великолепен, но длителен. Результат не очень. Прежде всего по затратам времени.
И воще милое дело - взять девайс который 5 лет работает, чтоб запятую поправить, затем выяснить что с новой версией либы оно не совместимо концептуально и все навороты новой либы принципиально недоступны без переписывания всего старого проекта))).
А про повторное использование - ну вот захотелось мне снова шишек набить на 74HC595 (это не абстрактный пример, реально платку сегодня разводил). Так и шо, Вы думаете я провереный код из старого взял? Нет конечно, ровно 5 строк вывода байта заново насочинял. Работает на соплях уже. Так быстрей в целом, учитывая что в старом проекте вывод был напрямую в порт а в новом ESP и так быстро работает (и ХЗ где и как его порты вобще). А что MAX7219 много сложней?! Нет конечно. А уж комбинаторика MAX7219+SD и прочие варианты в либки пихать - нет в том смысла . Ну не получается код разбить на кубики-либы на все случаи жизни.
Самое сложное в либах... это комментарии , правильно составленные комментарии . Пишу комментарии на русском, так как это мой естественный язык для понимания. Язык то естесвенный, но термины , точнее правильное понимание терминов не очень. Приходится 100 раз писать, что бы окончательно понять, как правильно называть и применять их.
Опять же название переменных и методов. Ну здесь надо точно писать на английском. И правильное понимание английских терминов. Ведь в конечном счете что такое либа. Это система названий переменных и методов библиотеки. Так что можно пользоваться хоть новой, только что написаной, хоть старой в пыли завалявшейся , но английские названия переменных и методов должны совпадать. Ради этого и переписываются библиотеки. Для ну очень воинственных критиков написание свой библиотеки это изучение технического языка и терминов для программирования. Своего рода тест на знание анлийского языка как в написании , так и понимании.
Самое сложное в либах...
кому это, кроме тебя, интересно?
кому это, кроме тебя, интересно?
А я что все выкладываю сюда? А то что здесь выкладываю, так что бы не только новички говнокодом забивали форум. Говнокод есть и у бывалых, но по сравнению новичками это райская амброзия.
А я что все выкладываю сюда? А то что здесь выкладываю, так что бы не только новички говнокодом забивали форум. Говнокод есть и у бывалых, но по сравнению новичками это райская амброзия.
зачем ты это сюда пишешь? *попытка ответить на конкретный вопрос № 2
А кто нибудь помнит как тема называется? И какие вопросы в ней задавал ТС?
Qwone - чтоб подтвердить свое умение - конкретная задачка - сверните в класс пример для датчика DHT (Adafruint unifed sensor + DHT.h). С методами init и get_data.
Шоб на входе у init были пин подключения и тип, а у get_data на выходе h и t (округленые до uint8_t и int8_t), могете? Или тока языком филосовствовать?
Qwone - чтоб подтвердить свое умение - конкретная задачка - сверните в класс ...
Чтобы было больше конкретики попробуйте оформить в класс пример ....
От вас то точно один оффтоп
Вот скажите это остальным старожилам!
А то я просил присвоить мне звание "заслуженный флудераст", а они продинамили :(
А кто нибудь помнит как тема называется? И какие вопросы в ней задавал ТС?
Все помнят, кроме самого ТС. Ему (ТС) разные люди уже задолбались писать одно и тоже чуть разными словами:
выделять память на том же уровне, где и освобождать.
Вы знаете как правильно выделить память под такую структуру, как проинициализировать её, как потом освободить и т.п.? Это не так просто.
Сколько бы ни было памяти, если ее неправильно расходовать, то она все равно кончится.
Чем не устраивает передача в метод get_data указателей ... на структуру с этими переменными...?
Но у ТС не хватает квалификации понять, что это одно и тоже, что это и есть ответ на его главный вопрос, и что это говоряится опытными людьми по делу.
Зато у ТС хватает апломба со всеми спорить и всем что-то доказывать, в то время как сам не может написать описание метода, чтобы он хотя бы компилировался нормально.
Боюсь, что это тот самый случай, когда медицина бессильна и ТС не помочь. Разве что одумается и поможет себе сам.
ТС уже написал и ответил.
//Чем не устраивает передача в метод get_data указателей ... на структуру с этими переменными...?
Это не по фэншую. По фэншую это когда есть входные (проходные) и выходныне переменные, а передача указателя - это как GOTO <LABEL> Такая конструкция как раз и путает все карты, потому как данные изменяются внутри структуры неявно.
В тот-то и есть твоя проблема, что ты "итак всё знаешь лучше тех, к кому обращаешься".
Вот написали тебе люди "на одном уровне", "это не так просто". Если бы ты спросил "что это значит?", "почему не просто?", "чем плохо на разных уровнях?", "какова техника работы в такой ситуации?", тебе бы ответили и ты бы это уже знал. Заодно знал бы как правильно работать с памятью в разных ситуациях.
Ты же предпочёл, имея нулевые знания, со всеми спорить и всем что-то доказывать. И что ты доказал? То, что ничего не знаешь? В итоге выставил себя клоуном и народ уже начал посмеиваться и "запасаться попкорном".
Самоутвердился? Показал, что типа "не тварь дрожащая, а право имеешь". Молодец! Продолжай также. Многому научишься.
Это не по фэншую. По фэншую это когда есть входные (проходные) и выходныне переменные, а передача указателя - это как GOTO <LABEL> Такая конструкция как раз и путает все карты, потому как данные изменяются внутри структуры неявно.
Совершенно нет. Передача указателя совершенно нормальное, и как правило оч полезное, дело хотя здесь и не нужное. Передавать в метод класса данные из этого же класа - бред какойто. Вы ж спецом инкапсулируете данные и методы в один клас, чтоб не ганять данные как параметры, а иметь к ним прямой доступ. На самом деле, он будет через скрытый параметр, но то Вам покак не важно.
В тот-то и есть твоя проблема, что ты "итак всё знаешь лучше тех, к кому обращаешься".
"Тыкать" - плохой тон. Мы с вами даже не знакомы. На момент постановки вопроса я действительно плохо представлял как это сделать.
По поводу "почему не просто?", "чем плохо на разных уровнях?", "какова техника работы в такой ситуации?" я не спрашивал. И не вам решать как мне писАть.
Был задан конкретный вопрос, на который ни один из участников темы не дал конкретный ответ. Большинство сказало что так делать не правильно и сложно. А некоторые пришли просто пофлудить, поглумиться (поржать) над новичками. Хотя у самих за плечами пусто.
Конкретные ответы были, только ты их не понял в силу недостаточных знаний. А вместо того, чтобы задавать вопросы, начал спорить, а потом и хамить
Да, Боже упаси, конечно не мне решать что и как тебе пиасть. Также и то, что ты как не знал ничего перед началом темы, так и сейчас не знаешь - тоже вовсе не моя проблема. Тебе жить.
Хотел подсказать тебе как себя вести, чтобы от форума получать знания, а не глумление. Напрасно. Ты и в поведениии на форуме, также как в классах, всё знаешь лучше всех и в советах не нуждаешься.
Пока! Будь здоров и весел!
Был задан конкретный вопрос, на который ни один из участников темы не дал конкретный ответ.
ок.
Хочу внутри класса создать метод типа "структура"
Структура будет использоваться не только для данного класса.
Был задан конкретный вопрос, на который ни один из участников темы не дал конкретный ответ.
ок.
Хочу внутри класса создать метод типа "структура"
Структура будет использоваться не только для данного класса.
На этот вопрос ответ получен. Тема по этому вопросу закрыта.
Я порешал так:
На этом вопросы по теме считаю исчерпанными.
Это работает /метод metod1 внутри класса CL c типом "структура" stru/
Это не по фэншую. По фэншую это когда есть входные (проходные) и выходныне переменные, а передача указателя - это как GOTO <LABEL> Такая конструкция как раз и путает все карты, потому как данные изменяются внутри структуры неявно.
Странный у Вас феншуй какой-то...
Если указатель - это не по феншую, объясните, почему есть масса языков программирования, где передача возможна только по адресу и нет ни одного, где передача по адресу была бы невозможна.
PS. Скажите, а Вас не возмущает, почему программисты строем не ходят?
PS. Скажите, а Вас не возмущает, почему программисты строем не ходят?
Иногда ходят - https://www.vedomosti.ru/politics/news/2015/11/19/617525-shoigu-programmistov
)) Кстати новости то уж болььше года. Чем оно закончилось, хоть взвод тестировщиков набрали?
ПС. "Это ты на гражданке сеньером был, а здесь, душара, будеш в коде сержанта отступы выравнивать!" ))))