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

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

Чт мар 07, 2019 12:22:22

:facepalm:

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

Сб мар 16, 2019 20:02:58

Доброго времени суток.
Жил не тужил у меня вот такой кусок кода:
Спойлер
Код:
   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.
Но если честно, то мне не совсем понято, зачем он здесь нужен. Ведь он дает сохранятся переменной МЕЖДУ ВЫЗОВАМИ функции/цикла. Неужели каждый раз при проверке условия цикла осуществляется "выход" из него ? Я почему-то всегда думал, что осуществляется начальная проверка условия, вход, после каждого прохода - проверка условия, и только если условие не удовлетворено - выход.

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

Сб мар 16, 2019 20:26:22

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

Данная переменная вообще никакого отношения к условию цикла не имеет, непонятно, чему тут можно удивляться.

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

Вс мар 17, 2019 13:15:17

Добрый день подскажите , как соединить две библиотеки .С .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,..), таймеры, светодиоды, и тд..)

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

Вс мар 17, 2019 15:27:40

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

То, что в config.h включен app.h, в котором уже включен buf.h, может не сработать, если получается циклическая зависимость. Убедитесь, что у Вас нет такой ситуации, когда какой-нибудь .h файл через цепочку других include-ов может включить сам себя. Скорее всего, именно в этом проблема и заключается. В неправильной концепции, то есть.

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

Пн мар 18, 2019 08:31:41

Благодарю!
Решил пора перейти с С на С++, но тут столько проблем возникает. (в с++ знания нулевые)
До это писал на IAR все на С при переходе на с++ там надо сишный вариант startup, на IAR его фиг найдешь, какой то нашел но там компилятор ругается на using ...., то ли из за версии то ли не поддерживает ...
В каком компиляторе лучше начинать ? Пытался настроить как-то eclips, но времени было мало, проект не завелся, вот думаю продолжить, но приодеться разбираться в компиляторе + с++ ....

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

Вт мар 19, 2019 06:14:23

До это писал на IAR все на С при переходе на с++ там надо сишный вариант startup
Зачем? Стартап любой рабочий можно использовать.
на IAR его фиг найдешь, .
О каком процессоре речь? Вообще, можно и самому написать, у IAR стартапы простые - таблица векторов да переход на clib.
В каком компиляторе лучше начинать ?
В том на который лучше документация и возможность получить помощь на форуме. IAR в этом плане хороший выбор. Но если озвучишь тип процессора можно и ещё что-то подобрать.

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

Вт мар 19, 2019 14:28:48

Процессор 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 KiB) Скачиваний: 141

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

Вт мар 19, 2019 15:53:07

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

На ASM, кстати, можно немного сэкономить в размере, разместив DefaultHandler внутри таблицы векторов. Зацените.
Вложения
startup_stm32f103xb.s.txt
(6.64 KiB) Скачиваний: 188
startup_iar_stm32f103x8.c
(6.2 KiB) Скачиваний: 188

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

Ср мар 20, 2019 03:41:48

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

По дефолту заменяется на Default_Handler, если она не объявлена пользователем.

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

Пн апр 15, 2019 10:02:05

В процессе творческого копипащенья одного кода, встретил такую функцию:
Код:
//========================
// Процедура смены местами 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;
}


Чем это хуже?

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

Пн апр 15, 2019 10:05:23

Allex писал(а):Чем это хуже?
тем, что это не работает

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

Пн апр 15, 2019 10:15:25

Я б, как старый ардуинщик, написал бы в лоб:

Ардуинщики пишут на С++, потому аргументы имеет смысл передавать как ссылки, что и делает стандартная функция swap, правда она еще и шаблонная:
Код:
void SwapInt16Values(int16_t& pValue1, int16_t& pValue2)
{
  int16_t TempValue = pValue1;
  pValue1 = pValue2;
  pValue2 = TempValue;
}

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

Пн апр 15, 2019 10:36:21

Вроде дошло.

void SwapInt16Values(int16_t& pValue1, int16_t& pValue2)

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

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

Пн апр 15, 2019 10:38:14

Чем это хуже?


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

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


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

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


Вот тут не понял. Функция void SwapInt16Values(int16_t& pValue1, int16_t& pValue2) не шаблонная. 8)

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

Пн апр 15, 2019 10:46:34

Вот тут не понял. Функция void SwapInt16Values(int16_t& pValue1, int16_t& pValue2) не шаблонная. 8)

Для SwapInt16Values я просты ссылки добавил, а std::swap() - шаблонная, но тут грузить еще и шаблонами никакого смысла нет :)

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

Пн апр 15, 2019 10:57:18

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

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

Пн апр 15, 2019 11:30:32

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

Нюансы есть, например, по константной сылке можно передать временный объект:
Код:
set(Point{10, 20});

А указатель у него не возьмешь... Но изначально автора вопроса интересовало можно ли избавиться от указателей внутри функции, так что основная разница в упрощении.

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

Пн апр 15, 2019 11:34:38

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

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

Пн апр 15, 2019 11:59:10

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

Когда-то читал, но сейчас точно не скажу, вроде дело в невозможности применять & к rvalue, а временные объекты как раз rvalue и есть.
Ответить