Например TDA7294

Форум РадиоКот • Просмотр темы - Вопросы по С/С++ (СИ)
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 09:35:35

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7588 ]     ... , , , 268, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт мар 22, 2018 19:10:04 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
Цитата:
/ sz: делаем каноничненько - алиасим тип указателя на функцию
Спойлер
Код:
typedef void (*TvvPtr)(void);

ничешно так-то :write:


Цитата:
Код:
uint8_t  *PtrPunkt;
// sz: когда устанете бороться с компилятором - напишите так: TvvPtr PtrPunkt;

ну это после ваших вмешательств придется так написать :roll:

Цитата:
Код:
PtrPunkt=&(LEVEL1 MENU_LEVEL1->Ptr1HWS);
// sz: не выйдет в мышь впихнуть кота - любой заметит: - "Фактура не та!"Синтакс - ужасен - достаточно
Код:
PtrPunkt=MENU_LEVEL1->Ptr1HWS;

здесь да,чет тупанул,этоже и так все адреса.


Цитата:
// sz: да и за полностью прописные имена типов/переменных и прочих не #define-ов - тру-Сишники из вас кактус сделают. :-) Ибо заповедано: -"Прописными - только #define-ы!"
пока вроде как ничего не выкатывали,но намотаю на ус! :write:


//
Цитата:
sz: а если-бы функция имела аргументы?

тут я позабочусь об этом :tea:

Цитата:
Код:
*PtrPunkt;
И таблицу приоритетов посмотрите - кто кого перетянет. ;-)

тут вроде перетягивать нечему :
Код:
dont_know: (*PtrPunkt);
если так то скобки в приоритете.но у меня и так нет ничего кроме того что в скобках :shock:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт мар 22, 2018 21:14:41 
Потрогал лапой паяльник
Аватар пользователя

Карма: 20
Рейтинг сообщений: 121
Зарегистрирован: Вс янв 19, 2014 22:41:55
Сообщений: 353
Рейтинг сообщения: 1
Цитата:
Код:
*PtrPunkt;
И таблицу приоритетов посмотрите - кто кого перетянет. ;-)

тут вроде перетягивать нечему :
Код:
dont_know: (*PtrPunkt);
если так то скобки в приоритете.но у меня и так нет ничего кроме того что в скобках :shock:

Я про те скобки, которые function call. Они с высшим приоритетом, а указатель ешё и разыменовать надо - и у этой операции (dereference) приоритет ниже. За ассоциативность не утверждаю, но
Код:
(*PtrPunkt)();
должно сработать как надо.

_________________
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт мар 22, 2018 21:28:45 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
должно сработать как надо.
Спасибо,ща испытаю


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 07:09:07 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Siarzhuk писал(а):
но
Код:
(*PtrPunkt)();

должно сработать как надо.
вроде как и PtrPunct(); должно сработать, хотя за всеми тонкостями предлагаемой типизации указателей я не следил...

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 12:05:20 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
вроде как и PtrPunct(); должно сработать

до этой строчки у меня уже компилятор кипит ошибками и предупреждениями. Для более ясной картины выложу весь код.
ошибки такие:
1) при инициализации указетелей структуры,для того чтобы использовать операцию (->) пишет мол conflicting types for 'Ptr_MeNU_LEVEL2_HWS чем ему не нравятся мои типы не пойму. При этом еще выдает invalid type argument of '->' (have 'int') в строках использования операции (->).
2) при использовании операции (.)все устраивает.

P.S В PtrPunkt мне нужно сохранить адрес где хранится указатель на функцию и уже после этого нужно ее вызвать с помощью PtrPunkt
Menu_v20.h
Спойлер
Код:
#ifndef MENUv20_H_
#define MENUv20_H_

void opredelenieUkazatela(uint8_t);// определения указателя
//----------
//----------
//---------- вывода на дисплей------------------------------------------------------------------------------------------------------------------
void output_level_1_GWS (void);    // выводит на дисплей уровень 1 для ГВС                         "GWS"
void output_level_21_GWS(void);    // выводит на дисплей уровень 2.1(1 подпункт 2 уровня) для ГВС  "TEK"         текущие параметры
void output_level_22_GWS(void);    // выводит на дисплей уровень 2.2(2 подпункт 2 уровня) для ГВС  "YAHR"        потребление за год     
void output_level_23_GWS(void);    // выводит на дисплей уровень 2.3(3 подпункт 2 уровня) для ГВС  "TEMPER_MIN"  минимальная
//----------

