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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

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

a value of type "const t_point *" cannot be assigned to an entity of type "t_point *"
Ему не нравится, что у вас был указатель на константу, а вы его перенесли в обычный указатель.

У вас const t_point *Line;

А

t_point* p0 = NULL;
t_point* p = NULL;

и дальше вот так:

for (p0 = Font[C].Line, p = Font[C].Line + 1; 0 == p->eol; p0 = p, p++) {

Вам надо модификатор const применить и к p и к p0.

const t_point* p0 = NULL;
const t_point* p = NULL;

Либо снять константность при приравнивании p0 = (t_point *) Font[C].Line и в других местах тоже.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="Shrike1987",url="/forum/viewtopic.php?p=3323056#p3323056"]..\Src\Font.c(51): error: #513: a value of type "const t_point *" cannot be assigned to an entity of type "t_point *"[/uquote]
1. Идём на https://translate.google.com/#en/ru;
2. Переводим текст ошибки с аспергерского на русский: error: # 513: значение типа "const t_point *" не может быть присвоено сущности типа "t_point *";
3. Осознаем, что тому кто "слева" неприемлемо значение предлагаемое тем кто "справа";
4. Есть два варианта - либо меняем тип "левого" на const t_point*, либо то, что отдают справа насильно считаем типом t_point* (т.е фактически read-only данные считаем возможным модифицировать);

Впрочем это вам уже объяснили и без меня - остается лишь добавить что const - это указание компилятору считать данные неизменяемыми и он, обладая этим знанием, может оптимизировать работу с ними, сэкономив, к примеру оперативную память, обращаясь напрямую к данным из флеш. Но за такими деталями - это вам к специалистам по используемой вами платформе.

Т.е. если вы не планируете менять данные "шрифта" во время выполнения программы - оставляйте их const, если-же нужно менять - придётся определить некий максимум для размера данных символа - и оперировать в его пределах. Ну и поудалять модификаторы const. Примерно так:

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

#define MAX_CHAR_DATA 32

// [омномномном]

                   // при таком способе инициализации данные массива добиваются нулями до размера 32 (MAX_CHAR_DATA)
t_point ch56[MAX_CHAR_DATA] = { 0x10, 0x30, 0x41, 0x42, 0x33, 0x44, 0x45, 0x36, 0x16, 0x05, 0x04, 0x13, 0x02, 0x01, 0x10, BRK, 0x13, 0x33, EOL } ;
                       

// [омномномном]

const struct TFont {
   t_point *Line;
} Font[255]  = {
   ch00, ch01, ch02,   и.т.д, и т.д.....           ,  ch56, ch57,
};

Резюмирую обеими руками за вариант:
[uquote="da-nie",url="/forum/viewtopic.php?p=3323104#p3323104"]const t_point* p0 = NULL;
const t_point* p = NULL;[/uquote]
А вот, в силу вышеобъяснённого, снимать константность
[uquote="da-nie",url="/forum/viewtopic.php?p=3323104#p3323104"]при приравнивании p0 = (t_point *) Font[C].Line и в других местах тоже[/uquote]
после столь любовного расставления этого модификатора на всех данных шрифта я бы не стал. ;-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Родился
Сообщения: 7
Зарегистрирован: Пт мар 02, 2018 16:31:19

Сообщение Shrike1987 »

Всем спасибо за участие! Теперь все компилируется и рисуется =)
Заодно дописал функцию сглаженной линии... Вот только шрифт имеет смысл рисовать сглаженным, если он скейлится...
Для тех, кому интересно, прикладываю пример на фото.

Добавлено after 7 minutes 21 second:
Забыл добавить: символы еще не все добавил. В верхней части слева - сглаженный, справа обычный. В нижней первая строка скейленый шрифт без сглаживания, во второй строке - те же скейленные символы со сглаживанием.
Вложения
TestAntialasingFont2.jpg
TestAntialasingFont
(194.06 КБ) 401 скачивание
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Как сделать установку несколько IP адресов, по феншую? т.е как инициализировать массив из 4 байт и больше.
уже кучу вариантов, придумал и все не нравятся, хотел объявить структуру с дефектными настройками и от туда копировать до N поля, но тут не нравиться что может глюк с выравниванием структуры.
Сделал в лоб, но тут не нравиться что надо массив объявлять.

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

	uint8_t IP[4]={192,168,0,	6};
	SetIP(RAM_SettingAllVar.WiznetSetting.ip,IP);

void SetIP(uint8_t* src,uint8_t* ip){
	src[0]=ip[0];
	src[1]=ip[1];
	src[2]=ip[2];
	src[3]=ip[3];
}
хотел сделать так, а в нутри функции, сдвигами байты из 0xC0A80006 расставлять, но как-то ip 0xC0A80006 не особо читаем :?

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

