crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

kuler
  опции профиля:
сообщение 16.1.2009, 14:59
Сообщение #1


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


есть enum EnThreadState {tsNone, tsGetEquipmentStringList}
хотелось бы чтобы в коде можно было получить строку (скажем char*) по элементу, то есть char* str = func(tsNone) и теперь str = "tsNone".
Не знаете?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V   1 2 3 >  
Начать новую тему
Ответов (1 - 26)
AD
  опции профиля:
сообщение 16.1.2009, 15:03
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(kuler @ 16.1.2009, 14:59) *
есть enum EnThreadState {tsNone, tsGetEquipmentStringList}
хотелось бы чтобы в коде можно было получить строку (скажем char*) по элементу, то есть char* str = func(tsNone) и теперь str = "tsNone".
Не знаете?

На ум приходит два метода:
1) switch case :)
2) использование контейнера map
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 16.1.2009, 15:09
Сообщение #3


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


AD,
это все понятно но надо без лишнего геморроя
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.1.2009, 15:09
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


kuler, а почему тема здесь, ты хочешь средствами стандартной библиотеки С?

И слово команда в заголовке сбивает с толку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 16.1.2009, 15:20
Сообщение #5


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(Litkevich Yuriy @ 16.1.2009, 15:09) *
а почему тема здесь, ты хочешь средствами стандартной библиотеки С?

это вроде не может быть функция библиотеки, это функция компилятора
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.1.2009, 15:24
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Не совсем, это скороей языковые обороты, в моем варианте препроцессорные:
enum EnThreadState {tsNone, tsGetEquipmentStringList};
#define THREADSTATE( sz) #sz

#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << THREADSTATE( EnThreadState::tsNone) << std::endl;
    std::cout << THREADSTATE( EnThreadState::tsGetEquipmentStringList) << std::endl;

    std::cout << THREADSTATE( tsNone) << std::endl;
    std::cout << THREADSTATE( tsGetEquipmentStringList) << std::endl;

    return 0;
}
:)

Сообщение отредактировал ViGOur - 16.1.2009, 15:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 16.1.2009, 15:31
Сообщение #7


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


ViGOur,
а в чем смысл? #sz? _tmain?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.1.2009, 16:01
Сообщение #8


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Ты компилировал пример?
В нем возвращается имя твоего параметра в строковом представлении...
#sz - строковое представление твоего параметра
_tmain - сгенерировала студия, переименуешь в main ничего не случится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.1.2009, 16:15
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ViGOur, я забыл, а что означает одна решетка в макросах.
Две я помню - это сцепление строк.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.1.2009, 16:33
Сообщение #10


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Litkevich Yuriy @ 16.1.2009, 16:15) *
Две я помню - это сцепление строк.
Одним словом - конкатенация.

Не помню как это называется, но помню, что так нужно делать, если нужно получить не значение переменной, а её имя, когда не знаешь его, а очень нужно. :)

Разумеется это относится к макросам.

Думается мне, что место этой теме в технике программирования, как считаешь kuler?
Просто компиляторами тут пока даже и не пахнет.

Сообщение отредактировал ViGOur - 16.1.2009, 16:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 16.1.2009, 16:50
Сообщение #11


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(ViGOur @ 16.1.2009, 16:33) *
Просто компиляторами тут пока даже и не пахнет.

а что же это тогда? это ни в коем разе не библиотека, ибо в коде нет данных о названиях переменных, методов и тд.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 16.1.2009, 16:55
Сообщение #12


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Можно еще вот так (подсмотрено на http://stackoverflow.com/questions/201593/...-enum-to-string)

содержимое файлика colours.def
X(Red, "red")
X(Green, "green")


ну и сам код)
enum Colours {
#define X(a, b) a,
#include "colours.def"
#undef X
    ColoursCount
};

char const* const colours_str[] = {
#define X(a, b) #b,
#include "colours.def"
#undef X
    0
};

int main()
{
    std::cout << colours_str[Green] << "\n";
    return 0;
}


Ну и про макросы обобщим:
# - в строку
#@ - в char
## - слепить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.1.2009, 17:02
Сообщение #13


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(kuler @ 16.1.2009, 16:50) *
а что же это тогда? это ни в коем разе не библиотека, ибо в коде нет данных о названиях переменных, методов и тд.
я понимаю, в технике программирования необязательно обсуждение библиотек, но и языков тоже.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.1.2009, 17:28
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ViGOur, я думаю это все таки к компиляторной теме ближе.

название темы немного перефразировал
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 16.1.2009, 17:29
Сообщение #15


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


ViGOur,
все просек, # рулит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.1.2009, 17:29
Сообщение #16


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Litkevich Yuriy @ 16.1.2009, 17:27) *
ViGOur, я думаю это все таки к компиляторной теме ближе.
Хорошо, соглашусь с вами, 2 против одного. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 16.1.2009, 17:55
Сообщение #17


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


стоп!
а так не работает:
EnThreadState state;

state = tsNone;
string str = THREADSTATE(state); //  str = "state" а хотелось бы "tsNone"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 16.1.2009, 18:18
Сообщение #18


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


kuler, все правильно, так и должно работать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 16.1.2009, 18:21
Сообщение #19


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(void* @ 16.1.2009, 18:18) *
все правильно, так и должно работать

да но тогда нужен другой способ
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.1.2009, 18:21
Сообщение #20


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(kuler @ 16.1.2009, 17:55) *
str = "state" а хотелось бы "tsNone"
С этого и нужно было начианать! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.1.2009, 18:31
Сообщение #21


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


kuler, может ты цель раскажешь, может быть решение будет и попроще.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 16.1.2009, 18:40
Сообщение #22


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(ViGOur @ 16.1.2009, 18:21) *
С этого и нужно было начианать!

да, не до конца довел мыслю
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 16.1.2009, 19:14
Сообщение #23


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(Litkevich Yuriy @ 16.1.2009, 18:31) *
может ты цель раскажешь, может быть решение будет и попроще

ну это вот и есть тот код который должен заработать

EnThreadState state;

state = tsNone;
.....
func()
{
switch (state)
{
.........
}
debug(THREADSTATE(state));
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.1.2009, 19:26
Сообщение #24


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


kuler, пользуйся тэгом code ()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 19.1.2009, 13:06
Сообщение #25


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


можно ещё воспользоваться магией конкретного компилятора. :)
Вот код работающий на mingw 3.4.5:
#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

template <class En, En val>
string getName() {
  // __PRETTY_FUNCTION__ >> std::string getName() [with En = A, En val =  a]
  const char* c = strstr(__PRETTY_FUNCTION__, ", En val =") + 10;
  while (c && *c == ' ') 
    ++c;
  return c ? string(c, c + strlen(c) - 1) : string();
}

enum A {a, b, c};

int main() {
  cout<<getName<A, a>()<<endl;
}

Под другой компилятор придётся найти соответствующий макрос вместо __PRETTY_FUNCTION__ (__FUNCTION__ есть почти везде) и изменить код разбора строки. :)

К сожалению обратную функцию - по имени вывести значение сделать изрядно сложнее. :(

Сообщение отредактировал Tonal - 19.1.2009, 13:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 19.1.2009, 17:04
Сообщение #26


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Tonal @ 19.1.2009, 13:06) *
можно ещё воспользоваться магией конкретного компилятора. :)
Вот код работающий на mingw 3.4.5:
...<>...

Как то ты это... непортабельно загнул)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 22.1.2009, 9:59
Сообщение #27


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Andrew Selivanov @ 16.1.2009, 16:55) *
...
char const* const colours_str[] = {
#define X(a, b) #b,
#include "colours.def"
#undef X
    0
};
....

при использовании #define X(a, b ) #b строковые значения выводятся в ковычках, т.е. как записаны в colours.def
Цитата
color = "Red"
color = "Gray"


при использовании #define X(a, b ) b
Цитата
color = Red
color = Gray


классная штука.

Сообщение отредактировал kwisp - 22.1.2009, 9:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 21.6.2025, 5:38