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

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

Сообщение Psych »

VladislavS писал(а):Результат разности двух указателей это по классике будет int
Это же по классике.
VladislavS писал(а):Будет ли компилятор подбирать для него псевдоним ptrdiff_t ?
Ну как бы в плюсах должен. Он же видит, что вычитаются указатели.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Psych",url="/forum/viewtopic.php?p=3506750#p3506750"]Ну как бы в плюсах должен. Он же видит, что вычитаются указатели.[/uquote]
Вот как объявлен ptrdiff_t:

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

typedef int   ptrdiff_t;
Ptrdiff_t - это новый тип? Нет, это псевдоним для существующего типа, новый тип тут не создается, потому вполне логично, что auto выводит тип разности указателей как int. Тем более ptrdiff_t появился относительно недавно, а указатели были давно и как-то без него обходились, так что никакие стандарты тут не игнорятся.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

Я правильно понимаю?:

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

A& Func()const{return *this;}
Можно передать константу и неконстанту. И функция может стоять слева от операторов.

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

const A&(){return *this;}
Можно передать только неконстанту. Слева стоять не может.

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

const A&()const{return *this;}
Можно передать константу и неконстанту. Слева стоять не может.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Ничего не понятно, но.

const после метода означает, что метод не изменяет внутренние данные класса.

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

Func() const;
const слева от возвращаемого значения - запрет изменять данные по возвращаемой ссылке/указателю.

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

const A& Func();
const в аргументе - функция(метод) не имеет права менять данные по передаваемой ей ссылке/указателю.

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

Func(const A&);
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Добрый день, делаю bootloader, по включению питания сравнивается CRC приложения с текущим CRC, если совпадает, значит приложение зашито и переходим в него если нет то переходим в bootloader.
Так вот теперь столкнулся с проблемой как обратно вернуть в bootloader, по программному условию? После того как делаю программный reset, он у меня
опять в приложение уходит, а передать из приложение в bootloader переменные можно только через Flash, но такой вариант, не очень нравиться. Долго, надо оперативнее перейти.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="pokk",url="/forum/viewtopic.php?p=3518376#p3518376"]а передать из приложение в bootloader переменные можно только через Flash, но такой вариант, не очень нравиться.[/uquote]В вашем секретном процессоре нет ОЗУ, регистров процессора и перифериии куда можно положить переменные?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

Народ почему то Code Blocks 17 ругается:

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

         const char d[]="fsd";
        string s="dfsdfsfs";
        strcpy(s,d);
Почему то не хочет конвертить string в char*. Хотя я видел код смешивающий стринги с массивами без c_str. Может где настройки есть какие?
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

strcpy первым аргументом указатель на char принимает, а Вы туда не пойми что передали (С++, экземпляр класса std_string ? зачем так делать?)
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3526357#p3526357"]strcpy первым аргументом указатель на char принимает, а Вы туда не пойми что передали.[/uquote]
Тоже показалось странным.Собственно

Нашел:

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

        char d[]="fsdhfghf";
        string s="dfs12";
        strcpy(d,&s[0]);
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

[uquote="Psych",url="/forum/viewtopic.php?p=3526336#p3526336"]Народ почему то Code Blocks 17 ругается:

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

         const char d[]="fsd";
        string s="dfsdfsfs";
        strcpy(s,d);
Почему то не хочет конвертить string в char*. Хотя я видел код смешивающий стринги с массивами без c_str. Может где настройки есть какие?[/uquote]
А чем Вам не понравился стандартный способ присваивания ?
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

Аlex писал(а):А чем Вам не понравился стандартный способ присваивания ?
Все в перемешку. Вот и приходится использовать и то, и то.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение Psych »

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

Сообщение WiseLord »

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

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

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

Сообщение Psych »

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

Сообщение a5021 »

[uquote="Psych",url="/forum/viewtopic.php?p=3526960#p3526960"]что можно сделать со стрингами ... Это не моя похоть[/uquote]
Или у вас пробивается что-то подсознательное или черти что можно подумать. :)
Ответить

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