Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

[uquote="Аlex",url="/forum/viewtopic.php?p=3526387#p3526387"]Ну так Вы решились использовать string, значит и пользуйтесь только его функционалом. Зачем что-то изобретать ?[/uquote]
Один человек пьет водку, другой коньяк---вот и приходится смешивать :))) . Вопрос совместимости с другим кодом прост.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Для string переоределён оператор '=', принимающий в качестве аргумента указатель на char. Поэтому = можно (и нужно) использовать. А вот strcpy - чисто C-шная функция, и передавать туда что-то помимо указателя не есть правильно. А strcpy(d,&s[0]); срабатывает по сути именно потому, что для string точно так же переопределён оператор '[]' взятия индекса. Хотя и здесь, возможно, правильнее было бы использовать .c_str().
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

c_str вернёт константный указатель. Запихнуть его в strcpy не получится.
Нельзя менять данные в string'е иными путями, отличными от тех, которые даны этим классом. Обойти можно, но будут проблемы.

Добавлено after 1 minute 44 seconds:
Не понятно, зачем Psych изобретает велосипед. Видимо, исторя об этом умалчивет...
Секрет наверное :)))
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

Аlex писал(а):Не понятно, зачем Psych изобретает велосипед. Видимо, исторя об этом умалчивет...
Это костыли. что-то написанно на плюсах, что-то на сях. Это чтоб все вместе работало.
WiseLord писал(а):Хотя и здесь, возможно, правильнее было бы использовать .c_str().
Аlex писал(а):c_str вернёт константный указатель
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Аlex писал(а):c_str вернёт константный указатель. Запихнуть его в strcpy не получится.
Да, действительно. Правда, не константный указатель (вряд ли это вызвало бы проблему), а указатель на константу (что и не даёт в эту область памяти писать).

P.S. Тьфу, запутали меня этими двумя разными примерами. Как раз-таки всё получится в последнем случае (я про него и говорил):
[uquote="Psych",url="/forum/viewtopic.php?p=3526365#p3526365"]Нашел:

Код: Выделить всё

        char d[]="fsdhfghf";
        string s="dfs12";
        strcpy(d,&s[0]);
[/uquote]
Вполне себе ОК:

Код: Выделить всё

        char d[]="fsdhfghf";
        string s="dfs12";
        strcpy(d, s.c_str());
Последний раз редактировалось WiseLord Пт дек 14, 2018 10:20:47, всего редактировалось 3 раза.
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Да, прошу прощения, выразился неправильно. Конечно же - указатель на константу.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

s.str в качестве левого не годится в этой функции. Вот и спрашивал, что можно сделать со стринагми в качестве аргумента на char*. Это не моя похоть еси че )) Меня заставили)
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Psych",url="/forum/viewtopic.php?p=3526960#p3526960"]что можно сделать со стрингами ... Это не моя похоть[/uquote]
Или у вас пробивается что-то подсознательное или черти что можно подумать. :)
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

[uquote="a5021",url="/forum/viewtopic.php?p=3526985#p3526985"][uquote="Psych",url="/forum/viewtopic.php?p=3526960#p3526960"]что можно сделать со стрингами ... Это не моя похоть[/uquote]
Или у вас пробивается что-то подсознательное или черти что можно подумать. :)[/uquote]
Ну пишут этот чертов код не один человек и каждый пишет по своему. Файлов куча --исправлять все под стринги да ну нах ---исправлю пару строчек. Я что-то не догоняю??
Кароче все работает через костыли збс))),
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

что происходит с макросами GCC?! :o :shock:
вот это препроцессор проглатывает без проблем:

Код: Выделить всё

#define _UDR		CONCAT(UDR,MP3_USART)
#define _UCSRA		CONCAT(CONCAT(UCSR,MP3_USART),A)
#define _UCSRB		CONCAT(CONCAT(UCSR,MP3_USART),B)
#define _UCSRC		CONCAT(CONCAT(UCSR,MP3_USART),C)
подставляя вместо MP3_USART циферку 1 и генерируя в итоге правильные наименования регистров USART типа USCR1A, UCSR1B и т.д.

а вот это уже не проглатывает:

Код: Выделить всё

#define _UBRRH		CONCAT(CONCAT(UBRR,MP3_USART),H)
#define _UBRRL		CONCAT(CONCAT(UBRR,MP3_USART),L)
выдавая ошибку:

Код: Выделить всё

../mp3_task.c:35:24: error: pasting ")" and "H" does not give a valid preprocessing token
 #define __UBRR  CONCAT(UBRR,MP3_USART)
                        ^
avr_helper.h:7:24: note: in definition of macro '_CONCAT_'
 #define _CONCAT_(x,y)  x ## y
                        ^
../mp3_task.c:36:17: note: in expansion of macro 'CONCAT'
 #define _UBRRH  CONCAT(__UBRR,H)
                 ^~~~~~
avr_helper.h:9:22: note: in expansion of macro '_CONCAT_'
 #define CONCAT(y,x)  _CONCAT_(y,x)
                      ^~~~~~~~
../mp3_task.c:35:17: note: in expansion of macro 'CONCAT'
 #define __UBRR  CONCAT(UBRR,MP3_USART)
                 ^~~~~~
../mp3_task.c:36:24: note: in expansion of macro '__UBRR'
 #define _UBRRH  CONCAT(__UBRR,H)
                        ^~~~~~
../mp3_task.c:227:4: note: in expansion of macro '_UBRRH'
    _UBRRH = UBRRH_VALUE;
    ^~~~~~
../mp3_task.c:37:31: error: pasting ")" and "L" does not give a valid preprocessing token
 #define _UBRRL  CONCAT(CONCAT(UBRR,MP3_USART),L)
                               ^
avr_helper.h:7:24: note: in definition of macro '_CONCAT_'
 #define _CONCAT_(x,y)  x ## y
                        ^
../mp3_task.c:37:17: note: in expansion of macro 'CONCAT'
 #define _UBRRL  CONCAT(CONCAT(UBRR,MP3_USART),L)
                 ^~~~~~
avr_helper.h:9:22: note: in expansion of macro '_CONCAT_'
 #define CONCAT(y,x)  _CONCAT_(y,x)
                      ^~~~~~~~
../mp3_task.c:37:24: note: in expansion of macro 'CONCAT'
 #define _UBRRL  CONCAT(CONCAT(UBRR,MP3_USART),L)
                        ^~~~~~
../mp3_task.c:228:4: note: in expansion of macro '_UBRRL'
    _UBRRL = UBRRL_VALUE;
    ^~~~~~
чё за хрень?! :shock:
Последний раз редактировалось ARV Ср дек 19, 2018 09:39:35, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Может, дело в порядке объявления этих макросов?
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

не понял... три раза нормально, а на 4-й и 5-й раз порядок стал важен?

Добавлено after 59 minutes 17 seconds:
ну где же эти гуры, которые любят флудить по поводу всякого говнокода и прочих нюансов Си?! как нужно решить реальную проблему, так все молчат...

похоже, препроцессор категорически отказывается делать операцию ## с символом L или H справа от себя - все другие буквы приклеиваются нормально. интересно, почему так? где-то об этом сказано?

Добавлено after 5 minutes 51 second:
вот так прокатило:

Код: Выделить всё

#define _tl(x)		CONCAT(x,L)
#define _th(x)		CONCAT(x,H)

#define _UBRRH		CONCAT(UBRR,_th(MP3_USART))
#define _UBRRL		CONCAT(UBRR,_tl(MP3_USART))
понять бы, в чем фишка...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Похоже, что фишка подобна этой: Но всё равно не до конца понятно, почему с разными буквами ведёт по-разному.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

WiseLord писал(а):Похоже, что фишка подобна этой:
не просто подобна, а она и есть. сейчас причесал и так работает:

Код: Выделить всё

#define _UBRRH      CONCAT(UBRR,CONCAT(MP3_USART,H))
получается, вы были правы - порядок обращения к макросам имеет значение. и второй раз вы тоже правы, сказав
WiseLord писал(а):не до конца понятно, почему с разными буквами ведёт по-разному
вот такой он, строго стандартизированный язык Си... :dont_know:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3529973#p3529973"]ну где же эти гуры, которые любят флудить по поводу всякого говнокода[/uquote]
Вы таким неуклюжим способом хотите подключить их к решению своих проблем? Как то это совсем без огонька у вас получается.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Код: Выделить всё

typedef struct{
	char		about_a[CNT];
	char		about_f[CNT];
	char		about_d[CNT];
	char		about_i[CNT];
	char		about_t[CNT];
} n_t;

typedef struct{
	int		x;
	n_t		y;
}my_t;

my_t var = {
	.x = 12,
	.y = {"1"} // <--- WARNING: missing braces around initializer
};
что за фигня? :o планирую инициализировать все поля структуры y одинаковой строкой - получаю варнинг :( инициализируется только первое поле структуры...

avr-gcc 6.3.0 и 8.2.0 одинаково
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

А если так:

Код: Выделить всё

my_t var = {
   .x = 12,
   .y = {{"1"}} 
};
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Добавлено after 3 minutes 28 seconds:
даже так остается варнинг:

Код: Выделить всё

my_t var = {
   .x = 12,
   .y = {.about_a="1", .about_f="1", .about_d="1", .about_i="1", .about_t="1"} 
};
но так хоть все поля инициализируются верно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Сообщения: 42
Зарегистрирован: Вс сен 03, 2017 19:43:57

Сообщение technik-1017 »

а так

Код: Выделить всё

my_t var = {
   .x = 12,
   .y = {{.about_a="1"}, {.about_f="1"}, {.about_d="1"}, {.about_i="1"}, {.about_t="1"}}
};
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»