Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Пт дек 14, 2018 09:23:21

Ну так Вы решились использовать string, значит и пользуйтесь только его функционалом. Зачем что-то изобретать ?

Один человек пьет водку, другой коньяк---вот и приходится смешивать :))) . Вопрос совместимости с другим кодом прост.

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

Пт дек 14, 2018 09:39:45

Для string переоределён оператор '=', принимающий в качестве аргумента указатель на char. Поэтому = можно (и нужно) использовать. А вот strcpy - чисто C-шная функция, и передавать туда что-то помимо указателя не есть правильно. А strcpy(d,&s[0]); срабатывает по сути именно потому, что для string точно так же переопределён оператор '[]' взятия индекса. Хотя и здесь, возможно, правильнее было бы использовать .c_str().

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

Пт дек 14, 2018 09:49:04

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

Добавлено after 1 minute 44 seconds:
Не понятно, зачем Psych изобретает велосипед. Видимо, исторя об этом умалчивет...
Секрет наверное :)))

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

Пт дек 14, 2018 10:01:36

Аlex писал(а):Не понятно, зачем Psych изобретает велосипед. Видимо, исторя об этом умалчивет...

Это костыли. что-то написанно на плюсах, что-то на сях. Это чтоб все вместе работало.
WiseLord писал(а):Хотя и здесь, возможно, правильнее было бы использовать .c_str().

Аlex писал(а):c_str вернёт константный указатель

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

Пт дек 14, 2018 10:14:34

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

P.S. Тьфу, запутали меня этими двумя разными примерами. Как раз-таки всё получится в последнем случае (я про него и говорил):
Нашел:
Код:
        char d[]="fsdhfghf";
        string s="dfs12";
        strcpy(d,&s[0]);

Вполне себе ОК:
Код:
        char d[]="fsdhfghf";
        string s="dfs12";
        strcpy(d, s.c_str());
Последний раз редактировалось WiseLord Пт дек 14, 2018 10:20:47, всего редактировалось 3 раз(а).

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

Пт дек 14, 2018 10:15:27

Да, прошу прощения, выразился неправильно. Конечно же - указатель на константу.

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

Пт дек 14, 2018 22:28:32

s.str в качестве левого не годится в этой функции. Вот и спрашивал, что можно сделать со стринагми в качестве аргумента на char*. Это не моя похоть еси че )) Меня заставили)

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

Пт дек 14, 2018 23:56:13

что можно сделать со стрингами ... Это не моя похоть

Или у вас пробивается что-то подсознательное или черти что можно подумать. :)

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

Сб дек 15, 2018 03:06:19

что можно сделать со стрингами ... Это не моя похоть

Или у вас пробивается что-то подсознательное или черти что можно подумать. :)

Ну пишут этот чертов код не один человек и каждый пишет по своему. Файлов куча --исправлять все под стринги да ну нах ---исправлю пару строчек. Я что-то не догоняю??
Кароче все работает через костыли збс))),

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

Ср дек 19, 2018 09:36:23

что происходит с макросами 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 раз.

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

Ср дек 19, 2018 09:38:41

Может, дело в порядке объявления этих макросов?

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

Ср дек 19, 2018 11:00:31

не понял... три раза нормально, а на 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))
понять бы, в чем фишка...

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

Ср дек 19, 2018 12:01:04

Похоже, что фишка подобна этой: Но всё равно не до конца понятно, почему с разными буквами ведёт по-разному.

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

Ср дек 19, 2018 12:12:40

WiseLord писал(а):Похоже, что фишка подобна этой:
не просто подобна, а она и есть. сейчас причесал и так работает:
Код:
#define _UBRRH      CONCAT(UBRR,CONCAT(MP3_USART,H))


получается, вы были правы - порядок обращения к макросам имеет значение. и второй раз вы тоже правы, сказав
WiseLord писал(а):не до конца понятно, почему с разными буквами ведёт по-разному
вот такой он, строго стандартизированный язык Си... :dont_know:

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

Ср дек 19, 2018 18:14:47

ну где же эти гуры, которые любят флудить по поводу всякого говнокода

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

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

Ср янв 09, 2019 19:18:44

Код:
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 одинаково

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

Ср янв 09, 2019 21:12:55

А если так:
Код:
my_t var = {
   .x = 12,
   .y = {{"1"}}
};

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

Чт янв 10, 2019 08:30:12

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

Добавлено 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"}
};
но так хоть все поля инициализируются верно

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

Чт янв 10, 2019 12:17:19

а так
Код:
my_t var = {
   .x = 12,
   .y = {{.about_a="1"}, {.about_f="1"}, {.about_d="1"}, {.about_i="1"}, {.about_t="1"}}
};

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

Чт янв 10, 2019 12:44:01

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