|
Вопрос по CV AVR, cvavr |
|
|
|
Feb 22 2011, 21:01
|
Частый гость
 
Группа: Участник
Сообщений: 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??
|
|
|
|
|
Feb 23 2011, 04:23
|

Гуру
     
Группа: Свой
Сообщений: 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);
|
|
|
|
|
Feb 23 2011, 10:16
|
Частый гость
 
Группа: Участник
Сообщений: 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); Большое спасибо. А из за чего он не хочет создавать ссылочный массив при многомерных массивах??
|
|
|
|
|
Feb 23 2011, 13:17
|

Гуру
     
Группа: Свой
Сообщений: 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, позже это будет сделать гораздо труднее.
|
|
|
|
|
Feb 23 2011, 15:33
|
Частый гость
 
Группа: Участник
Сообщений: 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 подойдут или у него синтаксис языка совсем другой??
|
|
|
|
|
Feb 23 2011, 18:47
|

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

|
Цитата(NickSmith @ Feb 23 2011, 18:33)  ... или у него синтаксис языка совсем другой?? Собственно, это CV - чёрти что, а не транслятор языка Си... Как раз IAR - в соответствии со стандартом, так что, любая хорошая книга (например, Керниган и Ричи) вполне помогут с освоением языка. Другое дело: микроконтроллеры имеют свои особенности и, поэтому, язык дополнен конструкциями, специфичными для разных трансляторов (отдано это на "откуп" разработчикам трансляторов, а они делают по-своему: при переходе от одного транслятора к другому могут возникнуть трудности - лучше сразу начинать с "серьезного" транслятора).
|
|
|
|
|
Feb 23 2011, 20:05
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(Палыч @ Feb 23 2011, 21:47)  Собственно, это CV - чёрти что, а не транслятор языка Си... Как раз IAR - в соответствии со стандартом, так что, любая хорошая книга (например, Керниган и Ричи) вполне помогут с освоением языка. Другое дело: микроконтроллеры имеют свои особенности и, поэтому, язык дополнен конструкциями, специфичными для разных трансляторов (отдано это на "откуп" разработчикам трансляторов, а они делают по-своему: при переходе от одного транслятора к другому могут возникнуть трудности - лучше сразу начинать с "серьезного" транслятора). Ну да, пишут, что IAR разрабатывался совместно с производителями.. По первым граблям, на которые я наступил тоже стало понятно что CV это язык пионерии.. Мигающие светодиоды и данные с датчика считать в простую можно, а как только что то серьезное, то тут же бяки выползают... В общем будем изучать IAR...
|
|
|
|
|
Feb 26 2011, 19:28
|
Частый гость
 
Группа: Участник
Сообщений: 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 Что не так??
|
|
|
|
|
Feb 26 2011, 19:48
|

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

|
Код __eeprom unsigned int ** bdz[] = {m3, m4, m7}; или Код __eeprom unsigned int * bdz[] = {m3[0], m4[0], m7[0]}; в зависимости от того, что Вам нужно
|
|
|
|
|
Feb 26 2011, 19:55
|

Гуру
     
Группа: Свой
Сообщений: 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]}; в зависимости от того, что Вам нужно Оба неверные  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 26 2011, 20:06
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(zltigo @ Feb 26 2011, 22:55)  Что не так, написано черным по белому ТРИ раза подряд. 1) указатель на EEPROM и указатель на RAM это разные указатели. 2) имя двухмерного массива есть указатель на одномерный массив а не на элемент одномерного массива. Думать. Читать K&R и думать. Оба СОВСЕМ неверные  . K&R читаю постоянно, но пока не все понятно.. Мне нужно организовать три массива для сохранения трех типов параметров. Хочу создать массив с указателями, что бы можно было было работать с массивами через указатели...
|
|
|
|
|
Feb 26 2011, 20:39
|

Гуру
     
Группа: Свой
Сообщений: 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 *" , что непонятно-то что?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 26 2011, 20:47
|
Частый гость
 
Группа: Участник
Сообщений: 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 не нужно??
|
|
|
|
|
Feb 26 2011, 21:07
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(zltigo @ Feb 26 2011, 23:53)  Что "'это" и что "не нужно" для указателя unsigned char я совсем не понял  . Я имел в виду тип данных для хранения указателей unsigned int. Можно ли использовать char? Теперь не могу разобраться как при помощи bdz получить данные из нужнго мне массива.. Например мне нужно записать данные в строку 5 ячейку 1 m4 их temp ... bdz[1][4][1]=temp; Работать не хочет??
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|