реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вопрос по CV AVR, cvavr
NickSmith
сообщение Feb 22 2011, 21:01
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Добрый день, вечер, ночь!
Начал осваивать Си и столкнулся с двумя проблемами
1. Массивы
Мне нужно сделать массив в eeprom для хранения настроек моего устройства. У устройства есть три функции имеющие две переменных у каждой.
Т.е я создал три массива по десять строк и две ячейки в каждой строке.
Когда я попытался создать ссылки на все эти массивы, то получил отлуп. Если делать одномерный массив, то все проходит, но как только добавляется колличество ячеек в строке, все CV ругается
вот код
Код
// Declare your global variables here

eeprom unsigned int m3 [10][2];
eeprom unsigned int m4 [10][2];
eeprom unsigned int m7 [10][2];
eeprom unsigned int *bdz[]={m3,m4,m7};

И еще я не смог найти пример, как мне выдрать от туда нужные данные
Например у меня есть две переменные в которых должны считываться ячейки из какого либо массива
напр
а,б как мне в них загрузить значение из например m3 строки 3???
Понимаю, что вопрос глупый, но я только осваиваю язык, а описания как это сделать так и не нашел.
2.
Для вывода на индикатор использую функцию sprintа
Код
sprintf(lcd_buffer,"Fq:%i.%u",ts/100,ts%100);

в итоге если я вывожу значение например 1000 у меня выводится на дисплей 10.0. Как только я начинаю уменьшать или увеличивать это число появляется еще один разряд после запятой. Как сделать, что бы у меня всегда выводилось 10.00??
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 23 2011, 04:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(NickSmith @ Feb 23 2011, 00:01) *
как мне выдрать от туда нужные данные
Например, так:
Код
a = m[2][0];
b = m[2][1];
соответственно, сохранение в EEPROM будет выглядеть так
Код
m[2][0] = a;
m[2][1] = b;


Цитата(NickSmith @ Feb 23 2011, 00:01) *
Как сделать, что бы у меня всегда выводилось 10.00??

Код
sprintf(lcd_buffer,"Fq:%i.%02u",ts/100,ts%100);
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Feb 23 2011, 10:16
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(Палыч @ Feb 23 2011, 07:23) *
Например, так:
Код
a = m[2][0];
b = m[2][1];
соответственно, сохранение в EEPROM будет выглядеть так
Код
m[2][0] = a;
m[2][1] = b;



Код
sprintf(lcd_buffer,"Fq:%i.%02u",ts/100,ts%100);

Большое спасибо.
А из за чего он не хочет создавать ссылочный массив при многомерных массивах??
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 23 2011, 13:17
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(NickSmith @ Feb 23 2011, 13:16) *
А из за чего он не хочет создавать ссылочный массив при многомерных массивах?
А, вот так?
Код
eeprom unsigned int * bdz[] = { &m3[0][0], &m4[0][0], &m7[0][0] };
Если Вы собираетесь заниматься профессионально программированием AVR (ну, или любительством, но на профессиональном уровне), то сразу перейдите с CV на GCC или IAR, позже это будет сделать гораздо труднее.
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Feb 23 2011, 15:33
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(Палыч @ Feb 23 2011, 16:17) *
А, вот так?
Код
eeprom unsigned int * bdz[] = { &m3[0][0], &m4[0][0], &m7[0][0] };
Если Вы собираетесь заниматься профессионально программированием AVR (ну, или любительством, но на профессиональном уровне), то сразу перейдите с CV на GCC или IAR, позже это будет сделать гораздо труднее.

меня заинтересовал IAR? но по нему как то мало документации на русском.. Может что то посоветуете?? Основы от CV подойдут или у него синтаксис языка совсем другой??
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 23 2011, 18:47
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(NickSmith @ Feb 23 2011, 18:33) *
... или у него синтаксис языка совсем другой??

Собственно, это CV - чёрти что, а не транслятор языка Си... Как раз IAR - в соответствии со стандартом, так что, любая хорошая книга (например, Керниган и Ричи) вполне помогут с освоением языка. Другое дело: микроконтроллеры имеют свои особенности и, поэтому, язык дополнен конструкциями, специфичными для разных трансляторов (отдано это на "откуп" разработчикам трансляторов, а они делают по-своему: при переходе от одного транслятора к другому могут возникнуть трудности - лучше сразу начинать с "серьезного" транслятора).
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Feb 23 2011, 20:05
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(Палыч @ Feb 23 2011, 21:47) *
Собственно, это CV - чёрти что, а не транслятор языка Си... Как раз IAR - в соответствии со стандартом, так что, любая хорошая книга (например, Керниган и Ричи) вполне помогут с освоением языка. Другое дело: микроконтроллеры имеют свои особенности и, поэтому, язык дополнен конструкциями, специфичными для разных трансляторов (отдано это на "откуп" разработчикам трансляторов, а они делают по-своему: при переходе от одного транслятора к другому могут возникнуть трудности - лучше сразу начинать с "серьезного" транслятора).

