Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Преобразование строки в строковую константу


Автор: Therion 23.5.2008, 10:35
Подскажите алгоритм преобразования 
Код
const UINT32 kCounterKey = 'COUN';
 в строку и наоборот.
Заранее благодарен.

Автор: Alek86 23.5.2008, 10:41
а чего ты этой строчкой сделал?

Автор: Fazil6 23.5.2008, 10:46
Цитата(Therion @  23.5.2008,  10:35 Найти цитируемый пост)
Подскажите алгоритм преобразования 

бред какой-то

Автор: Therion 23.5.2008, 10:53
Пишется обертка для одной функции на C++ для программистов на С#. C++ функция в качестве параметра принимает число (но его всегда для удобства чтения кода вводят как строковую константу 'COUN'). В С# я не могу передать в качестве параметра строковую константу, могу только число (что не подходит). Решил что бы программисты на C# писали строчку не длинней 4-х символов, которая бы переобразовывалась в строковую константу и передавалась С++ функцие. Нужна и обратная операция, так как строковая константа используется как ключ в функцияъ типа GetData/SetData.

Добавлено через 4 минуты и 13 секунд
Цитата(Fazil6 @ 23.5.2008,  10:46)
Цитата(Therion @  23.5.2008,  10:35 Найти цитируемый пост)
Подскажите алгоритм преобразования 

бред какой-то

Возможно. Но пока что ищу решение и это первое что приходит в голову. Если есть более элегентные предложения буду рад помощи.

Автор: vinter 23.5.2008, 11:09
Цитата(Therion @  23.5.2008,  11:53 Найти цитируемый пост)
Возможно. Но пока что ищу решение и это первое что приходит в голову. Если есть более элегентные предложения буду рад помощи.

это не решение а ерунда какая-то

Цитата(Therion @  23.5.2008,  11:35 Найти цитируемый пост)
 UINT32

тип для целых чисел.
Цитата(Therion @  23.5.2008,  11:35 Найти цитируемый пост)
COUN

строка
Цитата(Therion @  23.5.2008,  11:35 Найти цитируемый пост)
''

кавычки для одного символа
как по твоему все это помещается в одну логическую строку?

Автор: Therion 23.5.2008, 11:17
Если вы попробуете такой код 
Код
std::cout << 'COUN' << std::endl;
, то увидите что выводится число 1129272654.

Автор: Ulysses4j 23.5.2008, 11:17
Какое-то сбивчивое объяснение. Если в строке типа char* записаны циферки, а хочется получить соответствуещее целое, то
Код
const UINT32 kCounterKey = boost::lexical_cast<unsigned int>(str);

Ну или писать велосипеды с istring_stream:
Код
istring_stream is(str);
const UINT32 kCounterKey;
is >> kCounterKey;

И там и там ловить исключения, разумеется.

Добавлено через 1 минуту и 31 секунду
Цитата(Therion @ 23.5.2008,  11:17)
Если вы попробуете такой код 
Код
std::cout << 'COUN' << std::endl;
, то увидите что выводится число 1129272654.

Так то значение указателя, который смотрит на литерал 'COUN' где-то в области данных программы, выведется.

Добавлено через 13 минут и 59 секунд
Ой, и кавычки неправильные, точно vinter сказал (многоязыковость съедает мозг).

Автор: Therion 23.5.2008, 11:36
Понял что так не стоит делать. Не буду использовать в качестве ключей строковые литералы. Спасибо всем  smile 

Автор: Alek86 23.5.2008, 11:37
Цитата(vinter @  23.5.2008,  11:09 Найти цитируемый пост)

COUN
строка
''
кавычки для одного символа

самый прикол, что comeau
Код
int main() {
 int i = 'dsds';
}

хавает

Добавлено через 56 секунд
но что это может значить - не представляю

Автор: Therion 23.5.2008, 11:39
Конечно хавает. И мне в наследство перешла либа где это используется по всему коду.