void output_level_1_HWS (void);    // выводит на дисплей уровень 1 для ХВС                          "HWS"
void output_level_21_HWS(void);    // выводит на дисплей уровень 2.1(1 подпункт 2 уровня) для ХВС   "TEK"         текущие параметры
void output_level_22_HWS(void);    // выводит на дисплей уровень 2.2(2 подпункт 2 уровня) для ХВС   "YAHR"        потребление за год
void output_level_23_HWS(void);    // выводит на дисплей уровень 2.2(3 подпункт 2 уровня) для ХВС   "TEMPER_MIN"  минимальная

//----------
typedef void(*TvvPtr)(void); // новый тип указателя на функцию
TvvPtr PtrPunkt;  // указатель для хранения адреса последненго пункта

//---тип структуры 1 уровня--------------------------------------------------------------------------------------------------------------------------------------------------
typedef struct 
{
      TvvPtr PtrGWS;           // пункт меню на первом уровне
      TvvPtr PtrHWS;           // пункт меню на первом уровне
}Level1;   //---тип структуры 1 уровня             

//----тип структуры 2 уровня-------------------------------------------------------------------------------------------------------------------------------------------------------------------
typedef struct
{
    TvvPtr PtrTEK;                // пункт меню на втором  уровне
    TvvPtr PtrYAHR;               // пункт меню на втором  уровне
    TvvPtr PtrTEMP_min;       
}Level2;    //тип структуры 2 уровня

//--объявление структур уровней--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Level1 MeNU_LEVEL1;               // структура 1 уровня
Level2 MeNU_LEVEL2_GWS;           // структура 2 уровня для GWS
Level2 MeNU_LEVEL2_HWS;           // структура 2 уровня для HWS



//---указатель на структуры уровней---------------------------------------------------------------------------------------------------------------------------------------------------
 Level1 *Ptr_MeNU_LEVEL1;         //указатель на Левел
 Level2 *Ptr_MeNU_LEVEL2_GWS;     //указатель на Левел 2 ГВС
 Level2 *Ptr_MeNU_LEVEL2_HWS;     //указатель на Левел 2 ХВС

//----------

//----------
#endif  /*MENUv20_H_*/


Menu_v20.c
Спойлер
Код:
 #include "Menu_v2.0.h"
 #include <stdio.h>
 #define ENTER  0x25
 #define UP     0x23
 #define DN     0x56
 #define CANCEL 0x26
 
 //---инициализация структур-----------------------------------------------------------------------------------------------------
Level1 MeNU_LEVEL1={output_level_1_GWS,output_level_1_HWS};                             // инициализируем структуру 1 уровня
Level2 MeNU_LEVEL2_GWS={output_level_21_GWS,output_level_22_GWS,output_level_23_GWS};   // инициализируем структуру 2 уровня для GWS
Level2 MeNU_LEVEL2_HWS={output_level_21_HWS,output_level_22_HWS,output_level_23_HWS};   // инициализируем структуру 2 уровня для HWS

//----инициализация указателей на структуру--------------------------------------------------------------------
Ptr_MeNU_LEVEL1=MeNU_LEVEL1;          // указетелю присваиваем адрес структуры MeNU_LEVEL1
Ptr_MeNU_LEVEL2_GWS=MeNU_LEVEL2_GWS;  // указетелю присваиваем адрес структуры MeNU_LEVEL2_GWS;
Ptr_MeNU_LEVEL2_HWS=MeNU_LEVEL2_HWS;  // указетелю присваиваем адрес структурыMeNU_LEVEL2_HWS