SetIPv2(RAM_SettingAllVar.WiznetSetting.ip,0xC0A80006);
Если ещё какие нибудь предложения ?
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

typedef union{
   uint32_t ip_long;
   struct{
      uint8_t ip_b0,ip_b1,ip_b2,ip_b3;
   }
} ip_t;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="pokk",url="/forum/viewtopic.php?p=3324853#p3324853"]но как-то ip 0xC0A80006 не особо читаем[/uquote]

Для повышения читаемости, можно так

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

#define IPV4_ADDR(a,b,c,d) (((uint32_t)(a) << 24) | ((uint32_t)(b) << 16) | \
                            ((uint32_t)(c) <<  8) | ((uint32_t)(d) <<  0))
Компилятор (нормальный) без проблем вычислит констатное выражение

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

IPV4_ADDR (192, 168, 0, 6)
на этапе компиляции.
Реклама
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Сделал себе структуру модулей так есть глобальный #include "Aplication.h" который подключается ко ВСЕМ модулям
в нем решил включать #include которые могут вызываться в многих модулях к примеру светодиоды(для отладки) и тд.
Все хорошо работало, но засунув в очередной раз модуль в Aplication.h получил кучу ошибок("dataEntryType" is undefined ) совершено в другом модуле, причем dataEntryType находится в другом модуле и он подключен.
т.е это выглядит так:
Есть два модуля в модуле snmp.h объявлена структура dataEntryType
и получаю ошибки на то что в модуле snmp_custom неизвестна dataEntryType, хоть вот выше строчкой структура должна подключиться

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

#include "Aplication.h"
#include "Ethernet\SNMP\snmp.h"
extern dataEntryType snmpData[];
PS: сейчас с модулями snmp.h snmp_custom.h все переделал убрал внутри все ихнии инклуды, и перекинул их все в "Aplication.h все равно все ещё ругается, пока каша в голове отчего все это может быть.
сдается мне что модуль как -то рекурсивно вызывается, в одном он подключился а в другом уже нет.

во всех модулях стоит, естественно с разными define

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

#ifndef SNMP_H_
#define SNMP_H_
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="pokk",url="/forum/viewtopic.php?p=3330414#p3330414"]Есть два модуля в модуле snmp.h объявлена структура dataEntryType и получаю ошибки на то что в модуле snmp_custom неизвестна dataEntryType, хоть вот выше строчкой структура должна подключиться[/uquote]
Чтобы основательно разобраться с темой - нужно смотреть что там препроцессор наворотил - поищите кaк для вашего компилятора просмотреть выхлоп препроцессора - т.е. файл, получившийся после разворачивания всех #include директив до передачи его компилятору. В ембедерных ИДЕ это как правило опция в проекте - либо "do not remove intermediate files" либо "preprocess only" - файл нужно искать в папке с объектниками иногда с расширением .pre иногда прямо вместо объектника, иногда .i В майкрософтосвских средах - ключи командной строки /E /P - появится файл с расширением .i

Если по быстрому - иногда спасет т.н. forward declaration - но только в том случае, если компилятору не нужны подробности:

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

#ifndef __H__
#define __H__

struct dataEntryType;  // forward declaration
int cleanThemAll(struct dataEntryType*); // указатель на тип - подробности внутренностей объекта не нужны

#endif /* __H__ */
И в таком случае файл с [полным] объявлением структуры нужно включать только в том .с файле где определяются переменные этого типа.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Благодарю обязательно поищу файл, а так вроде разобрался компилятор IAR выдавал ошибку при компиляции snmp.с который вызывал snmp.h и в самом начале еще до объявлении структуры вызывался файл
"Aplication.h" который открывал snmp_custom.h и видать из за того что вызов был из snmp.h файла, второй раз он уже его не мог открыть по этому компилятор успешно пропускал его в snmp_custom.h и ругался.
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="pokk",url="/forum/viewtopic.php?p=3330414#p3330414"]пока каша в голове отчего все это может быть.[/uquote]

pokk, логику диррективы "#include" понимаете? Она очень простая: #include "file" заменяется содержимым указанного файла. Все. Какая каша?
Если ругается на строку, что тип не определен, значит этот тип не определен. Все, другого быть не может.
А) файл с определением типа инклудается позже (компилятор вперед ничего не просматривает)
Б) вообще банальная ошибка, типа определили dataEntryType, а используете dateEntryType
В) тип действительно не определен, например, не заинклуден нужный файл.

PS. По вашему описанию вообще проблематично чтото сказать. Вложите исходник и все инклуды, которые инкудятся, скажите в какой строке и как ругается компилятор, думаю, Вам через пять минут скажут где "косяк".
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Здравствуйте!!! вопрос в коде:
Спойлер

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


// вот две функции 
void output_level_1_GWS(void);
void output_level_1_HWS(void);

