Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: константа: текст + число  (Прочитано 21110 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 03-02-2006 11:51 » 

мне надо умудрится сделать такую вещь: чтобы я мог задать int-константу одновременно с её текстовым представлением. То есть например я хочу определить DEF1 , я пишу:

Код:
#define DEF1_num 333
#define DEF1_txt "333"

int var = DEF1_num;
CString txt = "значение DEF1 = " DEF1_txt " попугаев";

а в идеале мне нужно определять не ДВЕ строки, а ОДНУ. Чтобы можно было бы

Код:
#define DEF1 333

int var = DEF1;
CString txt = "значение DEF1 = " F(DEF1) " попугаев";

где F() - это некая процедура препроцессора (или что-то типа того)

как это сделать? Оч неудобно для каждой константы писать две строки. Особенно если они перечислены в enum{};
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 03-02-2006 12:41 » 

Код:
#define CONST_NUM    1234
#define CONST_STR    "\"" ## CONST_NUM ## "\""
В одном только не уверен: поддерживает ли компилятор MS возможности объединения по "##"
« Последнее редактирование: 04-12-2007 20:45 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 06-02-2006 05:40 » 

неа, не работает...

но это и не то маленько

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 06-02-2006 06:21 » 

вот так вроде катит (классик накатал) :
Код:
class CNumText
{
int num;
CString text;

public:

operator char*()
{
return (char*)text.GetBuffer(0);
}

CNumText(int n)
{
num=n;
text.Format("%d",num);
}
};


CNumText nt(12345);

CString txt="("+nt+")";

ткните в ошибки, если есть, буду признателен
Записан

Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 06-02-2006 06:58 » 

а вот так не пробовал:
Код:
#define DEF1 333
#define STR(x) # x
#define F(x) STR(x)

void main ()
{
    printf("значение DEF1 = " F(DEF1) " попугаев\n");
}

Вывод: "значение DEF1 = 333 попугаев". Вроде бы изначально ты этого и хотел?..
К сожалению, работать будет только с дефайнами.
« Последнее редактирование: 06-02-2006 07:05 от Hooter » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 06-02-2006 07:11 » 

Hooter , нет не совсем то:

для define работает, а для енумки уже нет ...

   enum
   {
      f1=1,
      f2,
      f3,
   };
   txt="значение DEF1 = " F(f2) " попугаев";


"значение DEF1 = f2 попугаев";

Записан

Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 06-02-2006 07:12 » 

Да, для енумки и просто переменных работать не будет.
Записан
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 06-02-2006 07:29 » 

Можно обойтись просто функцией:
Код:
const char *tostr(int x)
{
    static char str[255];
    return _itoa(x, str, 10);
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 06-02-2006 07:48 » 

всем пасиба, меня, пожалуй, вот такой вариант устроил (не совсем универсально, правда):
Код:
class CNumText
{
CString text;
public:
operator char*()
{
return (char*)text.GetBuffer(0);
}
CNumText(int n)
{
text.Format("%d",n);
}
};
 
txt="значение DEF1 = "+CNumText(DEF1)+" попугаев";
Записан

Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 06-02-2006 08:27 » 

Ты собираешься менять значение text? Если нет, то вместо operator char* лучше бы ты сделал так:
Код:
operator LPCTSTR()
{
    return (LPCTSTR)text;
}
Так безопаснее... и правильнее Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 06-02-2006 08:32 » new

не люблю я эти громкие имена типов Улыбаюсь
я лучше char* заменю на const char*
Записан

Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 06-02-2006 09:04 » 

Я тож не люблю MFCшные сокращения Улыбаюсь const char * рулит Ага
Но GetBuffer там по-любому лишний.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 06-02-2006 09:18 » 

ну, я уже понял, что лишний Улыбаюсь
окончаткльный вар такой

Код:
class CNumText
{
CString text;
public:
operator const char*()
{
return (const char*)text;
}
CNumText(int n)
{
text.Format("%d",n);
}
};

Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #13 : 28-05-2007 07:29 » 

Код:
	operator const char*()
{
return text;
}

так короче
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 28-05-2007 09:02 » 

на определённом этапе я вообще пришёл к решению
Код:
#define AnyConstant       11
#define AnyConstant_txt  "11"

для моих задач это оказалось лучше Улыбаюсь
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 28-05-2007 18:09 » 

Хм, я бы так сделал. Раз уж всё-равно новый класс вводить

Код:
class CMyString : public CString
{
public:
CMyString(int nIntVal)
{
Format(_T("%d"), nIntVal);
}
};

Если уж очень хочется с дефайнами, то тогда можно типа так

Код:
#define DIGIT_1	12345
#define DIGIT_STR(x) CMyString((int)x)

Использовать, как угодно:

Код:

AfxMessageBox(DIGIT_STR(DIGIT_1));

AfxMessageBox(DIGIT_STR(12345));

AfxMessageBox(CMyString(12345));

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 29-05-2007 03:15 » 

Джон, а вот так уже не проканает Ага

const char* ch="начало текста "DIGIT_STR(x)" конэц текста";

а мой вариант
const char* ch="начало текста "AnyConstant_txt" конэц текста" ;// ->

const char* ch=="начало текста 11 конэц текста";

Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 29-05-2007 09:18 » 

Так я не понял, тебе константы нужны или макрос?

Ты же сам писал про ф-ю?


 
где F() - это некая процедура препроцессора (или что-то типа того)

А необходимый вариант


Код:
#define DEF1 333
int var = DEF1;
CString txt = "значение DEF1 = " F(DEF1) " попугаев";

Можно получить кучей других не менее сложных способов:

Код:
#define DEF1 333
int var = DEF1;
CString txt = "значение DEF1 = ";
txt += CMyString(DEF1) + " попугаев";

Ну и уж если так хочется, то CMyString можешь расширить на любые конструкторы, которые тебе надо, например для данного случая:

CMyString(char*,int,char*)

тогда в "одну строчку" записываем

Код:
#define DEF1 333
int var = DEF1;
CString txt = CMyString("значение DEF1 = ", DEF1," попугаев");

Можно расширить объек и ввести поле данных int, и сделать оператор преобразования типа int, чтобы от возвращал это значение. Правда надо будет перегрузить стандартный и другие конструкторы, "но это уже, как говорит наш многоуважаемый шеф, дело техники" (с)

Тогда ты вобще можешь делать с объектом что хочешь:

class CMyString : public CString
{
public:
   CMyString(int nIntVal)
   {
      m_nVal = nIntVal;
      Format(_T("%d"), nIntVal);
   }

   operator int()
   {
      return m_nVal;
   }

private:
   int m_nVal;
};

void ShowIncrementIntVal(int nVal)
{
   nVal++;
   AfxMessageBox(DIGIT_STR(nVal));
}

   
   CMyString st(10);
   AfxMessageBox(st); // здесь строка
   ShowIncrementIntVal(st); // здесь целый тип

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 29-05-2007 09:23 » 

да, я сначала не знал, что хотел просто )
мне именно как  константу надо получить, чтоб встроить в другую константу ещё при компиляции
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 29-05-2007 09:43 » 

да, я сначала не знал, что хотел просто )

5+ Улыбаюсь)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 29-05-2007 09:49 » 

дык ну оно так бывает иногда... )
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #21 : 29-05-2007 09:53 » 

Да не, эт я к тому, что форум у нас какой. Даже если не знаешь, что хочешь, так или иначе - поможет. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines