NickSmith 0 27 февраля, 2011 Опубликовано 27 февраля, 2011 · Жалоба Никак не могу одолеть следующую проблему: Необходимо создать несколько многомерных массивов, а для удобства работы с ними создать массив с ссылками на них: Создаю: __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 это делай... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 28 февраля, 2011 Опубликовано 28 февраля, 2011 · Жалоба Массив bdz по Вашей задумке должен содержать указатели на что? На массивы m3, m4, m7 ? Вспомните - что такое многомерный массив? В конце концов Вам, наверное, всего то и нужно unsigned int __eeprom bdz[3][10][2]; Или опять: что-то не так? Что же Вы хотите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 28 февраля, 2011 Опубликовано 28 февраля, 2011 · Жалоба Ну для начала не unsigned int __eeprom *bdz[]={*m3,*m4,*m7}; а unsigned int __eeprom *bdz[]={&m3,&m4,&m7}; И кажется там без определения типа не обойтись ибо при обращении temp=*(bdz[2]{[3][0]}); (кстати, надо без фигурных скобочек и этой звёздочки) компилятор не будет знать, что в строке у нас 10 элементов, а в каждом массиве по три строки. Т.е. не сможет преобразовать координаты элемента в массиве ([3][0]) в реальный адрес. upd: а может Палыч дело говорит и оно вообще вам не надо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 28 февраля, 2011 Опубликовано 28 февраля, 2011 · Жалоба Может вам надо так: __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 0 28 февраля, 2011 Опубликовано 28 февраля, 2011 (изменено) · Жалоба Массив bdz по Вашей задумке должен содержать указатели на что? На массивы m3, m4, m7 ? Вспомните - что такое многомерный массив? В конце концов Вам, наверное, всего то и нужно;[/code]Или опять: что-то не так? Что же Вы хотите? Спасибо. Именно так и надо, только я почему то начитавшись книжек подумал, что это не правильно. Сейчас понял, что так же тоже правильно. Только с точки зрения памяти это немного расточительно по моему. Через ссылки будет будет по экономичней но меня в принципе и такой вариант устраивает полностью или я не прав?? 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) То соответственно могу сместить адрес и получить ячейку.. При любой записи при организации ссылочного массива результат одинаковый??? Может вам надо так: ? Если же вам нужен именно оригинал, то [или без typedef Попробовал без typedef. Не прошло. Если не сложно в двух словах поясните что я делал не так в данном решении. Очень хочется разобраться в ссылках и массивах. И если не сложно ткните какие разделы у K&R проработать... И еще вопрос возник. Я делаю инициализацию массива. В настройках IAR говорю, что бы он мне сделал файл с содержимым eeprom. Он мне это делает, но когда я в него смотрю, то там всякая ерунда. Т.е какие то значения появляются, но они не соответствую заданным. При подключении этого файла к модели в протеусе, от туда читается всякая ерунда.. В чем дело?? P.S. Вывод фала eeprom настраивал как тут много раз писалось -y(CODE) -Ointel-extended,(XDATA)=$EXE_DIR$\$PROJ_FNAME$_data.bin Изменено 28 февраля, 2011 пользователем NickSmith Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 28 февраля, 2011 Опубликовано 28 февраля, 2011 · Жалоба Если не сложно в двух словах поясните что я делал не так в данном решении.У вас не совпадают типы массивов. Ваши исходные массивы (m?) являются 2х мерными массивами (во FLASH). Соответственно bdz должен быть массивом указателей на 2х мерные массивы во FLASH'е, а не массивом указателей на unsigned во FLASH'е Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NickSmith 0 28 февраля, 2011 Опубликовано 28 февраля, 2011 · Жалоба У вас не совпадают типы массивов. Ваши исходные массивы (m?) являются 2х мерными массивами (во FLASH). Соответственно bdz должен быть массивом указателей на 2х мерные массивы во FLASH'е, а не массивом указателей на unsigned во FLASH'е Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться