
Вопросы по С/С++ (СИ)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)

если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Пока_без_кота
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Re: Вопросы по С/С++ (СИ)
Доброго времени суток.
Жил не тужил у меня вот такой кусок кода:
который в цикле выводил отладочные значения неких коэффициентов.
Потом, в один прекрасный момент, он начал выводить для всех коэффициентов значение 50.
Это вылечилось добавлением квалификатора static для переменной k.
Но если честно, то мне не совсем понято, зачем он здесь нужен. Ведь он дает сохранятся переменной МЕЖДУ ВЫЗОВАМИ функции/цикла. Неужели каждый раз при проверке условия цикла осуществляется "выход" из него ? Я почему-то всегда думал, что осуществляется начальная проверка условия, вход, после каждого прохода - проверка условия, и только если условие не удовлетворено - выход.
Жил не тужил у меня вот такой кусок кода:
Спойлер
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
Лучше не static сделать, а просто вынести выше тела цикла. Внутри фигурных скобок, естественно, переменная равна 50 - она, как и задумано в этом коде, инициализируется на каждой итерации.
Данная переменная вообще никакого отношения к условию цикла не имеет, непонятно, чему тут можно удивляться.
Данная переменная вообще никакого отношения к условию цикла не имеет, непонятно, чему тут можно удивляться.
Re: Вопросы по С/С++ (СИ)
Добрый день подскажите , как соединить две библиотеки .С .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
на выходе buf.c это все разворачивается в
Естественно он не может понять. Как это сделать правильнее? Можно конечно перенести typedef struct {...}TstackLow; в Config.h и тогда проблема исчезнет, но не хочу плодить разные сущности в одном файле, если у них есть свой(buf.h)
Возможно это из моей неправильно концепции, где я создаю app.h и его инклужу ко все библиотекам, а внутрь его уже добавляю то что может использоваться во всех модулях (тип процессора(stm32f1,stm32f4,..), таймеры, светодиоды, и тд..)
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: Вопросы по С/С++ (СИ)
Вы пытаетесь внутри config.h обратиться к неизвестному типу TstackLow, не включив файл buf.h, где он определён. Естественно, это приведёт к ошибке.
То, что в config.h включен app.h, в котором уже включен buf.h, может не сработать, если получается циклическая зависимость. Убедитесь, что у Вас нет такой ситуации, когда какой-нибудь .h файл через цепочку других include-ов может включить сам себя. Скорее всего, именно в этом проблема и заключается. В неправильной концепции, то есть.
То, что в config.h включен app.h, в котором уже включен buf.h, может не сработать, если получается циклическая зависимость. Убедитесь, что у Вас нет такой ситуации, когда какой-нибудь .h файл через цепочку других include-ов может включить сам себя. Скорее всего, именно в этом проблема и заключается. В неправильной концепции, то есть.
Re: Вопросы по С/С++ (СИ)
Благодарю!
Решил пора перейти с С на С++, но тут столько проблем возникает. (в с++ знания нулевые)
До это писал на IAR все на С при переходе на с++ там надо сишный вариант startup, на IAR его фиг найдешь, какой то нашел но там компилятор ругается на using ...., то ли из за версии то ли не поддерживает ...
В каком компиляторе лучше начинать ? Пытался настроить как-то eclips, но времени было мало, проект не завелся, вот думаю продолжить, но приодеться разбираться в компиляторе + с++ ....
Решил пора перейти с С на С++, но тут столько проблем возникает. (в с++ знания нулевые)
До это писал на IAR все на С при переходе на с++ там надо сишный вариант startup, на IAR его фиг найдешь, какой то нашел но там компилятор ругается на using ...., то ли из за версии то ли не поддерживает ...
В каком компиляторе лучше начинать ? Пытался настроить как-то eclips, но времени было мало, проект не завелся, вот думаю продолжить, но приодеться разбираться в компиляторе + с++ ....
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[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 в этом плане хороший выбор. Но если озвучишь тип процессора можно и ещё что-то подобрать.
[uquote="pokk",url="/forum/viewtopic.php?p=3594246#p3594246"]на IAR его фиг найдешь, .[/uquote]О каком процессоре речь? Вообще, можно и самому написать, у IAR стартапы простые - таблица векторов да переход на clib.[uquote="pokk",url="/forum/viewtopic.php?p=3594246#p3594246"]В каком компиляторе лучше начинать ?[/uquote]В том на который лучше документация и возможность получить помощь на форуме. IAR в этом плане хороший выбор. Но если озвучишь тип процессора можно и ещё что-то подобрать.
Re: Вопросы по С/С++ (СИ)
Процессор stm32f103xx
Да startap я уже переписал(воткнул таблицу прерываний из серии 103,остальное все так оставил), взял за основу f412RE (см файл)
Правда на
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:
Где-то видал обсуждение что gcc по С++ на голову всех остальных компиляторов превосходит.
Да 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: Вопросы по С/С++ (СИ)
Для 103-го вот такого стартапа достаточно. Не нужен в стартапе С++.
На ASM, кстати, можно немного сэкономить в размере, разместив DefaultHandler внутри таблицы векторов. Зацените.
На ASM, кстати, можно немного сэкономить в размере, разместив DefaultHandler внутри таблицы векторов. Зацените.
- Вложения
-
- startup_stm32f103xb.s.txt
- (6.64 КБ) 209 скачиваний
-
- startup_iar_stm32f103x8.c
- (6.2 КБ) 219 скачиваний
Re: Вопросы по С/С++ (СИ)
Что такое weak, alias ? Читал читал, но так и не дошло, что там происходит.
Смутные понимание, что типа каждая функция (NMI_Handler)
По дефолту заменяется на Default_Handler, если она не объявлена пользователем.
Смутные понимание, что типа каждая функция (NMI_Handler)
Код: Выделить всё
void NMI_Handler() __attribute__ ((weak, alias ("Default_Handler")));По дефолту заменяется на Default_Handler, если она не объявлена пользователем.
- Allex
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Вс ноя 12, 2006 06:33:28
- Откуда: Владивосток
Re: Вопросы по С/С++ (СИ)
В процессе творческого копипащенья одного кода, встретил такую функцию:
ну и вызов, соответственно:
Скажите, а все вот эти упражнения со ссылками и указателями имеют практический смысл? В плане быстродействия, или может чего другого... Я б, как старый ардуинщик, написал бы в лоб:
Чем это хуже?
Код: Выделить всё
//========================
// Процедура смены местами 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: Вопросы по С/С++ (СИ)
тем, что это не работаетAllex писал(а):Чем это хуже?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="Allex",url="/forum/viewtopic.php?p=3616862#p3616862"]Я б, как старый ардуинщик, написал бы в лоб:[/uquote]
Ардуинщики пишут на С++, потому аргументы имеет смысл передавать как ссылки, что и делает стандартная функция swap, правда она еще и шаблонная:
Ардуинщики пишут на С++, потому аргументы имеет смысл передавать как ссылки, что и делает стандартная функция 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: Вопросы по С/С++ (СИ)
Вроде дошло.
void SwapInt16Values(int16_t& pValue1, int16_t& pValue2)
Просто меняем адреса переменных? Или не дошло?
void SwapInt16Values(int16_t& pValue1, int16_t& pValue2)
Просто меняем адреса переменных? Или не дошло?
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Чем это хуже?
Тем, что вы передаёте параметры по значению. То есть, в функцию попадают не внешние переменные, а только их значения. Если же передать по ссылке/указателю, то передаётся ссылка/указатель и вы получаете возможность менять значение переменных.
Просто меняем адреса переменных? Или не дошло?
Не адреса, а значения.
что и делает стандартная функция swap, правда она еще и шаблонная:
Вот тут не понял. Функция void SwapInt16Values(int16_t& pValue1, int16_t& pValue2) не шаблонная.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Re: Вопросы по С/С++ (СИ)
[uquote="da-nie",url="/forum/viewtopic.php?p=3616889#p3616889"]Вот тут не понял. Функция void SwapInt16Values(int16_t& pValue1, int16_t& pValue2) не шаблонная.
[/uquote]
Для SwapInt16Values я просты ссылки добавил, а std::swap() - шаблонная, но тут грузить еще и шаблонами никакого смысла нет
Для SwapInt16Values я просты ссылки добавил, а std::swap() - шаблонная, но тут грузить еще и шаблонами никакого смысла нет
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
я дико извиняюсь: а в контексте параметров функции какая разница между ссылкой и указателем? только что ссылка не может изменяться или еще какие-то нюансы есть?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=3616906#p3616906"]а в контексте параметров функции какая разница между ссылкой и указателем? только что ссылка не может изменяться или еще какие-то нюансы есть?[/uquote]
Нюансы есть, например, по константной сылке можно передать временный объект:
А указатель у него не возьмешь... Но изначально автора вопроса интересовало можно ли избавиться от указателей внутри функции, так что основная разница в упрощении.
Нюансы есть, например, по константной сылке можно передать временный объект:
Код: Выделить всё
set(Point{10, 20});А указатель у него не возьмешь... Но изначально автора вопроса интересовало можно ли избавиться от указателей внутри функции, так что основная разница в упрощении.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
то естьReflector писал(а):set(Point{10, 20});
Код: Выделить всё
set(&Point{10, 20});если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=3616929#p3616929"]недопустимо, если в set параметр указатель? интересно, почему? временный объект создается же в памяти, и имеет адрес... или опять нюансы?[/uquote]
Когда-то читал, но сейчас точно не скажу, вроде дело в невозможности применять & к rvalue, а временные объекты как раз rvalue и есть.
Когда-то читал, но сейчас точно не скажу, вроде дело в невозможности применять & к rvalue, а временные объекты как раз rvalue и есть.