LINUX.ORG.RU

[C++] Как в плюсах принято делать s*printf?

 


0

2

Нужен «правильный» аналог s*printf. Вроде есть в плюсах stringstream, и из него можно брать числа, строки и т.п., т.е. что-то вроде sscanf. А нужно наоборот из примитивных значений сконструировать строку.

★★★★★

Ответ на: комментарий от panter_dsd

o не сдохнет. Сдохнет реузльтат o.c_str(), если это строка на стеке, или останется болтаться, если это строка в куче.

AIv ★★★★★
()
Ответ на: комментарий от anonymous

> временный объект сдохнет в конце полного выражения (full expression).

Вот за это и люблю С++. На этом такие красивые вещи делать можно

namezys ★★★★
()
Ответ на: комментарий от AIv

> Сдохнет реузльтат o.c_str(), если это строка на стеке, или останется болтаться, если это строка в куче.

Учите блин c_str и что это такое? Как минимум результат валиден до следующего обращения к о

namezys ★★★★
()
Ответ на: комментарий от panter_dsd

> Ты в своем уме? Не путаешь с snprintf?

В своём. Я явно писал про семейство функций (грепай «семейство функций» в посте). Топик стартер писал про семейство функций (грепай asterisk в его посте). Блин, почему с некоторыми фанатиками приходится объясняться как с имбицилами и повторять одно и то же несколько раз и указывать на очевидные вещи? Не понимаю.

Вот как раз основная проблема у sprintf - переполнение буфера.

А не основная какая? Да и основная не тянет на проблему - пожалуйста, либо гарантируй, что данные поместятся, либо ограничивай записываемые данные в размере (snprintf). Ещё есть, что сказать?

anonymous
()
Ответ на: комментарий от anonymous

> Локальный нестатический объект сдохнет когда выйдет из области видимости, временный объект сдохнет в конце полного выражения (full expression). Идите и учите язык.

Да что Вы говорите? Правда? Может поделитесь своими необъятными знаниями и сообщите мне что есть конец выражения expr1 в примере

func( expr1, epxr2, expr3 );

AIv ★★★★★
()
Ответ на: комментарий от namezys

> > временный объект сдохнет в конце полного выражения (full expression).

Вот за это и люблю С++. На этом такие красивые вещи делать можно

На мой взгляд отслеживание времени жизни всех объектов (плюс отслеживание создания всех временных объектов) является не то, чтоб не тру, но сильно загружающим программиста. Нет никакой прозрачности. За что тут любить С++? За искусное хождение по граблям? Не-не-не, ну нафиг. Можно выбрать инструмент и получше

anonymous
()
Ответ на: комментарий от AIv

> Не тратьте на этого ананимного придурка время, видимо еще один ВыскоПрофессиональныйПрограммист-недоучка с дипломом, к тому же хамло, к-му нечем занятся.

Куда же мне до вас, сударь! Видимо, в ваших устах «дурак» - это такой комплимент? Надо же. Или это двойные стандарты? А может, просто недалёкость?

Кстати, а недоучка с дипломом - это по-идее «доучка» по-вашему, так, я ничего не попутал?

anonymous
()

C++ builder через wine XD XD XD XD XD XD

anonymous
()
Ответ на: комментарий от anonymous

> На мой взгляд отслеживание времени жизни всех объектов (плюс отслеживание создания всех временных объектов) является не то, чтоб не тру, но сильно загружающим программиста. Нет никакой прозрачности. За что тут любить С++? За искусное хождение по граблям? Не-не-не, ну нафиг. Можно выбрать инструмент и получше

В ассемблере и не такие проблемы, тем не менее и на нем пишутЬ. Каждый инструмент хорош для своих задач, хотите ни о чем не париться - берите какую нить яву, хотите иметь высокую производительность - придется учитывать как все это на самом деле работает...

AIv ★★★★★
()
Ответ на: комментарий от anonymous

Похоже на тенденцию - адекватных людей, готовых качественно что-то обсудить - на лоре всё меньше и меньше. Про споры и флеймы - вообще не говорю. Ещё и модераты банят за шутки.

anonymous
()
Ответ на: комментарий от AIv

> Вы пример то посмотрели??? Представляете себе, 10^8 декартовых векторов, и в каждом еще как мин пойтер на стрковое представление???