// объявляю тип структуры с полями на указатель функции
typedef struct  
{
void (*Ptr1GWS)(void);       // пункт меню на первом уровне
void (*Ptr1HWS)(void);       // пункт меню на первом уровне
}LEVEL1;                           // тип структуры 1 уровня

//инициализирую ее функциями выше
LEVEL1 MENU_LEVEL1={output_level_1_GWS,output_level_1_HWS};

// создаю указатель на целое беззнаковое
uint8_t  *PtrPunkt;

в него планирую поместить адрес 2 поля структуры LEVEL1 MENU_LEVEL1.Такой вот записью PtrPunkt=&(LEVEL1 MENU_LEVEL1->Ptr1HWS);
1)нужен ли здесь указатель на указатель? :dont_know: 

2)затем используя PtrPunkt нужно вызвать функцию output_level_1_HWS();Правильно ли будет написав так *PtrPunkt;

3)объявления переменных, функции и т.п делаю в хедере, а инициализацию нужно делать в исходнике модуля как и реализацию функции, или в хедере?




Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

Ответы и советы:
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3336557#p3336557"]

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


// вот две функции 
void output_level_1_GWS(void);
void output_level_1_HWS(void);

// sz: делаем каноничненько - алиасим тип указателя на функцию
typedef void (*TvvPtr)(void);

// объявляю тип структуры с полями на указатель функции
typedef struct  {
   TvvPtr Ptr1GWS;       // пункт меню на первом уровне
   TvvPtr Ptr1HWS;       // пункт меню на первом уровне
} LEVEL1;                           // тип структуры 1 уровня

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

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

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

2)затем используя PtrPunkt нужно вызвать функцию output_level_1_HWS();Правильно ли будет написав так *PtrPunkt;
// sz: а если-бы функция имела аргументы? И таблицу приоритетов посмотрите - кто кого перетянет. ;-)

3)объявления переменных, функции и т.п делаю в хедере, а инициализацию нужно делать в исходнике модуля как и реализацию функции, или в хедере?
// sz: "хидер" - это интерфейс модуля - там объявления, А определения - только в самом модуле. Будь определение в хидере - в каждом включающем этот хидер модуле будет копия переменной - линкер может и заколдобиться.

[/uquote]
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

/ 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:[/spoiler]
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3336612#p3336612"]

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

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

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

dont_know: (*PtrPunkt);
если так то скобки в приоритете.но у меня и так нет ничего кроме того что в скобках :shock:[/uquote]
Я про те скобки, которые function call. Они с высшим приоритетом, а указатель ешё и разыменовать надо - и у этой операции (dereference) приоритет ниже. За ассоциативность не утверждаю, но

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

(*PtrPunkt)(); 
должно сработать как надо.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3336731#p3336731"]должно сработать как надо.[/uquote]Спасибо,ща испытаю
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Siarzhuk писал(а):но

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

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

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3336861#p3336861"]вроде как и PtrPunct(); должно сработать[/uquote]
до этой строчки у меня уже компилятор кипит ошибками и предупреждениями. Для более ясной картины выложу весь код.
ошибки такие:
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);
    }
}

Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

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 раза.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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:
И еще чисто моё личное, предвзятое, мнение: вас, случайно, не в Майкрософте программированию обучали? это у них приняты длиннючие типы с тремя и более подчеркиваниями и мешаниной заглавных и прописных букв...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

с понятиями определена, описана,объявлена, инициализирована одни путаницы.
мое понимание:
ОПРЕДЕЛЕНИЕ ОПИСАНИЕ ОБЪЯВЛЕНИЕ это одно и тоже
ИНИЦИАЛИЗАЦИЯ это присвоение уже ОПРЕДЕЛЕННОМУ, ОПИСАННОМУ, ОБЪЯВЛЕННОМУ
так что есть что?


[uquote="viiv",url="/forum/viewtopic.php?p=3337061#p3337061"]

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

#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 имеет тип 'Level2 *'. разница огромная
Ptr_MeNU_LEVEL2_GWS=MeNU_LEVEL2_GWS; [/quote] здесь надо подумать

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

Добавлено after 7 minutes 50 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3337070#p3337070"]операция -> применима только к указателю слева, операция . - только к статическому экземпляру структуры.
это я понимаю, так у меня в коде где используется операция стрелка слева указатель на структуру
а где операция точка сама структура.
И еще чисто моё личное, предвзятое, мнение: вас, случайно, не в Майкрософте программированию обучали? это у них приняты длиннючие типы с тремя и более подчеркиваниями и мешаниной заглавных и прописных букв...[/uquote]
нет к сожалению,приходиться самому и с помощью форума обучаться!Мне главное, чтоб не запутаться, при этом ничего не нарушать :write:
Ответить

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