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

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Доброго времени суток.
Жил не тужил у меня вот такой кусок кода:
Спойлер

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

   for (uint32_t i = 0; i < count; ++i)
   {      
      uint32_t k = 50;

      table[i].coeff = k;
      printf("\nKoef_%d=%d\n", i, table[i].coeff);
      k += 1;   
   }

который в цикле выводил отладочные значения неких коэффициентов.
Потом, в один прекрасный момент, он начал выводить для всех коэффициентов значение 50.
Это вылечилось добавлением квалификатора static для переменной k.
Но если честно, то мне не совсем понято, зачем он здесь нужен. Ведь он дает сохранятся переменной МЕЖДУ ВЫЗОВАМИ функции/цикла. Неужели каждый раз при проверке условия цикла осуществляется "выход" из него ? Я почему-то всегда думал, что осуществляется начальная проверка условия, вход, после каждого прохода - проверка условия, и только если условие не удовлетворено - выход.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Лучше не static сделать, а просто вынести выше тела цикла. Внутри фигурных скобок, естественно, переменная равна 50 - она, как и задумано в этом коде, инициализируется на каждой итерации.

Данная переменная вообще никакого отношения к условию цикла не имеет, непонятно, чему тут можно удивляться.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Добрый день подскажите , как соединить две библиотеки .С .H
1) Первая библиотека содержит функции для работы с кольцевым буфером, buf.H файл соответственно содержит структуры для работы с ними.
2) Вторая библиотека Config.h, это запись системных настроек в ПЗУ. Она глобальная так как настройки могут меняться хоть где(в любом файле) по этому её header добавляю во все хедеры остальных библиотек (добавлю в app.h -> его содержат абсолютно все библиотеки )

Так вот мне понадобилось в Config.h добавить работу с буфером. Т.е некий тип который описан в buf.H после чего компилятор начал ругаться что мне может скомпилировать файл buf.C
и указывает ошибку на Config.h на тип структуры говорит что неизвестна. После чего я начал разбираться почему он её выдает. Оказалось что при компиляции файла buf.с первоначально инклудиться header app.h (где находится Config.h а в самом файле) он вставляется в верхнюю часть файла buf.h а само описание типа находится в buf.h но ниже. По этому он и выдает ошибку.

Примерно так выглядит config.h и buf.h

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

#ifndef Config_H_
#define Config_H_


#include "Aplication.h"      << тут содержиться Buf.h и др.
........................
TstackLow Test;          <<<<<!!!!!Ошибка!!!!!!!!

#endif

//==============
//==============
//==============
#ifndef Buf_H_
#define Buf_H_
#include "Aplication.h"   
........................
typedef struct {
   unsigned short int Count;
   unsigned short int Tail;
   unsigned short int Head;
   unsigned char Buf[SIZE_STACK_LOW][SIZE_NAME];
}TstackLow;

#endif



на выходе buf.c это все разворачивается в

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

TstackLow Test;          
........................
typedef struct {
   unsigned short int Count;
   unsigned short int Tail;
   unsigned short int Head;
   unsigned char Buf[SIZE_STACK_LOW][SIZE_NAME];
}TstackLow;

Естественно он не может понять. Как это сделать правильнее? Можно конечно перенести typedef struct {...}TstackLow; в Config.h и тогда проблема исчезнет, но не хочу плодить разные сущности в одном файле, если у них есть свой(buf.h)

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

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

Сообщение WiseLord »

Вы пытаетесь внутри config.h обратиться к неизвестному типу TstackLow, не включив файл buf.h, где он определён. Естественно, это приведёт к ошибке.

То, что в config.h включен app.h, в котором уже включен buf.h, может не сработать, если получается циклическая зависимость. Убедитесь, что у Вас нет такой ситуации, когда какой-нибудь .h файл через цепочку других include-ов может включить сам себя. Скорее всего, именно в этом проблема и заключается. В неправильной концепции, то есть.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Благодарю!
Решил пора перейти с С на С++, но тут столько проблем возникает. (в с++ знания нулевые)
До это писал на IAR все на С при переходе на с++ там надо сишный вариант startup, на IAR его фиг найдешь, какой то нашел но там компилятор ругается на using ...., то ли из за версии то ли не поддерживает ...
В каком компиляторе лучше начинать ? Пытался настроить как-то eclips, но времени было мало, проект не завелся, вот думаю продолжить, но приодеться разбираться в компиляторе + с++ ....
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="pokk",url="/forum/viewtopic.php?p=3594246#p3594246"]До это писал на IAR все на С при переходе на с++ там надо сишный вариант startup[/uquote]Зачем? Стартап любой рабочий можно использовать.
[uquote="pokk",url="/forum/viewtopic.php?p=3594246#p3594246"]на IAR его фиг найдешь, .[/uquote]О каком процессоре речь? Вообще, можно и самому написать, у IAR стартапы простые - таблица векторов да переход на clib.[uquote="pokk",url="/forum/viewtopic.php?p=3594246#p3594246"]В каком компиляторе лучше начинать ?[/uquote]В том на который лучше документация и возможность получить помощь на форуме. IAR в этом плане хороший выбор. Но если озвучишь тип процессора можно и ещё что-то подобрать.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Процессор stm32f103xx
Да startap я уже переписал(воткнул таблицу прерываний из серии 103,остальное все так оставил), взял за основу f412RE (см файл)
Правда на

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

using tIntFunct = void(*)();
//cstat !MISRAC++2008-9-5-1
using tIntVectItem = union {tIntFunct __fun; void * __ptr;};