В вашем первоначальном посте никаких требований не было. Был вопрос: как? На что вам предложили один из возможныж вариантов. Хранить строковое представление в самом классе может оказаться полезным, например, в случае если строковое представление затратно создавать.

anonymous
()
Ответ на: комментарий от anonymous

> На мой взгляд отслеживание времени жизни всех объектов (плюс отслеживание создания всех временных объектов) является не то, чтоб не тру, но сильно загружающим программиста

А по мне так все очевидно

namezys ★★★★
()
Ответ на: комментарий от AIv

> Может поделитесь своими необъятными знаниями и сообщите мне что есть конец выражения expr1 в примере

func( expr1, epxr2, expr3 );

Вам сказали «full expression»

namezys ★★★★
()
Ответ на: комментарий от anonymous

> например, в случае если строковое представление затратно создавать.

Чтобы вам было понятнее: по сути это кеш.

anonymous
()
Ответ на: комментарий от AIv

> В ассемблере и не такие проблемы, тем не менее и на нем пишутЬ. Каждый инструмент хорош для своих задач, хотите ни о чем не париться - берите какую нить яву, хотите иметь высокую производительность - придется учитывать как все это на самом деле работает...

Спасибо, просветили. Знаете, я не буду слушать ваш бред и выбирать джаву, потом, изучать, как же можно её использовать с такой же эффективностью (по производительности и потреблению ресурсов, включая RAM) для критичных приложений - я просто возьму Си. Мне вполне хватает assembler'a + Си для задач, требующих «высокой производительности» и работы с железом. Мне важно, как работает мой код с железом и как он взаимодействует с остальным «миром» (а-ля сторонними компонентами кастомеров), а вот как в моём языке взаимодействуют объекты - это лишнее. Это неважно, это полностью лишнее. Посмотрите /usr/src/linux - нет никаких C++. Почему? Потому что они не нужны ж) Есть другие инструменты, которые проще использовать и эффективнее решать задачи

anonymous
()
Ответ на: комментарий от anonymous

> Кстати, а недоучка с дипломом - это по-идее «доучка» по-вашему, так, я ничего не попутал?

Неудоучка с дипломом - это личность имеющая диплом но, не обладающая знаниями этому диплому соотвествующими, это примерно 80% нынешних выпускников. Черем меня такие пачками проходят - надо конечно отчислять, да жалко, в армию ж заберут и там покалечат...

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

Дурак - это краткое определение IQ собеседника, отвечающего не прочитав внимательно вопрос. Вам подходит.

AIv ★★★★★
()
Ответ на: комментарий от namezys

> А по мне так все очевидно

Что очевидно? Вы держите в голове кучу интерфейсов классов и их конструкторы + операторы =? Ну да, тогда очевидно. Не спорю. Jedem das seine

anonymous
()
Ответ на: комментарий от AIv

> Черем меня такие пачками проходят - надо конечно отчислять, да жалко, в армию ж заберут и там покалечат...

Еще один возомнил себя преподом! Сколько же можно терпеть на лоре бредни этих людей не осиливших азы С++, но мнящих себя профессионалами?

anonymous
()
Ответ на: комментарий от anonymous

> Что очевидно? Вы держите в голове кучу интерфейсов классов и их конструкторы + операторы =? Ну да, тогда очевидно.

Объект существует, пока виден.

Интерфейс существует, пока на него кто нить ссылается (для интерфейсов использую подсчет ссылок)

namezys ★★★★
()
Ответ на: комментарий от AIv

> Неудоучка с дипломом - это личность имеющая диплом но, не обладающая знаниями этому диплому соотвествующими, это примерно 80% нынешних выпускников. Черем меня такие пачками проходят - надо конечно отчислять, да жалко, в армию ж заберут и там покалечат...

Отчисляйте смело, а то, благодоря таким, как вы - мы не можем найти адекватных специалистов - фиг отфильтруешь по «бумажкам» и резюме - приходится тратить время.

Дурак - это краткое определение IQ собеседника, отвечающего не прочитав внимательно вопрос. Вам подходит.

Судя по вашему русскому языку в ваших постах, вы - дурак! (не смотря на мою забывчивость + использование русского языка только на сайтах вроде лора - вы ооочень неграмотны, не стыдно? А ещё и в России живёте, и тычите всем)

