Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Массивы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
*SERG
Есть 200 массивов (может больше) с разными именами.
Есть переменные вне массивов...
Как в зависимости от значения переменной переходить к считыванию соответствующего массива.
Пишу на СИ в CVAVR (недавно разобрался, может что то и не уловил), пользоваться "if.............." нет желания, этож 200 штук smile.gif
Что посоветуйте???Как это зделать???
Чтоб красиво былоsmile.gif
IgorKossak
Создайте во __flash массив адресов массивов (в Вашем случае 400 байт) и индексом этого массива как раз и будет значение переменной.
yung
Создать 201-й массив с указателями на предыдующие 200.
*SERG
Ок, но сначало разберусь с указателями и синтаксисом. Скорей всео вопросы появятсяsmile.gif
Может ещё какие идеи будут?
Георгий
Может проще создать двухмерный массив и внешнюю переменную присваивать первому индексу массива.
BVU
Конструкция двумерного массива 'отожрет' в два раза больше памяти. Лучше уж массив адресных указателей. И попробуйте воспользоваться конструкцией enum. С символическим содержанием работать всегда приятнее... smile.gif
*SERG
Цитата(Георгий @ Dec 1 2005, 11:46) *
Может проще создать двухмерный массив и внешнюю переменную присваивать первому индексу массива.

Что то вообще не понял как это? blink.gif Зачем двухмерный то, переменная ведь одна

Цитата(IgorKossak @ Dec 1 2005, 11:21) *
Создайте во __flash массив адресов массивов (в Вашем случае 400 байт) и индексом этого массива как раз и будет значение переменной.



Цитата(yung @ Dec 1 2005, 11:21) *
Создать 201-й массив с указателями на предыдующие 200.


Понял что написано одно и то ж и массив с указателями вроде разобрался, как зделать.
СПАСИБО!!!
Может ещё какие предложения будут blush.gif
*SERG
Цитата(BVU @ Dec 1 2005, 11:52) *
Конструкция двумерного массива 'отожрет' в два раза больше памяти. Лучше уж массив адресных указателей. И попробуйте воспользоваться конструкцией enum. С символическим содержанием работать всегда приятнее... smile.gif

глянул в умную книгу...............
Ага, так вроде лучше и проще получается
СПАСИБО!!!
Георгий
Цитата
Конструкция двумерного массива 'отожрет' в два раза больше памяти. Лучше уж массив адресных указателей.

Не понял, почему? Чем один массив из 4 элементов отличается от двух массивов по два элемента.(для примера)
Виктория
Для Serg-а схематично
Код
// 1 вариант - переменная-индекс в массиве указателей p[]
int a1[], a2[], a3[], ......, a200[];
int *p[200]={a1,a2,a3,..., a200};

// 2 вариант - переменная-индекс N в массиве a[]
int a[N][200];


Первый вариант экономнее при выделении памяти (но не факт что Ваш алгоритм требует именно его).
BVU
Цитата(Георгий @ Dec 1 2005, 12:40) *
Цитата
Конструкция двумерного массива 'отожрет' в два раза больше памяти. Лучше уж массив адресных указателей.

Не понял, почему? Чем один массив из 4 элементов отличается от двух массивов по два элемента.(для примера)

А потому что изначально определя тип массива двумерный будет в сравнении с одномерным в два раза больше. smile.gif
Георгий
Так двумерный массив один, а одномерных надо два! Или я что то не догоняю?
Igor26
Цитата(Георгий @ Dec 1 2005, 13:37) *
Так двумерный массив один, а одномерных надо два! Или я что то не догоняю?


---------------------
!0! . . . . . . . !200! - это одномерный масиив Array[200]
---------------------

