Перейти к содержанию
    

массив с указателями массивов

Никак не могу одолеть следующую проблему:

Необходимо создать несколько многомерных массивов, а для удобства работы с ними создать массив с ссылками на них:

Создаю:

__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];

Или опять: что-то не так? Что же Вы хотите?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну для начала не

unsigned int __eeprom *bdz[]={*m3,*m4,*m7};

а

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

 

И кажется там без определения типа не обойтись ибо при обращении

temp=*(bdz[2]{[3][0]});

(кстати, надо без фигурных скобочек и этой звёздочки) компилятор не будет знать, что в строке у нас 10 элементов, а в каждом массиве по три строки. Т.е. не сможет преобразовать координаты элемента в массиве ([3][0]) в реальный адрес.

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может вам надо так:

__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};

как то так

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Массив 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

Изменено пользователем NickSmith

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не сложно в двух словах поясните что я делал не так в данном решении.
У вас не совпадают типы массивов. Ваши исходные массивы (m?) являются 2х мерными массивами (во FLASH). Соответственно bdz должен быть массивом указателей на 2х мерные массивы во FLASH'е, а не массивом указателей на unsigned во FLASH'е

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас не совпадают типы массивов. Ваши исходные массивы (m?) являются 2х мерными массивами (во FLASH). Соответственно bdz должен быть массивом указателей на 2х мерные массивы во FLASH'е, а не массивом указателей на unsigned во FLASH'е

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...