void opredelenieUkazatela(uint8_t key_kod) // получает код нажатой клавиши
{
   switch(key_kod)
   {
      
   //---ввод------------------------------------------------------------------------------------------------------------------------------------------------
      
      case ENTER:  if(PtrPunkt==NULL)                                                    PtrPunkt=Ptr_MeNU_LEVEL1->PtrGWS;        break;                      //
                     if(PtrPunkt==(Ptr_MeNU_LEVEL1->PtrGWS))                PtrPunkt=Ptr_MeNU_LEVEL2_GWS->PtrTEK;    break;                  //
                          if(PtrPunkt==(Ptr_MeNU_LEVEL1->PtrHWS))                PtrPunkt=Ptr_MeNU_LEVEL2_HWS->PtrTEK;    break;                 //
               
           
   //---вниз-------------------------------------------------------------------------------------------------------------------------------------------         
      case DN:    if(PtrPunkt==(MeNU_LEVEL1.PtrGWS))                    PtrPunkt=MeNU_LEVEL1.PtrHWS;           break;                 // переход  с в 1
                       if(PtrPunkt==(MeNU_LEVEL2_GWS.PtrTEK))             PtrPunkt=MeNU_LEVEL2_GWS.PtrYAHR;      break;                   // переход 
                            if(PtrPunkt==(MeNU_LEVEL2_GWS.PtrYAHR))           PtrPunkt=MeNU_LEVEL2_GWS.PtrTEMP_min;  break; // переход  с в 2
                       if(PtrPunkt==(MeNU_LEVEL2_HWS.PtrTEK))             PtrPunkt=MeNU_LEVEL2_HWS.PtrYAHR;      break;                   //
                  if(PtrPunkt==(MeNU_LEVEL2_HWS.PtrYAHR))           PtrPunkt=MeNU_LEVEL2_HWS.PtrTEMP_min;  break; // переход  с в 2
               
   //---вверх-----------------------------------------------------------------------------------------------------------------------------------------------
        case UP:   if(PtrPunkt==(MeNU_LEVEL1.PtrHWS) )                        PtrPunkt=MeNU_LEVEL1.PtrGWS;           break;            // переход  с в 1
                        if(PtrPunkt==(MeNU_LEVEL2_GWS.PtrTEMP_min))        PtrPunkt=MeNU_LEVEL2_GWS.PtrYAHR;      break;       // переход  с в 2
                        if(PtrPunkt==(MeNU_LEVEL2_GWS.PtrYAHR) )              PtrPunkt=MeNU_LEVEL2_GWS.PtrTEK;       break; // переход  с в 2 уровне
              if(PtrPunkt==(MeNU_LEVEL2_HWS.PtrTEMP_min))        PtrPunkt=MeNU_LEVEL2_HWS.PtrYAHR;      break;       // переход  с в
                        if(PtrPunkt==(MeNU_LEVEL2_HWS.PtrYAHR))                PtrPunkt=MeNU_LEVEL2_GWS.PtrTEK;       break; // переход  с в 2
               
               
               
   //----назад---------------------------------------------------------------------------------------------------------------------------------------------

      case CANCEL: if(PtrPunkt==(MeNU_LEVEL2_GWS.PtrYAHR)||(MeNU_LEVEL2_GWS.PtrTEMP_min)||(MeNU_LEVEL2_GWS.PtrTEK))   PtrPunkt=MeNU_LEVEL1.PtrGWS; break;        // переход  с в 1 уровне меню на подменю
                 if(PtrPunkt==(MeNU_LEVEL2_HWS.PtrYAHR)||(MeNU_LEVEL2_HWS.PtrTEMP_min)||(MeNU_LEVEL2_HWS.PtrTEK))    PtrPunkt=MeNU_LEVEL1.PtrGWS;break;       // переход  с в 2 уровне меню на подменю
                  if(PtrPunkt==(MeNU_LEVEL1.PtrGWS)||(MeNU_LEVEL1.PtrHWS))   PtrPunkt=NULL;                                                      break;       // переход  с в 2 уровне меню на подменю
      //----------
       
 (*PtrPunkt)();  // вызываем функцию по ссылке
   }
   
}


main.c
Спойлер
Код:
#define F_CPU 8000000UL
#include <avr/io.h>

#include "Menu_v2.0.c"
#include "Menu_v2.0.h"


int main(void)
{
   
    while (1)
    {
    opredelenieUkazatela(0x25);
    }
}



Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 12:52:23 
Грызет канифоль

Карма: 9
Рейтинг сообщений: 80
Зарегистрирован: Чт ноя 06, 2014 13:09:06
Сообщений: 251
Рейтинг сообщения: 1
1) Двигайтесь последовательно. Исправляйте самую первую ошибку, которую выдал компилятор. При ее исправлении двигайтесь дальше - компилируйте и переходите к п. 1)

Для начала:

Menu_v20.h:
Код:
Level1 MeNU_LEVEL1;