IAR 7.5 ругается, пришлось переделать на typedef
После этого проект заработал, и в прерывание по таймеру входил.
Дальнейшие изучение продолжил с классом портов GPIO
Первое что нашел https://github.com/ThatEmbeddedGuy/Stm3 ... ter/Gpio.h
хоть и не под 103 серию, но главное смысл, а подправить проблем не составит.
но тут IAR начал выдавать ошибки на enum class, и на constexpr я так понял в версии 7.5 он ни то ни то не поддерживает.
Прочитал статью http://easyelectronics.ru/rabota-s-port ... na-si.html
теперь двоякое чувство, как правильно писать на С++ на основе шаблонов, или же с наследованием.
В общем от С++ хочу добиться, хорошей инкапсуляции, что бы написанный модуль можно было дальше пихать во все проекты, и дальше его только дописывать... на С, получаеться, но .. количество исходников только растет и растет и в библиотеку они не особо оформляются. Особо это касается типа каких нибудь журналов, кольцевых буферов и тд.., один создал а второй только копипастом создается

Добавлено after 10 minutes 46 seconds:

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

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

Где-то видал обсуждение что gcc по С++ на голову всех остальных компиляторов превосходит.
Вложения
startupF411RE.cpp
(5.82 КБ) 165 скачиваний
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Для 103-го вот такого стартапа достаточно. Не нужен в стартапе С++.

На ASM, кстати, можно немного сэкономить в размере, разместив DefaultHandler внутри таблицы векторов. Зацените.
Вложения
startup_stm32f103xb.s.txt
(6.64 КБ) 209 скачиваний
startup_iar_stm32f103x8.c
(6.2 КБ) 219 скачиваний
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Что такое weak, alias ? Читал читал, но так и не дошло, что там происходит.
Смутные понимание, что типа каждая функция (NMI_Handler)

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

void NMI_Handler()                 __attribute__ ((weak, alias ("Default_Handler")));

По дефолту заменяется на Default_Handler, если она не объявлена пользователем.
Аватара пользователя
Allex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вс ноя 12, 2006 06:33:28
Откуда: Владивосток

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

Сообщение Allex »

В процессе творческого копипащенья одного кода, встретил такую функцию:

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

//========================
// Процедура смены местами 2 значений int16_t
//========================
static void SwapInt16Values(int16_t *pValue1, int16_t *pValue2)
{
  int16_t TempValue = *pValue1;
  *pValue1 = *pValue2;
  *pValue2 = TempValue;
}


ну и вызов, соответственно:

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

SwapInt16Values(&x1, &x2);


Скажите, а все вот эти упражнения со ссылками и указателями имеют практический смысл? В плане быстродействия, или может чего другого... Я б, как старый ардуинщик, написал бы в лоб:

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

void SwapInt16Values(int16_t pValue1, int16_t pValue2)
{
  int16_t TempValue = pValue1;
  pValue1 = pValue2;
  pValue2 = TempValue;
}


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

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

Сообщение ARV »

Allex писал(а):Чем это хуже?
тем, что это не работает
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Allex",url="/forum/viewtopic.php?p=3616862#p3616862"]Я б, как старый ардуинщик, написал бы в лоб:[/uquote]
Ардуинщики пишут на С++, потому аргументы имеет смысл передавать как ссылки, что и делает стандартная функция swap, правда она еще и шаблонная:

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

void SwapInt16Values(int16_t& pValue1, int16_t& pValue2)
{
  int16_t TempValue = pValue1;
  pValue1 = pValue2;
  pValue2 = TempValue;
}
Аватара пользователя
Allex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вс ноя 12, 2006 06:33:28
Откуда: Владивосток

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

Сообщение Allex »

Вроде дошло.

void SwapInt16Values(int16_t& pValue1, int16_t& pValue2)

Просто меняем адреса переменных? Или не дошло?
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

Чем это хуже?


Тем, что вы передаёте параметры по значению. То есть, в функцию попадают не внешние переменные, а только их значения. Если же передать по ссылке/указателю, то передаётся ссылка/указатель и вы получаете возможность менять значение переменных.

Просто меняем адреса переменных? Или не дошло?


Не адреса, а значения.

что и делает стандартная функция swap, правда она еще и шаблонная:


Вот тут не понял. Функция void SwapInt16Values(int16_t& pValue1, int16_t& pValue2) не шаблонная. 8)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="da-nie",url="/forum/viewtopic.php?p=3616889#p3616889"]Вот тут не понял. Функция void SwapInt16Values(int16_t& pValue1, int16_t& pValue2) не шаблонная. 8)[/uquote]
Для SwapInt16Values я просты ссылки добавил, а std::swap() - шаблонная, но тут грузить еще и шаблонами никакого смысла нет :)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3616906#p3616906"]а в контексте параметров функции какая разница между ссылкой и указателем? только что ссылка не может изменяться или еще какие-то нюансы есть?[/uquote]
Нюансы есть, например, по константной сылке можно передать временный объект:

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

set(Point{10, 20});

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

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

Сообщение ARV »

Reflector писал(а):set(Point{10, 20});
то есть

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

set(&Point{10, 20});
недопустимо, если в set параметр указатель? интересно, почему? временный объект создается же в памяти, и имеет адрес... или опять нюансы?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3616929#p3616929"]недопустимо, если в set параметр указатель? интересно, почему? временный объект создается же в памяти, и имеет адрес... или опять нюансы?[/uquote]
Когда-то читал, но сейчас точно не скажу, вроде дело в невозможности применять & к rvalue, а временные объекты как раз rvalue и есть.
Ответить

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