Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: массив с указателями массивов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
NickSmith
Никак не могу одолеть следующую проблему:
Необходимо создать несколько многомерных массивов, а для удобства работы с ними создать массив с ссылками на них:
Создаю:
Код
__eeprom unsigned int m3 [10][2];
__eeprom unsigned int m4 [10][2];
__eeprom unsigned int m7 [10][2];
unsigned int __eeprom *bdz[]={*m3,*m4,*m7};

Теперь хочу обратится например к m4 строке 3 ячейке 0.
Типа temp=bdz[1][3][0]
Пишу
Код
unsigned int temp;
int main( void )
{
temp=*(bdz[2]{[3][0]});
}

Компилятор ругается, пробовал по всякому. Много раз перечитывал K&R главу 5 . Указатели и массивы. В общем понимание есть, но как это правильно описать хоть убей не могу понять.. Хоть на case это делай...
Палыч
Массив bdz по Вашей задумке должен содержать указатели на что? На массивы m3, m4, m7 ? Вспомните - что такое многомерный массив? В конце концов Вам, наверное, всего то и нужно
Код
unsigned int __eeprom bdz[3][10][2];
Или опять: что-то не так? Что же Вы хотите?
sigmaN
Ну для начала не
Цитата
unsigned int __eeprom *bdz[]={*m3,*m4,*m7};

а
Код
unsigned int __eeprom *bdz[]={&m3,&m4,&m7};


И кажется там без определения типа не обойтись ибо при обращении
Код
temp=*(bdz[2]{[3][0]});
(кстати, надо без фигурных скобочек и этой звёздочки) компилятор не будет знать, что в строке у нас 10 элементов, а в каждом массиве по три строки. Т.е. не сможет преобразовать координаты элемента в массиве ([3][0]) в реальный адрес.


upd: а может Палыч дело говорит и оно вообще вам не надо?
XVR
Может вам надо так:
Код
__eeprom unsigned int bdz[3][10][2];
#define m3 (bdz[0])
#define m4 (bdz[1])
#define m7 (bdz[2])
?


Если же вам нужен именно оригинал, то
Код
typedef __eeprom unsigned int Arr [10][2];
Arr m3;
Arr m4;
Arr m7;
Arr *bdz[]={m3,m4,m7};
или без typedef
Код
__eeprom unsigned int m3 [10][2];
__eeprom unsigned int m4 [10][2];
__eeprom unsigned int m7 [10][2];
__eeprom unsigned int (*bdz[])[10][2]={m3,m4,m7};
как то так

NickSmith
Цитата(Палыч @ Feb 28 2011, 05:32) *
Массив bdz по Вашей задумке должен содержать указатели на что? На массивы m3, m4, m7 ? Вспомните - что такое многомерный массив? В конце концов Вам, наверное, всего то и нужно;[/code]Или опять: что-то не так? Что же Вы хотите?

Спасибо. Именно так и надо, только я почему то начитавшись книжек подумал, что это не правильно. Сейчас понял, что так же тоже правильно. Только с точки зрения памяти это немного расточительно по моему.
Через ссылки будет будет по экономичней но меня в принципе и такой вариант устраивает полностью или я не прав??


Цитата(sigmaN @ Feb 28 2011, 05:36) *
upd: а может Палыч дело говорит и оно вообще вам не надо?

Палыч действительно прав, но теперь уже хочется разобраться до конца как такой вариант реализовывать.. Два дня убил на него.
Код
unsigned int __eeprom *bdz[]={&m3,&m4,&m7};

И
Код
unsigned int __eeprom *bdz[]={*m3,*m4,*m7};

Оба работают. Если я например обращаюсь так
Код
temp=*bdz[1]

Получаю значение 0.0 из массива m4. Если пишу так:
Код
temp=*(bdz[1]+3)

То соответственно могу сместить адрес и получить ячейку..
При любой записи при организации ссылочного массива результат одинаковый???

[quote name='XVR' post='892244' date='Feb 28 2011, 12:08']Может вам надо так:
?


Если же вам нужен именно оригинал, то
[или без typedef
Попробовал без typedef. Не прошло.

Если не сложно в двух словах поясните что я делал не так в данном решении. Очень хочется разобраться в ссылках и массивах. И если не сложно ткните какие разделы у K&R проработать...
И еще вопрос возник.
Я делаю инициализацию массива. В настройках IAR говорю, что бы он мне сделал файл с содержимым eeprom. Он мне это делает, но когда я в него смотрю, то там всякая ерунда. Т.е какие то значения появляются, но они не соответствую заданным.
При подключении этого файла к модели в протеусе, от туда читается всякая ерунда.. В чем дело??
P.S. Вывод фала eeprom настраивал как тут много раз писалось
Код
-y(CODE)
-Ointel-extended,(XDATA)=$EXE_DIR$\$PROJ_FNAME$_data.bin
XVR
Цитата
Если не сложно в двух словах поясните что я делал не так в данном решении.
У вас не совпадают типы массивов. Ваши исходные массивы (m?) являются 2х мерными массивами (во FLASH). Соответственно bdz должен быть массивом указателей на 2х мерные массивы во FLASH'е, а не массивом указателей на unsigned во FLASH'е
NickSmith
Цитата(XVR @ Feb 28 2011, 15:52) *
У вас не совпадают типы массивов. Ваши исходные массивы (m?) являются 2х мерными массивами (во FLASH). Соответственно bdz должен быть массивом указателей на 2х мерные массивы во FLASH'е, а не массивом указателей на unsigned во FLASH'е

Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.