Код:
...
#include "Menu_v2.0.h" // в Menu_v20.h уже определена MeNU_LEVEL1
...
Level1 MeNU_LEVEL1={output_level_1_GWS,output_level_1_HWS};  // Здесь MeNU_LEVEL1 определяется второй раз!!!!


Продолжаем:
Код:
// MeNU_LEVEL2_GWS имеет тип Level2, а MeNU_LEVEL2_GWS имеет тип 'Level2 *'. разница огромная
Ptr_MeNU_LEVEL2_GWS=MeNU_LEVEL2_GWS;
// Возможно Вы хотели написать
Ptr_MeNU_LEVEL2_GWS = &MeNU_LEVEL2_GWS;


Последний раз редактировалось viiv Пт мар 23, 2018 13:08:04, всего редактировалось 4 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 12:59:50 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ROMan2947 писал(а):
при использовании операции (.)все устраивает.
операция -> применима только к указателю слева, операция . - только к статическому экземпляру структуры. поэтому недопустимо их смешивать.
Код:
typedef struct{
   int a;
   int b;
} my_ struct;

my_struct var1;
my_struct *var2 = &var1;

var1.a = 12; // правильно
var1->a = 12; // ошибка

var2->b = 13; // правильно
var2.b = 13; // ошибка


Добавлено after 1 minute 18 seconds:
И еще чисто моё личное, предвзятое, мнение: вас, случайно, не в Майкрософте программированию обучали? это у них приняты длиннючие типы с тремя и более подчеркиваниями и мешаниной заглавных и прописных букв...

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 13:31:13 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
с понятиями определена, описана,объявлена, инициализирована одни путаницы.
мое понимание:
ОПРЕДЕЛЕНИЕ ОПИСАНИЕ ОБЪЯВЛЕНИЕ это одно и тоже
ИНИЦИАЛИЗАЦИЯ это присвоение уже ОПРЕДЕЛЕННОМУ, ОПИСАННОМУ, ОБЪЯВЛЕННОМУ
так что есть что?


Код:
#include "Menu_v2.0.h"
// в Menu_v20.h уже определена MeNU_LEVEL1 [/quote] Да она там определена,но не инициализирована
...
Цитата:
Код:
Level1 MeNU_LEVEL1={output_level_1_GWS,output_level_1_HWS};
// Здесь MeNU_LEVEL1 определяется второй раз!!!!

здесь я ее инициализирую

Цитата:
Продолжаем:
Код:
// MeNU_LEVEL2_GWS имеет тип Level2, а MeNU_LEVEL2_GWS имеет тип &#39;Level2 *&#39;. разница огромная
Ptr_MeNU_LEVEL2_GWS=MeNU_LEVEL2_GWS; [/quote] здесь надо подумать

[quote]// Возможно Вы хотели написать
[code]Ptr_MeNU_LEVEL2_GWS = &MeNU_LEVEL2_GWS;
я пробовал так писать, ошибки были

Добавлено after 7 minutes 50 seconds:
операция -> применима только к указателю слева, операция . - только к статическому экземпляру структуры.

это я понимаю, так у меня в коде где используется операция стрелка слева указатель на структуру
а где операция точка сама структура.

[quote]И еще чисто моё личное, предвзятое, мнение: вас, случайно, не в Майкрософте программированию обучали? это у них приняты длиннючие типы с тремя и более подчеркиваниями и мешаниной заглавных и прописных букв...

нет к сожалению,приходиться самому и с помощью форума обучаться!Мне главное, чтоб не запутаться, при этом ничего не нарушать :write:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 13:43:58 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ROMan2947 писал(а):
с понятиями определена, описана,объявлена, инициализирована одни путаницы.
это плохо.
если своими словами, то:
1. каждая сущность программы на Си может быть ОПИСАНА, РЕАЛИЗОВАНА и ИСПОЛЬЗОВАНА.
2. описана (объявлена) - это значит, что компилятор уведомлен о том, что в программе такая сущность МОЖЕТ существовать. где - пока не ясно
3. реализация сущности - это команда компилятору выделить память и(возможно) заполнить её какими-то данными. теперь эта сущность существует на самом деле.
4. использование - это работа с описанной и реализованой сущностью.
5. описание, реализация и использование могут быть не все сразу, а частично, минимально необходимый вариант - реализация, если её нет - считай, все остальное смысла не имеет
6. любое использование должно быть после реализации, любая реализация - после описания. и никак иначе. при этом реализация заменяет собой описание, т.е. при наличии реализации описание становится необязательным. но при наличии описания не обязательна реализация.

под сущностью я подразумеваю любую элементарную конструкцию языка Си: тип, переменную, структуру, функцию. макрос не является в строгом понимании элементом языка Си (это к препроцессору относится), и поэтому не в полной мере удовлетворяет этому описанию.

примеры
Код:
extern int var; // описание переменной
int var; // реализация переменной
var = 12; // использование переменной

int foo(void); // описание функции
int foo(void){
  return 12;
} // реализация функции

var = foo(); // использование функции


разве тут есть путаница?

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 13:56:40 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
примеры
Код:
extern int var; // описание переменной
int var; // реализация переменной

разве тут есть путаница?
Страшно тонкая грань :roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 14:02:54 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ничего тонкого: первая строка просто рассказывает, что где-то там (extern - вовне, снаружи) переменная типа int и идентификатором var МОЖЕТ БЫТЬ ЕСТЬ.
вторая явно показывает, что эта переменная ЕСТЬ.

другое дело, что часто применяют термин ОПРЕДЕЛЕНА вместо РЕАЛИЗОВАНА, подразумевая, что определенность - признак существования, но фактически это не корректно (хотя и широко используется). например, никогда не говорят об ОПРЕДЕЛЕНИИ методов класса, но только о РЕАЛИЗАЦИИ (это уже из С++, но сути не меняет). поэтому я сам для себя использую вышеприведенную классификацию, меня понимают все программисты, а я не путаюсь. чего и вам желаю.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 14:08:13 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
описание структуры типа Level1. Т.е мы дали понять компилятору, что возможно есть такой тип.
Код:
typedef struct 
{
      TvvPtr PtrGWS;           // пункт меню на первом уровне
      TvvPtr PtrHWS;           // пункт меню на первом уровне
}Level1;   //---тип структуры 1 уровня   


Код:
Level1 MeNU_LEVEL1;
- это уже реализация так как компилятор выделяет память для структуры MeNU_LEVEL1 типа Level1 это должно находиться в исходнике модуля
Код:
Level1 MeNU_LEVEL1={output_level_1_GWS,output_level_1_HWS};
это использование и тоже должен быть в исходнкие

правильно мыслю?

Добавлено after 1 minute 59 seconds:
чего и вам желаю.

Спасибо! :beer: подкинули лошадиную долю над чем поразбираться.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 14:13:58 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ROMan2947 писал(а):
Т.е мы дали понять компилятору, что возможно есть такой тип
нет, тип в момент описания уже существует, для него два этапа (описание и реализация) неразделимы по по определению, т.к. тип - это не материальное явление, а описательное.
ROMan2947 писал(а):
правильно мыслю?
в общем и целом - да, но по-моему, Си не позволяет производить присваивания переменным структурного типа кроме как в момент реализации.
Код:
Level1 MeNU_LEVEL1={output_level_1_GWS,output_level_1_HWS};
такое можно написать в секции ОПРЕДЕЛЕНИЯ/ОПИСАНИЯ, но не внутри функции на этапе ИСПОЛЬЗОВАНИЯ.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 14:27:19 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
[quote="ROMan2947"] но по-моему, Си не позволяет производить присваивания переменным структурного типа кроме как в момент реализации.
да верно!

так нельзя!
Код:
Level1 MeNU_LEVEL1;
MeNU_LEVEL1={output_level_1_GWS,output_level_1_HWS};

а так можно!
Код:
Level1  MeNU_LEVEL1=    {output_level_1_GWS,output_level_1_HWS};

P.S. как можно все это знать :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 14:31:56 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ROMan2947 писал(а):
как можно все это знать
зададите этот вопрос самому себе примерно через годик :)

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 23, 2018 14:36:16 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
зададите этот вопрос самому себе примерно через годик :)
Дай Бог :roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс мар 25, 2018 13:06:12 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
Здравствуйте! Работу модуля опроса клавиатуры нужно отладить с основным модулем.
1) Опрос клавиатуры происходит по таймеру. Где нужно помещать обработчик прерывании, в основном модуле или же в исходнике модуля клавиатуры? На практике пока разницы не заметил.На данный момент обработчик я поместил в исходник главного модуля.
2) Имеется переменная BuTTOn,она объявлена в исходнике главного модуля.при прерывании по таймеру я передаю ее адрес в функцию опроса в модуль клавиатуры. Там по ее адресу присваиваю код кнопки. По выходу из прерывания идет проверка на наличие в переменной BuTTON кода,при ее наличии передаю адрес этой переменной в модуль Меню.Компилируется все хорошо,ошибок нет.Отладчиком проходил, программа производит опрос кнопок и правильно присваивает переменной BuTTON код нажатой кнопки. но не переходит в модуль меню.
3) В чем разница использования внешней переменной и работать просто с адресом переменной? я работаю с адресом переменной в сторонних модулях и ниче вроде все работает как надо.
main.h
Спойлер
Код:
#ifndef MAIN_H_
#define MAIN_H_
#define F_CPU 8000000UL
#include <avr/io.h>
#include <stdio.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <stdint.h>

#endif /*MAIN_H_*/

main.c
Спойлер
Код:
#include "main.h"
#include "Menu_v2.0.c"
#include "Menu_v2.0.h"
#include "KEY.c"
#include "KEY.h"

uint8_t BuTTON;

ISR(TIMER0_COMP_vect)
{
   key(&BuTTON);
}

int main(void)
{
//--- инициализация---------------------------------------------------------
     KEY_init();
     sei();
   while (1)
   {
      
      if(BuTTON)
      {
         opredelenieUkazatela(&BuTTON);
      }
      
   }
}

KEY.h
Спойлер
Код:
#ifndef KEY_H_
#define KEY_H_

#define KEY_DDR_OUT DDRD
#define KEY_PORT_OUT PORTD

#define KEY_DDR_IN DDRC
#define KEY_PORT_IN PORTC
#define KEY_PIN PINC

#define stroka_1  7
#define stroka_2  6
#define stolbec_1 6
#define stolbec_2 7
#define DREBESK   0x50

#define Enter  0x90   //10010000
#define Cancel 0x60   //01100000
#define DN     0x50   //01010000
#define UP     0xA0   //10100000

void KEY_init(void);      // инициализация клавиатуры
void key(uint8_t*);       // функция опроса клавиатуры
#endif


KEY.c
Спойлер
Код:
#include "KEY.h"
#include "main.h"


uint8_t RES=0;

//-------инициализация клавиатуры и таймера Т0-----------------------------
void KEY_init(void)
{
   KEY_DDR_IN &=~((1<<stolbec_1)|(1<<stolbec_2));
   KEY_PORT_IN|=(1<<stolbec_1)|(1<<stolbec_2);

   KEY_DDR_OUT |=(1<<stroka_1)|(1<<stroka_2);
   KEY_PORT_OUT|=(1<<stroka_1)|(1<<stroka_2);
   TCCR0|=(1<<WGM01)|(1<<CS01)|(1<<CS00); // режим СТС, предделитель 8
   TIMSK|=(1<<OCIE0);                     // включение прерывания при совпадении
   TCNT0=0;
   OCR0=254;
   
}
//----------



void key(uint8_t*BuTTON_key)
{
   uint8_t buffer=0;
   static uint8_t  count =0;
   
   for(char i=stroka_1; i>=stroka_2;i--)
   {
      
      for(char i=stroka_1; i>=stroka_2;i--)
      {
         
         KEY_PORT_OUT&=~(1<<i);
         RES=(KEY_PORT_OUT&0xC0)|((KEY_PIN&0xC0)>>2);
         KEY_PORT_OUT|=1<<i;

         switch (RES)
         {
            case Enter : buffer=Enter  ;break;
            case Cancel: buffer=Cancel ;break;
            case UP    : buffer=UP     ;break;
            case DN    : buffer=DN     ;break;
         }
      }
      if(buffer)
      {
         if(count==DREBESK)
         {
               (*BuTTON_key)=buffer;
            buffer=0;
            count=0;
            //TIMSK&=~(1<<OCIE0);
         }
         else count++;
      }
      else count=0;

   }

}






Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс мар 25, 2018 13:37:15 
Говорящий с текстолитом
Аватар пользователя

Карма: 33
Рейтинг сообщений: 148
Зарегистрирован: Вс июн 24, 2012 16:07:00
Сообщений: 1572
Откуда: Лен.Обл.
Рейтинг сообщения: 1
Цитата:
Где нужно помещать обработчик прерывании, в основном модуле или же в исходнике модуля клавиатуры?


