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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Обращение к элементу двухмерного массива используя адрес массива
LEVENVORF
сообщение Dec 24 2010, 14:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 14-03-10
Из: BELARUS
Пользователь №: 55 953



Код
//Структура описывающая подпрофиль
typedef struct {
  unsigned short type;
  unsigned short signal;
} sub_profile;

//Массив подпрофиля 1
const sub_profile SUB_PROFILE_1 = {
330,
400
};

//Массив подпрофиля 2
const sub_profile SUB_PROFILE_2 = {
100,
1200
};

......

//Массив подпрофиля n
const sub_profile SUB_PROFILE_n = {
1,
2
};

Массив профиля состоящий из указателей на подпрофили
Код
const sub_profile * PROFILE_1[] = {&SUB_PROFILE_1, &SUB_PROFILE_2, ... , &SUB_PROFILE_n, 0};

И еще один массив содержащий указатели на профили
Код
const sub_profile ** PROFILE[] = {PROFILE_1, ... , PROFILE_n, 0};

Массив PROFILE[] не объявлен, но известно что он начинается с адреса 0x0801F000 (по этому адресу он записывается при помощи другого проекта).
Каким образом я могу обратиться к элементу структуры определенного подпрофиля, определенного профиля.
При попытке:
Код
#define PROFILE                ((sub_profile **)(0x0801F000))

unsigned int temp;
  
temp = PROFILE[1][0]->type;

IAR ARM 5.50 выдает ошибку expression must have pointer type
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 25 2010, 17:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(LEVENVORF @ Dec 24 2010, 22:13) *
IAR ARM 5.50 выдает ошибку expression must have pointer type
Все верно. Значением указателя на указатель является адрес указателя. При попытке напрямую присвоить обычной переменной значение указателя (адрес) и возникает ошибка. Если вам непременно необходимо такое присваивание, то сделайте явное приведение типа к типу переменной. Только предварительно удостоверьтесь, что тип int в вашей системе имеет размерность не меньше, чем адрес переменной.
Go to the top of the page
 
+Quote Post
LEVENVORF
сообщение Dec 25 2010, 18:33
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 14-03-10
Из: BELARUS
Пользователь №: 55 953



int для stm32f 4-х байтный.

Так как же мне все-таки вычитать значение элемента структуры?
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 25 2010, 19:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(LEVENVORF @ Dec 26 2010, 02:33) *
Так как же мне все-таки вычитать значение элемента структуры?
Используя указатель. Значение из массива указателей нужно присваивать переменной имеющий такой же тип указателя и затем использовать обращение через этот указатель к массиву элементов.
Go to the top of the page
 
+Quote Post
LEVENVORF
сообщение Dec 25 2010, 19:51
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 14-03-10
Из: BELARUS
Пользователь №: 55 953



Попробовал вот так:
Код
#define PROFILE                ((sub_profile **)(0x0801F000))

sub_profile*  temp;
unsigned short temp2;
  
temp = PROFILE[1];
temp2 = (temp[0])->type;

Не помогло. Ошибка такая же.
Что неправильно?
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 25 2010, 20:35
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



На какую именно строку ругается?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 25 2010, 20:35
Сообщение #7


I WANT TO BELIEVE
******

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



ну так чтобы из указателя на указатель получить указатель - разыменовать то надо бы по идее ))
Код
temp = *PROFILE[1];
как-то так, чтоли..


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
LEVENVORF
сообщение Dec 25 2010, 20:37
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 14-03-10
Из: BELARUS
Пользователь №: 55 953



Цитата(rezident @ Dec 26 2010, 01:35) *
На какую именно строку ругается?

Код
temp2 = (temp[0])->type;

Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 25 2010, 21:06
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А если так?
Код
temp2 = temp[0].type;

temp[0] уже получает значение адреса структуры, а чтобы извлечь элемент структуры нужно применить "." (оператор "точка"). Вы же пытаетесь адрес самой структуры применить как указатель на элемент структуры, но он им не является.
Go to the top of the page
 
+Quote Post
LEVENVORF
сообщение Dec 25 2010, 21:30
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 14-03-10
Из: BELARUS
Пользователь №: 55 953



Цитата(rezident @ Dec 26 2010, 02:06) *
А если так?
Код
temp2 = temp[0].type;

temp[0] уже получает значение адреса структуры, а чтобы извлечь элемент структуры нужно применить "." (оператор "точка"). Вы же пытаетесь адрес самой структуры применить как указатель на элемент структуры, но он им не является.


Откомпилировалось rolleyes.gif , но работает неправильно crying.gif
temp2 приняло значение первых двух байт temp[0], а это не значение элемента структуры, а кусок (потому что temp2 типа short) адреса структуры.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 26 2010, 01:11
Сообщение #11


I WANT TO BELIEVE
******

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



Разыменовывать, разыменовывать же)
вот это даже проверил(правда на gcc)
Код
//Структура описывающая подпрофиль
typedef struct {
  unsigned short type;
  unsigned short signal;
} sub_profile;

//Массив подпрофиля 1
const sub_profile SUB_PROFILE_1 = {
330,
400
};

//Массив подпрофиля 2
const sub_profile SUB_PROFILE_2 = {
100,
1200
};

const sub_profile *PROFILE_1[] = {&SUB_PROFILE_1, &SUB_PROFILE_2, 0};


//сюда во время своего эксперимента я подставлял свой адрес. Но сути дела это не меняет ))
#define PROFILE                ((sub_profile **)(0x0801F000))

//у Вас тут был int, а не  short...
unsigned short temp;

void main(void){
//тут мыслил так:
//сперва разыменовываем PROFILE, чтобы указатель на указатель превратился просто в указатель (*PROFILE)
//далее, этот разименованый указатель приводим к типу (sub_profile *), чтобы компилятор трактовал новоиспеченный указатель
//как указывающий на тип sub_profile *
//далее уже(после приведения типа) к этому указателю можно обратиться как к массиву используя известную фишку Си [0]
//также известно, что после применения этой фишки нам уже нужно использовать не ->, а .
//вот, собственно и имеем результат
    temp = (sub_profile *)(*PROFILE)[0].type; //temp == 330
}


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
LEVENVORF
сообщение Dec 26 2010, 16:05
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 14-03-10
Из: BELARUS
Пользователь №: 55 953



не компилируется. ругается на строку:
Цитата(sigmaN @ Dec 26 2010, 06:11) *
Код
temp = (sub_profile *)(*PROFILE)[0].type;

a value of type "sub_profile*" cannot be assigned to an entity of type "unsigned short"
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 26 2010, 17:38
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Ну вот так точно уж должно работать
Код
#define PROFILE                ((sub_profile **)(0x0801F000))

unsigned short temp;
sub_profile **pptr, *pntr;

  pptr = PROFILE; // инициализируем указатель
  pptr = (sub_profile **)(pptr[1]); // извлекаем из массива указатель на требуемый массив указателей
  pntr = (sub_profile *)(*pptr); // извлекаем из массива указателей требуемый указатель на структуру
  temp = pntr[1].type; //извлекаем элемент структуры

Тут все по-отдельности, но типизация соответствует.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 26 2010, 17:54
Сообщение #14


I WANT TO BELIEVE
******

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



Цитата
не компилируется. ругается на строку:
компилятору незачёт )) проверить всё не получится ибо IARa нет у меня.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 26 2010, 18:17
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Вот так тоже работает, но лично меня сложность такой конструкции несколько угнетает sm.gif
Код
temp = ((sub_profile *)(*(sub_profile **)PROFILE[1]))[1].type;
Go to the top of the page
 
+Quote Post

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

 


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


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