Кстати, может блеснёте своими способностями угадывать название специализации у людей на других континентах? Любопытно будет оценить точность определения диплома от расстояния. Я нахожусь в bay area, а вы где?

anonymous
()
Ответ на: комментарий от anonymous
void someFunc (int value) {
  char buf [4] = {'\0'};

  snprintf (buf, 4, "%d", value);
  //Some code
}

someFunc (10);
//After some time need someFunc (10000);

Видишь косяк? При использовании потоков такого косяка нет.

panter_dsd ★★★★
()
Ответ на: комментарий от pozitiffcat

> ИМХО в проекте состоящем хотя бы из двух модулей, хоть один указатель да появится ;-)

Инкапсулировать его от глаз подальше + обернуть в смарт-пойнтер.

anonymous
()
Ответ на: комментарий от pozitiffcat

> это как! совсем? ИМХО в проекте состоящем хотя бы из двух модулей, хоть один указатель да появится ;-)

std::auto_ptr, boost::shared_ptr, boost::smart_ptr и другие для этого есть. Или самим написать подходящее.

Не когда не должно быть свободного указателя, которым не кто не владеет

namezys ★★★★
()
Ответ на: комментарий от anonymous

1) Я себя преподом не возомнил, я преподом работаю 10 лет, это видимо всеобщее заблуждение?

2) Давно уже считаю себя профессионалом в С++, у меня неск иное направление деятельности.

3) Научитесь себя вести, а потом лезте в общество.

AIv ★★★★★
()
#include <stdio.h>

class A
{
public:
    enum {ToStr_BufferSize=50};
    inline void ToStr_fill(char* buf)
    {
        buf[0]='A';
        buf[1]='B';
        buf[2]='C';
        buf[3]='\0';
    }
};

template<typename T> class ToStr
{
public:
    char buf[T::ToStr_BufferSize];
    inline const char* at(T& obj)
    {
        obj.ToStr_fill(buf);
        return buf;
    }
};

int main(int argc, char *argv[])
{
    A obj;
    
    printf("Result=%s\n",ToStr<A>().at(obj));
}

Может что-то на шаблонах замутить? У кого какие идеи?

pathfinder ★★★★
()
Ответ на: комментарий от panter_dsd

> Вот как раз основная проблема у быдлокодеров - переполнение буфера.

fixed.

arsi ★★★★★
()
Ответ на: комментарий от namezys

> Самое важно в С++ --- не использовать указатели

Разумно, но... ммм.... как бы сказать... Слишком такой подход рвёт шаблоны ;) Лично меня в С++ бесит (и мешает использовать) - это каша в ABI для разных компайлеров и т.д. Как вы с ней боритесь? Делаете Сишный интерфейс?

anonymous
()
Ответ на: комментарий от panter_dsd

Ты сознательно ограничил длину буфера до 4 символов, зн-т тебе это зачем-то надо было.

При использовании потоков такого косяка нет.

Точно также и в потоках можно сознательно ограничить длину.

anonymous
()
Ответ на: комментарий от namezys

А можно вопрос дилетанта (раз пошла такая пьянка). Что делать, если указатель на объект в стеке а не в куче? Как с ним smart_pointer поступит?

AIv ★★★★★
()
Ответ на: комментарий от anonymous

> это каша в ABI для разных компайлеров и т.д. Как вы с ней боритесь? Делаете Сишный интерфейс?

Не давать этой каше образовываться. Один компилятор должен быть

namezys ★★★★
()
Ответ на: комментарий от AIv

> Я себя преподом не возомнил, я преподом работаю 10 лет, это видимо всеобщее заблуждение?

Гнать таких преподов из универов поганой метлой. А студентов ваших реально жалко стало.

Давно уже считаю себя профессионалом в С++, у меня неск иное направление деятельности.

У вас явно завышенная самооценка по С++. Смею предположить, что вы работаете в универе потому что вас просто на просто никуда больше не взяли на работу.

anonymous
()
Ответ на: комментарий от AIv

> Что делать, если указатель на объект в стеке а не в куче?

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

Если экслюзиваное, то нужно ли вообще объект создавать в куче (может достаточно на стеке)?