Там, где он логически согласуется с принятой структурой программы. Если у вас принято все обработчики держать в главном модуле, то там. А если вы их хотите держать в модулях (с логикой подобное к подобному), то держите там.

Цитата:
Имеется переменная BuTTOn,она объявлена в исходнике главного модуля.при прерывании по таймеру я передаю ее адрес в функцию опроса в модуль клавиатуры. Там по ее адресу присваиваю код кнопки.


Вам нужен модификатор volatile при объявлении переменной BuTTOn. Компилятор не знает, что эта переменная может измениться где-то ещё, потому способен "оптимизировать" все обращения к этой переменной. Ну и красиво было бы запрещать прерывания при работе с переменной в основном потоке.

Цитата:
В чем разница использования внешней переменной и работать просто с адресом переменной? я работаю с адресом переменной в сторонних модулях и ниче вроде все работает как надо.


Работайте так, как вам удобно. Правда, смысла передавать адрес нет никакого в вашем случае. Объявите переменную как extern в модулях, её использующих, и она станет там доступна как обычно, по имени. Я так понимаю, вы именно из-за недоступности этой переменной в key.c и придумали передавать адрес?

_________________
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс мар 25, 2018 13:49:10 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
Цитата:
Там, где он логически согласуется с принятой структурой программы. Если у вас принято все обработчики держать в главном модуле, то там. А если вы их хотите держать в модулях (с логикой подобное к подобному), то держите там

Для меня логичнее ее держать в модуле клавиатуры,т.к. обработчик относиться к клавиатуре.Я хотел узнать наличие разницы кроме как логики.

Цитата:
Вам нужен модификатор volatile при объявлении переменной BuTTOn. Компилятор не знает, что эта переменная может измениться где-то ещё, потому способен "оптимизировать" все обращения к этой переменной.
Учту!Хотя изменения этой переменной происходят без проблем, да и предупреждение думаю было бы,а его нет.

Цитата:
Ну и красиво было бы запрещать прерывания при работе с переменной в основном потоке.
Понял!

Цитата:
И имейте в виду вот что - компилятор не обязан все инструкции выполнять по-порядку.
как это не обязан :shock: :shock: :shock:
это же страшно важно!!!

Цитата:
Я так понимаю, вы именно из-за недоступности этой переменной в key.c и придумали передавать адрес?
Нет! просто пока мне не совсем понятна работы c extern на практике, а с указателями понятно, вот решил работать с ними.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс мар 25, 2018 13:55:48 
Говорящий с текстолитом
Аватар пользователя

Карма: 33
Рейтинг сообщений: 148
Зарегистрирован: Вс июн 24, 2012 16:07:00
Сообщений: 1572
Откуда: Лен.Обл.
Рейтинг сообщения: 1
Цитата:
Для меня логичнее ее держать в модуле клавиатуры,т.к. обработчик относиться к клавиатуре.Я хотел узнать наличие разницы кроме как логики.


Тогда там и держите. :) Разницы никакой.

Цитата:
как это не обязан :shock: :shock: :shock: это же страшно важно!!!


Вот чтобы вас не пугать и не запутать, я и стёр то, что написал. :)
Не беспокойтесь - для вашего прерывания это не важно - пока вы не выйдете из прерывания, основная программа не продолжится. Но в настоящих многопоточных приложениях просто имейте это в виду. ;) Подробности вы прочтете в "Барьеры памяти и компилятора". Например, тут: http://scrutator.me/post/2015/05/16/mem ... riers.aspx

Цитата:
Нет! просто пока мне не совсем понятна работы c extern на практике, а с указателями понятно, вот решил работать с ними.


На практике в модуле key.h вы пишете после #include
extern uint8_t BuTTON;

И дальше работаете с этой переменной, как с глобальной.

Цитата:
Учту!Хотя изменения этой переменной происходят без проблем, да и предупреждение думаю было бы,а его нет.


Предупреждения и не будет. Это не ошибка. Кстати, у вас этот самый BuTTON стоит инициализировать.
Фишка в том, что вот это:
Код:
if(BuTTON)
      {
         opredelenieUkazatela(&BuTTON);
      }


после компиляции (не в Debug-конфигурации!) превратится в:
Код:
if(0)
      {
         opredelenieUkazatela(&BuTTON);
      }



И будет выброшено из программы. А что? BuTTON внутри цикла не меняется.

_________________
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7588 ]     ... , , , 268, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y