Вопросы по С/С++ (СИ)
Трабл был исключительно программный... Чутка не дописал в обработке прерывания.
- Реклама
Приветствую!!! Задача состоит в том,что в области EEPROM нужно разместить структуру, полями которой являются тоже структуры с двумя полями типа uint8.Зетем с помощью указателей уже работать с ними.
Но что-то делаю неверно и не могу понять.
Объявляю два новых типа структур:
2. Определяю их
если написать просто
то компилятор молчит.
Проблемы:
1. Адреса полей,структур не совпадают с содержимым указателей на них...
2. Чет на подобную запись компил ошибку выдает.
Заранее благодарен!
Но что-то делаю неверно и не могу понять.
Объявляю два новых типа структур:
Код: Выделить всё
typedef struct
{
uint8_t Rashod;
uint8_t Temperatura;
}Dannie_Mecyac;
typedef struct
{
Dannie_Mecyac Yanvar;
Dannie_Mecyac Fevral;
Dannie_Mecyac Mart;
....
Dannie_Mecyac Dekabr
}Mecyac ;
Код: Выделить всё
EEMEM Dannie_Mecyac GWS_Yanvar={0};
EEMEM Dannie_Mecyac GWS_Fevral={0};
EEMEM Dannie_Mecyac GWS_Mart={0};
EEMEM Mecyac GWS_Dannie={GWS_Yanvar,GWS_Fevral,GWS_Mart}; // на такую строчку компилятор ругается на какую то константу ссылается
Mecyac *PtrGWS_Dannie=&GWS_Dannie;
Код: Выделить всё
EEMEM Mecyac GWS_Dannie;Проблемы:
1. Адреса полей,структур не совпадают с содержимым указателей на них...
2. Чет на подобную запись компил ошибку выдает.
Код: Выделить всё
GWS_Dannie.GWS_Yanvar.Rashod[uquote="ROMan2947",url="/forum/viewtopic.php?p=3371923#p3371923"]компилятор ругается на какую то константу ссылается
...
2. Чет на подобную запись компил ошибку выдает.
...[/uquote]
да, сообщения компилятора особо не важны и вообще не несут полезной информации
по второму пункту - поле структуры не так называется.
ЗЫ а чего за контроллер?
ЗЗЫ [uquote="ROMan2947",url="/forum/viewtopic.php?p=3371923#p3371923"]1. Адреса полей,структур не совпадают с содержимым указателей на них...[/uquote]
каких указателей? у вас их ровно одна штука, на которую "компилятор ругается".
...
2. Чет на подобную запись компил ошибку выдает.
Код: Выделить всё
GWS_Dannie.GWS_Yanvar.Rashodда, сообщения компилятора особо не важны и вообще не несут полезной информации
по второму пункту - поле структуры не так называется.
ЗЫ а чего за контроллер?
ЗЗЫ [uquote="ROMan2947",url="/forum/viewtopic.php?p=3371923#p3371923"]1. Адреса полей,структур не совпадают с содержимым указателей на них...[/uquote]
каких указателей? у вас их ровно одна штука, на которую "компилятор ругается".
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3371987#p3371987"]ЗЫ а чего за контроллер?[/uquote]
Atmega16A
Добавлено after 6 minutes 50 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3371987#p3371987"]по второму пункту - поле структуры не так называется.[/uquote] посмотрел пару статей там так и обращаются, у меня вот так не катит, а как надо?
основная структура GWS_Dannie в ней поле структурного типа GWS_Yanvar в которой поле Rashod типа uint... и пишу так
Atmega16A
Добавлено after 6 minutes 50 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3371987#p3371987"]по второму пункту - поле структуры не так называется.[/uquote] посмотрел пару статей там так и обращаются, у меня вот так не катит, а как надо?
основная структура GWS_Dannie в ней поле структурного типа GWS_Yanvar в которой поле Rashod типа uint... и пишу так
Код: Выделить всё
GWS_Dannie.GWS_Yanvar.Rashodчестно говоря особо не помню чего там в атмегах, но имхо так вольно обращаться с EEPROM-ом не особо позволяется.
смотрите, что происходит по коду: вы объявляете, размещаете в EEPROM (утрированно) и инициализируете три структуры (GWS_Yanvar, GWS_Fevral, GWS_Mart). Затем объявляете, размещаете в EEPROM структуру Mecyac и заполняете три первые ее поля значениями соответствующих полей предыдущих структур. Это не имеет особого смысла.
Добавлено after 2 minutes 23 seconds:
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3372013#p3372013"]посмотрел пару статей там так и обращаются, у меня вот так не катит, а как надо?
основная структура GWS_Dannie в ней поле структурного типа GWS_Yanvar[/uquote]
имя поля - не то, что вы туда положили, а то, как объявили тип. В typedef-е у вас просто Yanvar, Fevral, Mart - вот это и есть имена полей.
и предупрежу сразу, что так работать с календарем чудовищно неудобно. Вместо годовой структуры сделайте массив.
смотрите, что происходит по коду: вы объявляете, размещаете в EEPROM (утрированно) и инициализируете три структуры (GWS_Yanvar, GWS_Fevral, GWS_Mart). Затем объявляете, размещаете в EEPROM структуру Mecyac и заполняете три первые ее поля значениями соответствующих полей предыдущих структур. Это не имеет особого смысла.
Добавлено after 2 minutes 23 seconds:
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3372013#p3372013"]посмотрел пару статей там так и обращаются, у меня вот так не катит, а как надо?
основная структура GWS_Dannie в ней поле структурного типа GWS_Yanvar[/uquote]
имя поля - не то, что вы туда положили, а то, как объявили тип. В typedef-е у вас просто Yanvar, Fevral, Mart - вот это и есть имена полей.
и предупрежу сразу, что так работать с календарем чудовищно неудобно. Вместо годовой структуры сделайте массив.
- Реклама
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3371987#p3371987"]каких указателей? у вас их ровно одна штука, на которую "компилятор ругается".[/uquote]
вот во вложении часть кода и контрольные значения...
вот во вложении часть кода и контрольные значения...
- Вложения
-
- 2018-05-08_18-22-32.png
- (107.71 КБ) 441 скачивание
судя по префиксу EEMEM, у вас WinAVR или другой вариант AVR-GCC. так вот, эти компиляторы напрямую с данными в EEPROM работать не умеют, соответственно, никаких указателей на данные в EEPROM быть не может со всеми вытекающими обращениями.
судя по названиям, вы выбрали крайне неудачный способ структурирования данных.
а главная проблема ваша в том, что первичная инициализация структур должна быть явной, т.е. в качестве данных для одной структуры нельзя указывать содержимое другой структуры.
то есть вам надо для GWS_Dannie использовать явную инициализацию {{0,0}, {1,1}, {2,2}, ... };
судя по названиям, вы выбрали крайне неудачный способ структурирования данных.
а главная проблема ваша в том, что первичная инициализация структур должна быть явной, т.е. в качестве данных для одной структуры нельзя указывать содержимое другой структуры.
то есть вам надо для GWS_Dannie использовать явную инициализацию {{0,0}, {1,1}, {2,2}, ... };
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3372027#p3372027"]Вместо годовой структуры сделайте массив.[/uquote]
Массив структур имеете ввиду? я думал про это, но пока на ознакомительном этапе решил так же оставить....
Массив структур имеете ввиду? я думал про это, но пока на ознакомительном этапе решил так же оставить....
[uquote="ARV",url="/forum/viewtopic.php?p=3372032#p3372032"]в качестве данных для одной структуры нельзя указывать содержимое другой структуры[/uquote]
чойта? можно.
чойта? можно.
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3372039#p3372039"][uquote="ARV",url="/forum/viewtopic.php?p=3372032#p3372032"]в качестве данных для одной структуры нельзя указывать содержимое другой структуры[/uquote]
чойта? можно.[/uquote]
см. выше - ROMan2947 пытался, не вышло.
чойта? можно.[/uquote]
см. выше - ROMan2947 пытался, не вышло.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="ARV",url="/forum/viewtopic.php?p=3372032#p3372032"]эти компиляторы напрямую с данными в EEPROM работать не умеют[/uquote]
Вот этот момент мне не понятен, читал на форумах,что нужно подключить файл.... а что за файл как подключить не ясно..
[uquote="ARV",url="/forum/viewtopic.php?p=3372032#p3372032"]судя по названиям, вы выбрали крайне неудачный способ структурирования данных.[/uquote] по ходу названия меня и запутали...
Добавлено after 1 minute 22 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3372044#p3372044"]пытался, не вышло.[/uquote] может нужно сначала компилятор научить работать с EEPROM,после выйдет?
Вот этот момент мне не понятен, читал на форумах,что нужно подключить файл.... а что за файл как подключить не ясно..
[uquote="ARV",url="/forum/viewtopic.php?p=3372032#p3372032"]судя по названиям, вы выбрали крайне неудачный способ структурирования данных.[/uquote] по ходу названия меня и запутали...
Добавлено after 1 minute 22 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3372044#p3372044"]пытался, не вышло.[/uquote] может нужно сначала компилятор научить работать с EEPROM,после выйдет?
нате вам здрасте! вы что, не делали в начале #include <avr/eeprom.h>?!ROMan2947 писал(а):а что за файл как подключить не ясно..
дело не в названиях. судя по вашему коду, вам нужен массив структур, а не структура из 12 полей, каждое из которых тоже структура.ROMan2947 писал(а):по ходу названия меня и запутали
Добавлено after 42 seconds:
Но в любом случае при работе с EEPROM точечная нотация не прокатит, т.к. компилятор не умеет...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
или указателей на структуры.ROMan2947 писал(а):Массив структур имеете ввиду?
[uquote="ARV",url="/forum/viewtopic.php?p=3372044#p3372044"]см. выше - ROMan2947 пытался, не вышло.[/uquote]
у него с EEPROM не вышло. А вообще вполне работает -
Спойлер
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef struct {
uint8_t Rashod;
uint8_t Temperatura;
} Dannie_Mecyac;
typedef struct {
Dannie_Mecyac Yanvar;
Dannie_Mecyac Fevral;
Dannie_Mecyac Mart;
Dannie_Mecyac Dekabr;
} Mecyac;
int main(int argc, char *argv[]) {
Dannie_Mecyac GWS_Yanvar={10,20};
Dannie_Mecyac GWS_Fevral={0};
Dannie_Mecyac GWS_Mart={11,5};
Mecyac GWS_Dannie={GWS_Yanvar,GWS_Fevral,GWS_Mart}; // на такую строчку компилятор ругается на какую то константу ссылается
Mecyac *PtrGWS_Dannie=&GWS_Dannie;
printf("%d %d\n",GWS_Dannie.Yanvar.Rashod, PtrGWS_Dannie->Mart.Temperatura);
}Код: Выделить всё
10 5[uquote="ARV",url="/forum/viewtopic.php?p=3372054#p3372054"]#include <avr/eeprom.h>?![/uquote]делал...
[uquote="ARV",url="/forum/viewtopic.php?p=3372054#p3372054"]вам нужен массив структур[/uquote]придется переписать
[uquote="ARV",url="/forum/viewtopic.php?p=3372054#p3372054"]при работе с EEPROM точечная нотация не прокатит[/uquote]это связано только с работой с EEPROM? точечная не идет а стрелочная как себя поведет?
[uquote="ARV",url="/forum/viewtopic.php?p=3372054#p3372054"]вам нужен массив структур[/uquote]придется переписать
[uquote="ARV",url="/forum/viewtopic.php?p=3372054#p3372054"]при работе с EEPROM точечная нотация не прокатит[/uquote]это связано только с работой с EEPROM? точечная не идет а стрелочная как себя поведет?
стрелочная точно так же не пойдет: не умеет AVR-GCC работать так с EEPROM. при помощи функций eeprom_read_byte, eeprom_read_word, eeprom_read_dwod и eeprom_read_block (аналогично и для write) вы должны будете ручками считывать данные из EEPROM в переменную в обычном ОЗУ, и уже с нею работать, как принято.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3372064#p3372064"]это связано только с работой с EEPROM? точечная не идет а стрелочная как себя поведет?[/uquote]
точки для непосредственных значений, стрелки - для указателей. С EEPROM-ом не связано, что положите туда - с тем и работайте.
точки для непосредственных значений, стрелки - для указателей. С EEPROM-ом не связано, что положите туда - с тем и работайте.
как раз связано: ни точечная, ни стрелочная нотация не будет работать с описанными в EEPROM переменными и указателями на них.arkhnchul писал(а):С EEPROM-ом не связано
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3372073#p3372073"]точки для непосредственных значений, стрелки - для указателей.[/uquote] ну по поводу этого я в курсе,я и имел ввиду может при использовании указателей можно будет работать с EEPROM...оказалось нет...
Добавлено after 1 minute 9 seconds:
Спасибо Вам, суть понял, буду разбираться
Добавлено after 4 minutes 5 seconds:
Частенько начал сталкиваться с возможность и не возможностью компилятора, что нужно лопатить для изучения компилятора именно AVR-GCC.документация может или книга,где подробно описывалось бы как он работает и хотелось бы на русском....?
Добавлено after 1 minute 9 seconds:
Спасибо Вам, суть понял, буду разбираться
Добавлено after 4 minutes 5 seconds:
Частенько начал сталкиваться с возможность и не возможностью компилятора, что нужно лопатить для изучения компилятора именно AVR-GCC.документация может или книга,где подробно описывалось бы как он работает и хотелось бы на русском....?
[uquote="ARV",url="/forum/viewtopic.php?p=3372075#p3372075"]ни точечная, ни стрелочная нотация не будет работать с описанными в EEPROM переменными и указателями на них.[/uquote]
да, извиняюсь, забыл, как оно там в AVR. Привык к stm-ам)
да, извиняюсь, забыл, как оно там в AVR. Привык к stm-ам)
вот мои скромные потуги: https://simple-devices.ru/articles/7-so ... avr-studioROMan2947 писал(а):что нужно лопатить для изучения компилятора именно AVR-GCC.документация может или книга,где подробно описывалось бы как он работает и хотелось бы на русском....?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