Давайте более точный пример - разберу

namezys ★★★★
()
Ответ на: комментарий от AIv

> Что делать, если указатель на объект в стеке а не в куче? Как с ним smart_pointer поступит?

Смарт-пойнтеры используются только для объектов в куче. Потребности в смарт-пойнтерах для автоматических объектов нет.

anonymous
()
Ответ на: комментарий от pozitiffcat

Вообще подумайте, что будет, если вылетит исключение


void a()
{
    SomeBigObject *a = SomeBigObject int;
    do_smth(a); // вот тут вылетело
    delete a;
}

namezys ★★★★
()
Ответ на: комментарий от anonymous

Блин, не так вопрос прочитал...

Нельзя держать указатели на объекты из стека. Вообще. Есть ссылки для этого

namezys ★★★★
()
Ответ на: комментарий от namezys

Вопрос был абстрактный, возник давно (когда я с этими пойнтерами познакомился). С-но я так и предполагал, но была мыслишка - вдруг придумали механизЪм для определения тго, где объект живет;-)

Спасибо.

AIv ★★★★★
()

Qt няшка!

http://doc.qt.nokia.com/latest/qstring.html#note-for-c-programmers

Note for C Programmers
Due to C++'s type system and the fact that QString is implicitly shared, QStrings may be treated like ints or other basic types. For example:

QString Widget::boolToString(bool b)
{
    QString result;
    if (b)
        result = "True";
    else
        result = "False";
    return result;
}
The result variable, is a normal variable allocated on the stack. When return is called, and because we're returning by value, the copy constructor is called and a copy of the string is returned. No actual copying takes place thanks to the implicit sharing.

anonymous
()
Ответ на: комментарий от AIv

> 1) Я себя преподом не возомнил, я преподом работаю 10 лет, это видимо всеобщее заблуждение?

Видимо ты себя так ведёшь, что все думают, что ты обычный школьник, да ещё и молодой фанатик с++, каких здесь навалом

2) Давно уже считаю себя профессионалом в С++, у меня неск иное направление деятельности.

Я не совсем понял построение предложения. Вы частичку «не» не пропустили?

3) Научитесь себя вести, а потом лезте в общество.

Оха, обязательно. Сделаю. Как только уважаемые и неуважаемые регистраты перестанут называть собеседников дураками и при том же 5 минут спустя тыкать в «неправильное» поведение. Смешно со стороны смотреть на господина преподавателя, да ещё и «профессионалом в С++» ;)

anonymous
()
Ответ на: комментарий от AIv

Есть слыбые ссылки для такого. Это надстрока, работает не плохо

namezys ★★★★
()
Ответ на: комментарий от anonymous

> Смею предположить, что вы работаете в универе потому что вас просто на просто никуда больше не взяли на работу.

lol :D

Я наслышан об уровне зарплат в универах - поэтому соглашусь...

anonymous
()
Ответ на: комментарий от anonymous

> Гнать таких преподов из универов поганой метлой. А студентов ваших реально жалко стало.

А мне то их как жалко... А им то себя как жалко, даже не представляете!

У вас явно завышенная самооценка по С++. Смею предположить, что вы работаете в универе потому что вас просто на просто никуда больше не взяли на работу.

Если вы батенька на работе предполагаете так же как здесь - мне жалко ваших заказчиков и коллег. Хотя вы ж сами объяснили почему вы работаете - квалифицированных людей мало, а тут чел стока умных слов знает... Понятно почему в последнее время софт такое г-но по большей части.

Я дальнейшую дискуссию в таком ключе поддерживать не хочу, да и времени нету. Но позабавили изрядно, спасибо!

AIv ★★★★★
()
Ответ на: комментарий от anonymous

Ты сознательно ограничил длину буфера до 4 символов, зн-т тебе это зачем-то надо было.

А ты на сколько бы ограничил? И всегда бы прокатывало твое ограничение?

panter_dsd ★★★★
()
Ответ на: комментарий от AIv

> Вопрос был абстрактный, возник давно (когда я с этими пойнтерами познакомился). С-но я так и предполагал, но была мыслишка - вдруг придумали механизЪм для определения тго, где объект живет;-)

Так вы, господин Alv, профессионал в С++? Палку не перегнули?

/facepalm

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.