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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
AAX
Опытный кот
Сообщения: 718
Зарегистрирован: Сб ноя 16, 2013 23:34:34

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

Сообщение AAX »

не "пишется", а вызывает ошибку в процессе компиляции. В вашей терминологии "не помещается" ;) Как вы, возможно, можете наблюдать, после явного указания типа инициализируемой переменной ошибка более не появляется. Возможно, мои объяснения - ерунда. Предложите, пожалуйста, правильное объяснение. Если для вас это по какой-то причине невозможно - просто помолчите в сторонке, пока кто-нибудь умный не объяснит.

Добавлено after 13 minutes 9 seconds:
я понял, в чём дело ;) всё действительно намного проще, чем я думал: нам нужно инициализировать структуру All_ChannelData_t, массив на 8 экземпляров ChannelData_t, и сами структуры ChannelData_t. "Просто добавь фигурные скобки" :)

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

	All_ChannelData_t All_ChannelData = { // All_ChannelData_t structure
		{ // ChannelData[8] array
			{ // ChannelData_t structure
			1000, 1000, 1000, 1000,
			},
				{
				1000, 1000, 1000, 1000,
			},
				{
				1000, 1000, 1000, 1000,
			},
				{
				1000, 1000, 1000, 1000,
			},
				{
				1000, 1000, 1000, 1000,
			},
				{
				1000, 1000, 1000, 1000,
			},
				{
				1000, 1000, 1000, 1000,
			},
				{
				1000, 1000, 1000, 1000,
			},
		}
	};
собственно, оно и ругалось на "too many initializers" - массив же один ;)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

AAX писал(а):Возможно, мои объяснения - ерунда.
как вы сами доказали - таки да, ерунда
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение Psych »

Никто не знает почему
auto n=end(silo)-begin(silo);
Code blocks выдает int вместо ptrdiff_t.
Это от компилятора зависит?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Что такое end, begin и silo нам предлагается угадать?

PS: auto удаляет ссылки, квалификаторы const и квалификаторы volatile. Не в этом дело?

Догадаемся, что речь идёт о std::end и std::begin

Определение в IAR
Спойлер

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

// TEMPLATE FUNCTION begin
template<class _Elem> inline
constexpr const _Elem *begin(initializer_list<_Elem> _Ilist) _NOEXCEPT
{       // get beginning of sequence
  return _Ilist.begin();
}

// TEMPLATE FUNCTION end
template<class _Elem> inline
constexpr const _Elem *end(initializer_list<_Elem> _Ilist) _NOEXCEPT
{       // get end of sequence
  return _Ilist.end();
}
Определение в GCC по сути то же самое
Спойлер

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

  /**
   *  @brief  Return an iterator pointing to the first element of
   *          the initializer_list.
   *  @param  __ils  Initializer list.
   */
  template<class _Tp>
    constexpr const _Tp*
    begin(initializer_list<_Tp> __ils) noexcept
    { return __ils.begin(); }

  /**
   *  @brief  Return an iterator pointing to one past the last element
   *          of the initializer_list.
   *  @param  __ils  Initializer list.
   */
  template<class _Tp>
    constexpr const _Tp*
    end(initializer_list<_Tp> __ils) noexcept
    { return __ils.end(); }
}
Посмотрим что такое ptrdiff_t

В IAR
Спойлер

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

/* type definitions */
#ifndef _PTRDIFF_T
  #define   _PTRDIFF_T
  #define   _STD_USING_PTRDIFF_T
  typedef   __PTRDIFF_T_TYPE__ ptrdiff_t;
#endif
В GCC
Спойлер

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

#ifndef __PTRDIFF_TYPE__
#define __PTRDIFF_TYPE__ long int
#endif
typedef __PTRDIFF_TYPE__ ptrdiff_t;
Псевдоним на базовый тип. Думаю, компилятор вполне закономерно взял базовый тип.
Последний раз редактировалось VladislavS Сб ноя 17, 2018 17:08:13, всего редактировалось 1 раз.
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

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

Сообщение Psych »

VladislavS писал(а):Догадаемся, что речь идёт о std::end и std::begin
Ну да.

Да черт с этими определениями.
Почему компилятор определяет неявно тип int вместо ptrdiff_t?

#include <cstddef>
#include <iterator>
using namespace std;

int main(int argc, char** argv) {
char silo[10];
auto n=end(silo)-begin(silo);
return 0;
}
тут n почему-то int
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Psych",url="/forum/viewtopic.php?p=3506724#p3506724"]тут n почему-то int[/uquote]
Перед выполнением математических операций все приводится к одному типу и для целых это будет int, если его достаточно, т.е. даже 'A' + 1 дает int.
А, тут итераторы, тогда все зависит от перегрузки операторов, тем более в принципе ptrdiff_t как int и объявлен... Компилятор какой?
Последний раз редактировалось Reflector Сб ноя 17, 2018 17:14:38, всего редактировалось 1 раз.
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

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

Сообщение Psych »

[uquote="Reflector",url="/forum/viewtopic.php?p=3506728#p3506728"]Перед выполнением математических операций все приводится к одному типу и для целых это будет int, если его достаточно, т.е. даже 'A' + 1 дает int.[/uquote]
да, но тут вычитаются же указатели.
Компилятор игнорит стандарт чтоли?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Тип то тут одинаковый. Но вступает в силу "арифметика указателей". Результат разности двух указателей это по классике будет int. Будет ли компилятор подбирать для него псевдоним ptrdiff_t ? Я бы не стал :)
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

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

Сообщение Psych »

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

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

Сообщение Reflector »

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

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

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

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

Сообщение Psych »

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сообщение pokk »

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

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

Сообщение VladislavS »

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

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

Сообщение Psych »

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

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

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

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

Сообщение WiseLord »

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

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

Сообщение Psych »

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

Нашел:

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

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

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

Сообщение А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]
А чем Вам не понравился стандартный способ присваивания ?
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

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

Сообщение Psych »

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

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

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

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

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