| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > очень красивая функция с помощью профессионалов |
| Автор: segadir 7.9.2010, 15:54 | ||||
написал простенькую функцию на Си
а именно: Как вы уже заметили я использую глобальные массивы, что не есть гуд! Вот бы переделать её так что бы она стала указателем на результат, т.е.
эта функция очень маленькая, поэтому прошу !проффи! , мне очень хочеться посмотреть как можно до совершенства решить такую задачку. спасибо. |
| Автор: djamshud 7.9.2010, 16:16 | ||||
Непрофессионал делает так:
Сейчас вам еще покажут плюсовый пример на каком-нибудь boost-е. Добавлено через 2 минуты и 51 секунду Хм. Это этот дефайн легко превращается в обычную функцию. Изначально он был сложнее - буфер передавался как один из параметров дефайна, поэтому функция не подходила - sizeof(buf) не работал как задумано. |
| Автор: segadir 7.9.2010, 16:25 |
| можно обойтись без задания конкретной длины 128? ведь формат может быть по длинее. ну вообще довольно таки здорово! Спасибо! allprofi Будут ли еще варианты? |
| Автор: djamshud 7.9.2010, 16:30 | ||
Вот раскопал оригинальный дефайн. Первым параметром передается заранее приготовленный буфер нужной длины. Но я от этого варианта отказался, потому что на деле 128 байт хватает с головой, а громоздкость кода значительно уменьшается. Пожалуйста! |
| Автор: boostcoder 7.9.2010, 17:44 |
| djamshud, глобальный буффер... именно. благо что говорится про Си. ибо в с++ нельзя использовать strftime(). единственный абсолютно правильный вариант - http://www.boost.org/doc/libs/1_44_0/libs/format/doc/format.html |
| Автор: segadir 7.9.2010, 17:55 | ||
| очень хотел бы услышать про то как можно отказаться от фиксированной (128) длины массива, т.е. длина сама бы задавалась в зависимости от входной строки. как вариант сделать - динамическим но может есть что либо так сказать "по изящнее" ? а?
|
| Автор: borisbn 7.9.2010, 17:58 |
| IMHO функция по-любому лучше. 1. Можно сделать параметр форматирования по-умолчанию, например "dd.MM.yyyy hh:mm:ss" 2. Можно вернуть std::string 3. Буфер можно выделить на стеке и зачем в конце делается ? |
| Автор: Sartorius 7.9.2010, 17:58 |
| |
| Автор: segadir 7.9.2010, 18:04 | ||
да но я думаю это спарведливо только к С++??? или нет? |
| Автор: borisbn 7.9.2010, 18:08 |
только а выделить память на стеке можно и в Си. Правда в данном случае от неё толку не будет, потому, что вернуть char * на такую память нельзя вернее можно, но получишь краш :( кстати, твоё замечание нужно адресоватьи boost'овцам |
| Автор: icecrashldr 7.9.2010, 19:22 | ||||||
| Мне опять скучно ... 1) Локальный буфер
Оформляем
Буфер будет локальным, и в пределах блока который был в дефайне, и "драки" имен между переменными быть не должно. 2) Глобальный буфер Выше описанный спсоб будет работать, вот только в много поточном приложении будет плохо так что либо синхронизация(Mutex, CriticalSction) или переменная нити(потока) __declspec(thread) для студии. Sartorius, Можно, но только это микс С с С++, не которые личность утверждают что это от лукавого, но каждому свое. borisbn
Креш не получи, так как память валидная, а вот гарантировать валидность данных, это не получится, так как при "закрутки" стека компилятор волен выбирать метод самостоятельно, так что это вы правы использовать НЕЛЬЗЯ. |
| Автор: djamshud 8.9.2010, 10:56 | ||
| boostcoder, во-первых, не каждое приложение многопоточно; во-вторых, многопоточность - костыль; в-третьих, буфер локален в пределах одного объектного файла. Но вообще, да :). borisbn, >и зачем в конце делается Чтобы "вернуть" указатель из макроса. См., как раскрывается макрос в код. icecrashldr, >локальный буфер В общем да, только я его немного пропатчу для ТС:) "({})" - GCC-шное расширение, но без него никак: обычный #define macro{...} раскроется в код и все испортит, #define macro ... и нормальной "локальной" tm не сделает, и код попортит. segadir,
Но обнаружился неприятный баг strftime-а: если сформированная им строка-дата не влезает в отведенный буфер, функция мало того, что не выставляет \0 в его конец, так еще и возвращает неправильный return value. В приведенных примерах я это пофиксил, но думается мне, надо писать багрепорт в ГНУ, т.к. в мане про этот баг ни слова не нашел. |
| Автор: azesmcar 8.9.2010, 10:58 |
это еще почему? |
| Автор: djamshud 8.9.2010, 11:12 |
| azesmcar, потому что рулит многопроцессность либо изначальное затачивание программы для многопоточного (десятки и сотни нитей) решения чего-нибудь на кластере. В обоих случаях это отдельно оговаривается и соответствующим образом проектируется все приложение, и обозначенной проблемы не будет. В этом топике я холиворить больше не буду |
| Автор: segadir 8.9.2010, 13:47 | ||
Подводя итоги:
профи (без сарказма) что скажите? profit? |
| Автор: borisbn 8.9.2010, 14:45 |
| segadir, если не секрет, какая необходимость использовать именно Си, а не Си++ ? Изучение ? Компилятор не поддерживает плюсы ( какая-нибудь ARM-архитектура ) ? |
| Автор: segadir 8.9.2010, 15:04 |
| 1 - причина изучив Си перехожу на С++ 2 - пока программирую под АВР микроконтроллеры 3 - а по чему бы и нет? П.С. Си vs С++ вечная тема |
| Автор: djamshud 8.9.2010, 15:14 |
| segadir, чем вам не нравится мой последний вариант с функцией? У вас все с одной стороны излишне сложно, а с другой - держится на подпорках. Например strlen data = strlen format * 2. Формат %T -> данные hh:mm:ss -> fail. Кроме того, strlen - некомильфо, медленная функция. |
| Автор: segadir 8.9.2010, 15:28 | ||
| djamshud, почему не нравится? кто сказал? очень даже оригинальненько, Я у вас идейку повзаимствовал, с buf=malloc(len); маленький минус: всёже нужно знать заранее размер строки а где еще предложения (лень? : true : false) , или тут только один профи djamshud, кстати есть у кого поучиться! Формат %T -> данные hh:mm:ss -> fail. Да ксожаленью, вы правы хоть программа и не упала, но всётаки так и есть :( буду думать: 1 вариант заранее разбирать входную строку на наличие сокращений %Y %D и тд - (не хорошо как-то) 2 вариант выделить памяти в 10 раз больше (ваще не рационально) 3 вариант организовать полную динамичность по условию
|
| Автор: boostcoder 8.9.2010, 15:52 |
он конечно не дубень... но! я по глубоким убеждениям(и профф обязанностям) не изобретаю велосипеды. свой ответ я дал. и он _самый_правильный_. |
| Автор: djamshud 8.9.2010, 16:17 |
| boostcoder, ваш ответ плюсовый и бустовый. А ваше мнение о самой правильности своего ответа лишь отражает ваше зазнайство:). Чем он, к примеру, правильнее QDate? А что, если (о боже!) нет с++? segadir, да я всего лишь любитель:). |
| Автор: borisbn 8.9.2010, 16:23 | ||
что в CRT ( snprintf и т.п.), что в boost'е, что в Qt делают именно так |
| Автор: boostcoder 8.9.2010, 16:25 | ||
в своем первом посте я это подметил.
похоже я вас чем-то зацепил... я не намеренно. QDate - http://www.insidecpp.ru/antipatterns/blob/. я бы не в коем случае не стал сие использовать. дабы не стать посмешищем для знакомых/коллег если нет плюсов.. я бы сменил работу, на ту, где нет Си |
| Автор: djamshud 8.9.2010, 16:33 |
| boostcoder, >похоже я вас чем-то зацепил... я не намеренно. Нее, я как слон:) >QDate - Blob. QDate != Blob. Он делает ровно то, что должен уметь делать класс-дата. Это во-первых. А во-вторых, паттерны, антипаттерны - задротство, программирование ради программирования. Всегда нужно исходить из задач. >если нет плюсов.. я бы сменил работу, на ту, где нет Си Слабак!:) |
| Автор: boostcoder 8.9.2010, 16:43 |
делать то он делает. но все равно blob. будь у вас хорошие познания в с++ и паттернах, вы бы поняли что это blob. какой кочмар о чем же тогда пишут Саттер, Александреску, Страуструп... с вами все ясно. продолжать не вижу смысла. и это вы мне говорите про зазнайство? Добавлено через 4 минуты и 28 секунд существуют стандарты по написанию кода с++. и несоблюдение этих стандартов, частенько(почти всегда) заводит проект в стадию _невозможности_поддержки_/_невозможности_развития_. так же, многие конторы, просто не позволят писать так, как тебе хочется/можется/нравиться. и я с этим абсолютно согласен. |
| Автор: djamshud 8.9.2010, 16:52 |
| boostcoder, Саттер - не читал; Александреску - читал, осуждаю; мужик на шаблонах свихнулся; Страуструп - читал, в общем одобряю. >будь у вас хорошие познания в с++ и паттернах, вы бы поняли что это blob. >с вами все ясно. продолжать не вижу смысла /me пошел http://forum.vingrad.ru/forum/act-ST/f-92/t-309495/unread-1.html. >и это вы мне говорите про зазнайство? А чо не так? :) |
| Автор: segadir 8.9.2010, 17:00 |
| не мужики, я не лезу вас разьединять, но может поможите доработать функцию? если каждый по своему её напишет мне от этого только выгода. |
| Автор: boostcoder 8.9.2010, 17:10 |
глянул на http://doc.qt.nokia.com/4.6/qdate.html... и, собственно соглашусь, не blob. просто вспомнился http://doc.qt.nokia.com/4.6/qstring.html. |
| Автор: djamshud 8.9.2010, 17:21 |
| boostcoder, >просто вспомнился QString. Это да. Тоже считаю его монстроузным. >существуют стандарты по написанию кода с++. и несоблюдение этих стандартов, частенько(почти всегда) заводит проект в стадию _невозможности_поддержки_/_невозможности_развития_. Ну глупость же пишите. Все зависит от умения проектировать свои решения. >так же, многие конторы, просто не позволят писать так, как тебе хочется/можется/нравиться. и я с этим абсолютно согласен. Это плохие конторы, и мне очень жаль, что вам приходится работатать именно в них. Постановка производства софта на конвеер экономически, конечно, выгодно, но без пространства для маневра не будет творцов, а без творцов - шедевров. |
| Автор: icecrashldr 8.9.2010, 17:33 |
| segadir, Готовое решение? шевели мозгами .. Могут написать код за тебя, можешь найти готовое решения, можешь реализовать как хочешь, лишь бы работало, но станиш ли от это лучше программировать? нет ... boostcoder, Соглашаюсь с вашими постами, вот только не все гладко, как пишет выше упомянутые люди. Конечно, когда дают новый проект, пишу мол типо как хочешь, тут конечно все(по крайней мере многое, ведь код всегда хочется сделать лучше) сработает. А вот мне например сейчас дали патчить xwin от cygwin, вот тут то и понимаешь, что паттерны применить как то не реально Предлогал переписать. сказали ни ни, хотя я бы в одиночку бы справился ... |
| Автор: boostcoder 8.9.2010, 17:34 | ||
может хватит самолюбие тешить. об этих стандартах я и говорю. вы же, не понимая моей мысли, ни имея представления о _стандартах_проектирования_, пытаетесь возвысить себя, на, я бы сказал, _пустом_многословии_. заканчивайте с этим. ну... не верный вы способ выбрали.
естественно! ведь стандарты проектирования разрабатывают глупцы, не ровень вам пустое все... Добавлено @ 17:42 во первых - если это Си, то да, тут мало пространства для выбора. во вторых - если с++, но проект нужно изрядно расширить, то в этом случае, нужно углубленно проанализировать имеющийся проект. что весьма не тривиально. и от этого зависит правильность принятия решения. так же, замечу, что анализом может заниматься далеко не каждый программист. и естественно, и от этого фактора, так же, зависит правильность принятия решения. выполнив оба требования, и только после этого принимать решение, изменять проект используя паттерны, или же писать с нуля используя паттерны. я обычно предпочитаю второе. |
| Автор: icecrashldr 8.9.2010, 18:40 | ||
| В основном конечно С, но где то видел С++. Мало того куча багов, производительность желает лучшего, так еще и баги жестокие. Какое рефакторинг? если делать так по новому. Вот только время, не кто на это не выделит, а это 1307 файлов(пакрайней мере в моей версии) и каждый файл 1000 строк, вот его и пересмотреть то не возможно. Так что паттерны это хорошо, вот только не всегда применимы... Часть партянки.. для смеха ...
|
| Автор: boostcoder 8.9.2010, 18:42 |
| это кусок какого-нибудь wndproc? Добавлено через 2 минуты и 3 секунды уточню: если проект написан на Си, то это не означает что нельзя использовать паттерны с++. другое дело, что нет компилятора с++, или по каким-то соображениям это недопустимо. |
| Автор: icecrashldr 8.9.2010, 18:59 | ||
Ага
Это без проблем ... Вот только "врукить" осталось, как сделать отрисовку при движении окон |
| Автор: djamshud 8.9.2010, 19:04 |
| boostcoder, одному анонимусу возвышаться над другим? Увольте:). И не принимайте все так близко к сердцу;). Вы меня немного не так поняли или я не совсем так выразился. Я знаком с паттернами по книге design patterns (хз кто автор) и некоторым публикациям в интернетах. И я прекрасно вижу, когда использую те или иные из них, или когда использую антипаттерны. Я же говорю, что слепое следование правилам "во! паттерн! ###ись!" и "антипаттерн? нет пути!" - зло. И еще большее зло, когда их навязывай тебе твой работодатель. Во-первых,.. Ой, сейчас я рожу много буков, погуглите лучше criticism of patterns. Добавлено через 16 секунд The book's authors are Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides with a foreword by Grady Booch. Во кого я читал. |
| Автор: icecrashldr 8.9.2010, 19:06 | ||
А вот так у нас пишет TEAM LEADER, после такого хочется вообще забить на это *** (Я не знаю как выразится)
|
| Автор: boostcoder 8.9.2010, 19:13 | ||
в данной ситуации, switch() очень легко заменить на, к примеру:
вот так разбили этот огромный кусок на кучу мелких. и за одно избавились от switch()(который я не приемлю, так же как и goto)(но это имхо). Добавлено через 1 минуту и 13 секунд зы код не проверял |
| Автор: icecrashldr 8.9.2010, 19:16 | ||
| Вариантов масса, меню на все вкусы .. Вот только ТИМУ это не объяснить, он утверждает,
|
| Автор: boostcoder 8.9.2010, 19:19 |
уау! был у меня в команде такой товарысч. точно так же говорил. погнал к х... его. |
| Автор: bsa 8.9.2010, 21:44 | ||||
Поддерживаю boostcoder. Гнать его надо. Правильная работа программы не является достаточным условием ее качественности. Дай своему тиму ссылку на форум (а лучше две - одна на часто задаваемые вопросы этого раздела), пусть попробует нас переубедить. |
| Автор: xvr 9.9.2010, 10:34 | ||||||
Хорошо так пишет - этакая хорошо структурированная спагетина из помеси С++ и realloc'ов Как в анекдоте: - Что сказал папа, когда узнал, что ты разбил его машину? - Матерные слова опустить? - Конечно - Тогда ничего
Ему некогда - он КОД пишет |
| Автор: icecrashldr 9.9.2010, 11:25 | ||
Ага, вот только есть одна проблема... Я написал и отладил(уже несколько месяцов все работает стабильно) NT сервис + драйвер. Сервис предоставляет способ общения с драйвером обходя повышения привилегий. Работа построена через пайпы. Handle пайпа закрывается только по факту закрытия со стороны клиента(Либо при выгрузки драйвера, отключения устройства) И уже были случаи когда пайп не закрывался со стороны клиента, соответсвено утечка ресурсов в двух местах.(А как я это вычислял ... ) А как было весело, отлаживать его stack overflow(он на стеке создавали переменные больше метра, грубо говоря "распыляя память"), и при этом он утверждал "ты же системный программист". А вот гнать его не получится, скорее всего меня уволят (( П.С. Про архитектуру не спрашивайте, это не я придумывал ... |
| Автор: bsa 9.9.2010, 12:51 |
| icecrashldr, "гнать его надо" - это не указание к действию, а отношение к специалисту. |
| Автор: icecrashldr 9.9.2010, 13:05 |
| |
| Автор: xvr 9.9.2010, 13:41 | ||
Судя по коду я бы слово специалист взял в кавычки |
| Автор: boostcoder 9.9.2010, 14:44 | ||
в моем случае, это было действие |