Страница 1 из 2
3-х мерный массив.
Добавлено: Сб сен 26, 2009 18:40:35
PacMan
День добрый такой вопрос.
мне надо хранить в микроконтроллере AtTiny2313 массив 3-х мерный.
подскажите, как мне его хранить, компилятор ругается.
я делаю это так
extern int mas[5][5][5]
Добавлено: Сб сен 26, 2009 19:24:32
ARV
extern - это значит внешний. то есть где-то еще ваш массив должен быть определен, а в этом месте вы лишь сообщаете, что он существует. вы его поределили в том, другом месте?
Добавлено: Сб сен 26, 2009 19:51:33
PacMan
Вообщем проблема в чем? в том что мне не хватает памяти. как мне решить проблему?
(задача, хранить бинарный 3-х мерный массив)
ришений уйму.
например
1.
переводить int в десятичную систему.
То есть в одном int можно хранить(в моем случае удобно) 5
2.
Хранить массив не в int а в char. Но памяти опять не хватает
Но можно в строке . На сколько я знаю char * поддерживает до 255 символов. Для моей задачи етого более чем.
Вот только я не уверен что все так просто думаю что есть более простые методы
Добавлено: Сб сен 26, 2009 19:56:23
SII
PacMan писал(а):переводить int в десятичную систему.
То есть в одном int можно хранить(в моем случае удобно) 5
А по-русски? Причём здесь десятичная система и какое отношение к int имеет значение 5? В памяти всё в любом случае всё хранится в двоичном виде.
PacMan писал(а):На сколько я знаю char * поддерживает до 255 символов.
char * -- это указатель на символ, и ничего более. Он никак не может поддерживать "до 255" или до чего ещё угодно символов -- он просто содержит некий адрес памяти, по которому лежит какой-нибудь символ. А ограничением в этой задаче, похоже, является объём ОЗУ контроллера, а значит, надо думать, как хранить данные компактнее.
Добавлено: Сб сен 26, 2009 20:06:30
PacMan
вообщем про int)))
мне надо хранить массив int mas[5][5][5]
предлагаю взять массив int mas[5][5]
перевести mas[j] в двоичный вид, получится что то типа(пусть mas[j] равен 31) 11111 тоесть я избавляюсь от одного "[]" понятно?)))
про char, я имел ввиду char s[25];
или char *s;
s = new char[];
)))
Добавлено: Сб сен 26, 2009 20:08:42
PacMan
можно же unsigned int mas[5][5][5]
unsigned int = 2 байт => 250 байт?
Добавлено: Сб сен 26, 2009 20:21:41
PacMan
можете подсказать как в CvAvr перевести из 10-й в 2-ю систему?
Re: 3-х мерный массив.
Добавлено: Сб сен 26, 2009 20:58:29
Synergetik
PacMan писал(а):мне надо хранить в микроконтроллере AtTiny2313 массив 3-х мерный.
подскажите, как мне его хранить
Да в чём проблема? Если нужно хранить трёхмерный массив двоичных одноразрядных чисел и чётко фиксированы элементы массива, объявите двухмерный массив char mass[5][5], в char'е 8 битов - используйте первые 5 посредством маски. Перерасхода памяти почти не будет. Если третья размерность больше 8, используйте int и т. д. Вот и всё.
Добавлено: Сб сен 26, 2009 21:01:01
PacMan
что значит посредством маски?)))
Добавлено: Сб сен 26, 2009 21:01:50
PacMan
а как обратится к 1 биту 2 ..... ?
Добавлено: Сб сен 26, 2009 21:17:20
Synergetik
PacMan писал(а):что значит посредством маски?)))
Маска реализуется операцией поразрядного И.
Пусть имеется массив char mass[rows][cols];. Чтение из элемента mass[x][y][z], если не ошибаюсь: t=mass[x][y]&(1<<z); Индексы x, y, z начинаются с нуля.
Запись сейчас не могу сообразить. В крайнем случае ручками или условным оператором if.
Добавлено: Сб сен 26, 2009 21:48:04
PacMan
спасибо за помощь.
у меня еще один вопрос. как теперь из 2 -> 10 систему перевести
тоесть мне надо записать в эту 3-ю координуту))
я понимаю это должно быть так
mass[j]=n;
где n запись ( пусть 11111 ) в 10 - й форме
Добавлено: Сб сен 26, 2009 21:56:45
Synergetik
PacMan писал(а):спасибо за помощь.
у меня еще один вопрос. как теперь из 2 -> 10 систему перевести
Я знаю только единственный способ перевода из одной системы счисления в другую. Для 2->10 пусть имеется число b01101. Нужно подсчитать сумму 1*2^0+0*2^1+1*2^2+1*2^3+0*2^4 в десятичной системе счисления. Аналогично можно производить расчёт в обратном направлении (10->2), вот только считать в двоичной системе счисления мы пока не научились.
PacMan писал(а):я понимаю это должно быть так
mass[j]=n;
где n запись ( пусть 11111 ) в 10 - й форме
Что-то сомневаюсь в целесообразности этого. Огласите задачу полностью.
Добавлено: Сб сен 26, 2009 22:06:20
__Alexander
Не совсем понятно что есть перевод из 2 в 10 в Си.
Вот например:
x = 0x02; // это число 2 в шестнадцатеричной системе
x = 0b00000010 ; // это число 2 в двоичной системе
x = 2; // это число 2 десятичной системе
в чем проблема то?
------------------------------------
Добавлено: Сб сен 26, 2009 22:19:35
andrey_artemov
Я думаю автору нужно вывести результат в двоичном виде....
Иначе, просто виндовый калькулятор рулит

Добавлено: Сб сен 26, 2009 22:22:11
andrey_artemov
__Alexander писал(а):Не совсем понятно что есть перевод из 2 в 10 в Си.
Вот например:
x = 0x02; // это число 2 в шестнадцатеричной системе
x = 0b00000010 ; // это число 2 в двоичной системе
x = 2; // это число 2 десятичной системе
в чем проблема то?
------------------------------------
Забыли в восмеричной
х= 02; это число 2 в восмеричной системе исчесления
Добавлено: Сб сен 26, 2009 23:11:41
kalobyte
твой 3х мерный массив занимает 250 байт в озу, а у тини всего 256 байт и компилятор тебе не даст собрать
описывай полностью задачу, а не куски вопросов
тем более в том компиляторе есть библиотека конвертации из систем
Добавлено: Вс сен 27, 2009 00:01:53
Шурики
массив битов 5х5х5 элементов. если считать 5 битовых элементов влазят в 1 байт, получаем 5х5х1 байт. На итого 25 байт - все лезет.
Добавлено: Вс сен 27, 2009 00:11:01
Synergetik
Шурики писал(а):массив битов 5х5х5 элементов. если считать 5 битовых элементов влазят в 1 байт, получаем 5х5х1 байт. На итого 25 байт - все лезет.
Да и 125 не только в falsh, но и в ОЗУ влезет
Добавлено: Вс сен 27, 2009 03:41:34
coder
Чтобы записать 1 в x,y,z делаем
mass[x][y] = mass[x][y]|(1<<z);
А чтобы записать туда 0
mass[x][y] = mass[x][y]&!(1<<z);
p.s. Надеюсь с синтаксисом не напутал...