---------------------
!0! . . . . . . . !200! - а это двумерный массив Array[2][200]
---------------------
!0! . . . . . . . !200!
---------------------
Вот поэтому он в два раза и больше одномерного. Соответственно, трехмерный будет в три раза
больше одномерного. А вот одномерный Array[400] займет столько же, сколько Array[2][200]
BVU
Цитата(Георгий @ Dec 1 2005, 13:37) *
Так двумерный массив один, а одномерных надо два! Или я что то не догоняю?

Все правильно, догоняете, это я немножко 'запарил'... (думаешь одно, пишешь - другое) sad.gif . Ну да ладно, проехали.
Все дело в удобстве использования массивов при работе с ними. Если массив двумерных необходима в алгоритме двумерная индексация, а если пользоваться адресными указателями на массив код становиться проще.
Igor26
Цитата(BVU @ Dec 1 2005, 14:25) *
Цитата(Георгий @ Dec 1 2005, 13:37) *

Так двумерный массив один, а одномерных надо два! Или я что то не догоняю?

Все правильно, догоняете, это я немножко 'запарил'... (думаешь одно, пишешь - другое) sad.gif . Ну да ладно, проехали.
Все дело в удобстве использования массивов при работе с ними. Если массив двумерных необходима в алгоритме двумерная индексация, а если пользоваться адресными указателями на массив код становиться проще.

Еще проще представить двумерный массив в виде шахматной доски. Нужная клетка на доске однозначно "адресуется" буквой и цифрой. (пешка с Е2 на Е4 tongue.gif )
dxp
Цитата(Igor26 @ Dec 1 2005, 17:16) *
Цитата(Георгий @ Dec 1 2005, 13:37) *

Так двумерный массив один, а одномерных надо два! Или я что то не догоняю?


---------------------
!0! . . . . . . . !200! - это одномерный масиив Array[200]
---------------------

---------------------
!0! . . . . . . . !200! - а это двумерный массив Array[2][200]
---------------------
Вот поэтому он в два раза и больше одномерного. Соответственно, трехмерный будет в три раза
больше одномерного. А вот одномерный Array[400] займет столько же, сколько Array[2][200]

Array1[200] и Array2[200] займут столько же места, сколько Array[2][200]. Кстати, в С/С++ дву-(и более) мерных массивов не бывает. Array[2][200] - это не двумерный массив, а массив массивов. smile.gif
Георгий
Чтоб не рожать новую тему, спрошу здесь. В большом ассемблере как то можно было записать запись типа
.db 0,0,0,0,0,0,0,0,0,,0,0,0
короче, а как не могу вспомнить. В ассемблере АВР студии возможно ли такое же?
DeXteR
Цитата(Георгий @ Dec 1 2005, 17:19) *
Чтоб не рожать новую тему, спрошу здесь. В большом ассемблере как то можно было записать запись типа
.db 0,0,0,0,0,0,0,0,0,,0,0,0
короче, а как не могу вспомнить. В ассемблере АВР студии возможно ли такое же?


Влолне возмодно
Если адрессдля етой штуки нужен пиши так

Metka:
.db 0,0,0,0,1

А когда его используеш
......
ldi ZL, low(Metka*2)
ldi ZH, high(Metka*2)
lpm
.......
Толька если количество данный через запятую не
кратно 2 асемблер выделит еще один байт

Память программ то 16 разрядная ....
*SERG
Всё таки решил воспользоватся массивом указателем. Проблемма такая, ну определил он мне ячейку памяти с которой начинается нужный массив, а потом то что? как его считать полностью? Применять дальше переменнуй указатель или как?
Георгий
Нет, я имел ввиду, что если нужно записать много одинаковых значений, в "большом" ассмблере было что-то типа
.db REP(100) 5
чтобы не писать сто пятерок после метки.
Виктория
*SERG>Можно и дальше все обращения к массиву - через указатель
*p[i][j], где i - это Ваша переменная, а j - индекс в найденном массиве a[]. А можно переприсвоить pv=p[i] и обращаться к j-тому элементу массива a как pv[j].
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.