реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> массив с указателями массивов, IAR указатели массивов
NickSmith
сообщение Feb 27 2011, 23:14
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Никак не могу одолеть следующую проблему:
Необходимо создать несколько многомерных массивов, а для удобства работы с ними создать массив с ссылками на них:
Создаю:
Код
__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 это делай...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 28 2011, 02:32
Сообщение #2


Гуру
******

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



Массив bdz по Вашей задумке должен содержать указатели на что? На массивы m3, m4, m7 ? Вспомните - что такое многомерный массив? В конце концов Вам, наверное, всего то и нужно
Код
unsigned int __eeprom bdz[3][10][2];
Или опять: что-то не так? Что же Вы хотите?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Feb 28 2011, 02:36
Сообщение #3


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Ну для начала не
Цитата
unsigned int __eeprom *bdz[]={*m3,*m4,*m7};

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


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


upd: а может Палыч дело говорит и оно вообще вам не надо?


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 28 2011, 09:08
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Может вам надо так:
Код
__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};
как то так

Go to the top of the page
 
+Quote Post
NickSmith
сообщение Feb 28 2011, 11:16
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(Палыч @ 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


Сообщение отредактировал NickSmith - Feb 28 2011, 11:19
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 28 2011, 12:52
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Если не сложно в двух словах поясните что я делал не так в данном решении.
У вас не совпадают типы массивов. Ваши исходные массивы (m?) являются 2х мерными массивами (во FLASH). Соответственно bdz должен быть массивом указателей на 2х мерные массивы во FLASH'е, а не массивом указателей на unsigned во FLASH'е
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Feb 28 2011, 16:17
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(XVR @ Feb 28 2011, 15:52) *
У вас не совпадают типы массивов. Ваши исходные массивы (m?) являются 2х мерными массивами (во FLASH). Соответственно bdz должен быть массивом указателей на 2х мерные массивы во FLASH'е, а не массивом указателей на unsigned во FLASH'е

Спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01471 секунд с 7
ELECTRONIX ©2004-2016