Автор: Rififi 23.5.2008, 13:06
такая запись - quick-аналог для
#define make_long(a,b,c,d) ((a)<<24)|((b)<<16)|(©<<8)|(d)

то есть

сonst long id1 = '1234';
const long id2 = make_long('1', '2', '3', '4');

id1 равно id2

насколько легально - не в курсе, лень в Стандарте искать, но раз Комо съедает...

Автор: mes 23.5.2008, 13:36
Цитата(Therion @  23.5.2008,  10:35 Найти цитируемый пост)
Подскажите алгоритм преобразования 
код C++
const UINT32 kCounterKey = 'COUN';


Цитата(Therion @  23.5.2008,  10:53 Найти цитируемый пост)
 C++ функция в качестве параметра принимает число (но его всегда для удобства чтения кода вводят как строковую константу 'COUN'). В С# я не могу передать в качестве параметра строковую константу, могу только число (что не подходит). 


почему не подходит передaвать число ?? 'COUN' - оно и есть число  (и не в коем случае не строка)


Автор: Therion 23.5.2008, 16:29
Для более удобного чтения кода. Намного проще понять для чего ключ 'COUN' (от counter) чем помнить что какое число значит.

Автор: mes 23.5.2008, 16:33
Цитата(Therion @  23.5.2008,  16:29 Найти цитируемый пост)
Для более удобного чтения кода. Намного проще понять для чего ключ 'COUN' (от counter) чем помнить что какое число значит. 


неужели на шарпе такое не возможно ?
Цитата(Rififi @  23.5.2008,  13:06 Найти цитируемый пост)
const long id2 = make_long('1', '2', '3', '4');


второй вариант использовать енумы 

Автор: Rififi 23.5.2008, 16:39
Цитата(Therion @  23.5.2008,  16:29 Найти цитируемый пост)
Намного проще понять для чего ключ 'COUN' (от counter)

а так еще проще:
enum Keys { Counter };

Автор: Therion 23.5.2008, 16:47
Мне не нужно задавать ключи за ранее. Нужно что-бы пользователь функции сам задавал, какие ему удобно. Также я не должен выходить за рамки стиля уже принятого в либе. А в C# нельзя явно указать 
Код

uint gg='GGGG';
. Пока что временно использую числовые ключи пока не найду решение.

Автор: mes 23.5.2008, 17:17
1 каждый пользователь может сам себе енумы завести ))
2. также не было ответа подходит ли конструкция предложенная Rififi?
3. ну а вот преобразование из строки в число 
Код

int key_from_string (const char p[4]) { return p[0]<<24
                                              |p[1]<<16
                                              |p[2]<<8
                                              |p[3]<<0;
                                       }

int main(int argc, char *argv[])
{
  cout <<  key_from_string ("COUN") << endl; // 1129272654

    system("PAUSE");
    return EXIT_SUCCESS;
}
 

Автор: Therion 23.5.2008, 17:30
Спасибо большое. Это как раз то что надо smile
Буду писать обертку  smile 

Автор: mes 23.5.2008, 18:29
Цитата(Therion @  23.5.2008,  17:30 Найти цитируемый пост)
Это как раз то что надо 

я бы не стал использовать в коде "свободные" строчки или набор литер
то есть типа GetData ('COUN'); /*1129272654*/ так как компилятор умоет руки если вместо нее Вы напишете 'СОUN' /*-775006898A*/
или если вдруг решите изменить код на другой более подходяший есть вероятность , что в одном из юнитов останется незамеченным и неисправленным. То же относится и к "свободным" цифрам.
Но как говорится на вкус и цвет  товарища нет ))


Автор: vinter 23.5.2008, 22:36
Цитата(Therion @  23.5.2008,  17:29 Найти цитируемый пост)
Для более удобного чтения кода. Намного проще понять для чего ключ 'COUN' (от counter) чем помнить что какое число значит.

#define COUNT 1234// тоже плохо?

Автор: Therion 26.5.2008, 11:20
Мне тоже не очень нравится использовать 'COUN', но прийдется. Спасибо за ответы smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)