Ну да, пишут, что IAR разрабатывался совместно с производителями.. По первым граблям, на которые я наступил тоже стало понятно что CV это язык пионерии.. Мигающие светодиоды и данные с датчика считать в простую можно, а как только что то серьезное, то тут же бяки выползают...
В общем будем изучать IAR...
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Feb 26 2011, 19:28
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Переполз на IAR и опять те же грабли..
делаю так:
Код
__eeprom unsigned int m3 [10][2];
__eeprom unsigned int m4 [10][2];
__eeprom unsigned int m7 [10][2];
__eeprom unsigned int *bdz[]={m3,m4,m7};

Код
Error[Pe144]: a value of type "unsigned int __eeprom (*)[2]" cannot be used to initialize an entity of type "unsigned int *"
Error[Pe144]: a value of type "unsigned int __eeprom (*)[2]" cannot be used to initialize an entity of type "unsigned int *"  
Error[Pe144]: a value of type "unsigned int __eeprom (*)[2]" cannot be used to initialize an entity of type "unsigned int *"  
Error while running C/C++ Compiler


Что не так??
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 26 2011, 19:48
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Код
__eeprom unsigned int ** bdz[] = {m3, m4, m7};
или
Код
__eeprom unsigned int * bdz[] = {m3[0], m4[0], m7[0]};
в зависимости от того, что Вам нужно
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 26 2011, 19:55
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (NickSmith @ Feb 26 2011, 22:28) *
Что не так??

Что не так, написано черным по белому ТРИ раза подряд.
1) указатель на EEPROM и указатель на RAM это разные указатели.
2) имя двухмерного массива есть указатель на одномерный массив а не на элемент одномерного массива.

Думать. Читать K&R и думать.

QUOTE (Палыч @ Feb 26 2011, 22:48) *
CODE
__eeprom unsigned int ** bdz[] = {m3, m4, m7};
или
CODE
__eeprom unsigned int * bdz[] = {m3[0], m4[0], m7[0]};
в зависимости от того, что Вам нужно

Оба неверные sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Feb 26 2011, 20:06
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(zltigo @ Feb 26 2011, 22:55) *
Что не так, написано черным по белому ТРИ раза подряд.
1) указатель на EEPROM и указатель на RAM это разные указатели.
2) имя двухмерного массива есть указатель на одномерный массив а не на элемент одномерного массива.

Думать. Читать K&R и думать.


Оба СОВСЕМ неверные sad.gif.


K&R читаю постоянно, но пока не все понятно..

Мне нужно организовать три массива для сохранения трех типов параметров.
Хочу создать массив с указателями, что бы можно было было работать с массивами через указатели...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 26 2011, 20:39
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (NickSmith @ Feb 26 2011, 23:06) *
Хочу....

хотение надо уметь описать словами:
__eeprom unsigned int __eeprom *bdz[] = { m3[0], m4[0], m7[0] };

но для читабельности я бы так то-же самое описал:
__eeprom unsigned int __eeprom *bdz[] = { &m3[0][0], &m4[0][0], &m7[0][0] };

QUOTE
что бы можно было было работать с массивами через указатели...

С вероятностью 95% это очень неудачная мысль хранить в EEPROM рабочие указатели. EEPROM это не RAM.

QUOTE
K&R читаю постоянно, но пока не все понятно..

Ну тут-то, в сообщении компилятора:
QUOTE
a value of type "unsigned int __eeprom (*)[2]" cannot be used to initialize an entity of type "unsigned int *"

, что непонятно-то что? sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Feb 26 2011, 20:47
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(zltigo @ Feb 26 2011, 23:39) *
хотение надо уметь описать словами:
__eeprom unsigned int __eeprom *bdz[] = { m3[0], m4[0], m7[0] };

но для читабельности я бы так то-же самое описал:
__eeprom unsigned int __eeprom *bdz[] = { &m3[0][0], &m4[0][0], &m7[0][0] };


С вероятностью 95% это очень неудачная мысль хранить в EEPROM рабочие указатели. EEPROM это не RAM.

Т.е это лучше в озу хранить??
И как я понимаю для указателя unsigned char не нужно??
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 26 2011, 20:53
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (NickSmith @ Feb 26 2011, 23:47) *
Т.е это лучше в озу хранить??
И как я понимаю для указателя unsigned char не нужно??

Что "'это" и что "не нужно" для указателя unsigned char я совсем не понял sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Feb 26 2011, 21:07
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(zltigo @ Feb 26 2011, 23:53) *
Что "'это" и что "не нужно" для указателя unsigned char я совсем не понял sad.gif.

Я имел в виду тип данных для хранения указателей unsigned int. Можно ли использовать char?

Теперь не могу разобраться как при помощи bdz получить данные из нужнго мне массива..
Например мне нужно записать данные в строку 5 ячейку 1 m4 их temp
...
bdz[1][4][1]=temp;
Работать не хочет??
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016