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

 
 
> struct - непонятка с косвенной адресацией
Andrei_S
сообщение Dec 17 2007, 09:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 3-08-07
Из: Орловская обл.
Пользователь №: 29 535



Господа, что-то не понимаю следующего:

Даю описание структуры

typedef struct SettingMenu
{
unsigned int
P1,
P2,
...
...
P100;
} Setup;

Где-то в модуле(да неважно где) создаем новую структуру типа Setup

Setup LocalSetup;

Требуется заполнить поля структуры какими-нибудь значениями. Так как количество полей большое, резонно использовать косвенную адресацию.
Берем адрес структуры и в цикле запихиваем в структуру данные.

Setup LocalSetup;// Создаем структуру типа Setup
Setup *sptr;// Указатель
...
...

sptr = & LocalSetup;// Определяем адрес структуры

for (c=0; c<100; c++)
{
*sptr = c; // Записываем по адресу некое значение
sptr++; // Увеличиваем адрес
}

Это классический пример С, значения пишутся во все поля без проблем

В Keil-е номер не проходит - ругается на разные типы данных строки *sptr = c, хотя теоретически я получил в качестве адреса структуры адрес первого поля этой структуры.
Как бы это правильно разрулить???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andrei_S
сообщение Dec 17 2007, 10:35
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 3-08-07
Из: Орловская обл.
Пользователь №: 29 535



Спасибо sergik_vrn , попробую...
А насчет массива:
имеется добрая сотня значений меню, и в теле программы помнить какой элемент массива за что отвечает - нереально!!! Надо иметь бумажку, где все эти элементы сопоставляются - короче, гемороище...
Проще указать каждой переменной адрес, где она будет лежать в RAM, а не использовать массив.

Спасибо за ответы...
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Dec 17 2007, 10:52
Сообщение #3


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

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(Andrei_S @ Dec 17 2007, 13:35) *
Спасибо sergik_vrn , попробую...
А насчет массива:
имеется добрая сотня значений меню, и в теле программы помнить какой элемент массива за что отвечает - нереально!!! Надо иметь бумажку, где все эти элементы сопоставляются - короче, гемороище...
Проще указать каждой переменной адрес, где она будет лежать в RAM, а не использовать массив.

Спасибо за ответы...

1. тот вариант, что я привел - вовсе не оптимальный, просто в нем исправлены Ваши ошибки
2. адрес элемента массива это <имя_массива>+<номер элемента>
3. также настоятельно рекомендую воспользоваться массивом и не заниматься ерундой. судя из того, что я понял по приведенному исходнику, Вам массив и нужен, причем даже без всякой обрамляющей структуры

пассаж насчет указания адресов "лежания" для переменных до моего понимания не дошел
Go to the top of the page
 
+Quote Post
Andrei_S
сообщение Dec 17 2007, 11:35
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 3-08-07
Из: Орловская обл.
Пользователь №: 29 535



Цитата(sergik_vrn @ Dec 17 2007, 13:52) *
1. тот вариант, что я привел - вовсе не оптимальный, просто в нем исправлены Ваши ошибки
2. адрес элемента массива это <имя_массива>+<номер элемента>
3. также настоятельно рекомендую воспользоваться массивом и не заниматься ерундой. судя из того, что я понял по приведенному исходнику, Вам массив и нужен, причем даже без всякой обрамляющей структуры

пассаж насчет указания адресов "лежания" для переменных до моего понимания не дошел


Пояснение по адресам "лежания":
имеется установочное меню, включающее в себя несколько десятков пунктов. Каждому пункту меню соответствует своя переменная. В процессе работы используются значения этих переменных.
Если будет сделан массив, как Вы предлагаете, то мне придется помнить, какой из элементов массива за что отвечает.
Да, будет очень удобно в этот массив переписывать данные, например, из ПЗУ в одном единственном цикле
Код
for(a=0;a<Lengh;a++){Array[a]=Read_Eprom(a);}
,
но в программе помнить о том, какая ячейка чему соответствует - весьма тяжело, и не исключены ошибки.
Используя прямую адресацию в RAM, типа

Код
unsigned int P1x __at(0x00000000000000000)
unsigned int P2x __at(0x00000000000000001)


я смогу в одном цикле выполнить действия аналогичные примеры выше, но только с косвенной адресацией

Код
unsigned int *sptr;

sptr = & P1x;
for(a=0;a<Lengh;a++;sptr++){*sptr=Read_Eprom(a);}


Значения из Eprom автоматом перепишутся по нужным адресам.
Только для этого я предполагаю явное указание адреса.
А в теле программы читать и писать, например, пункт меню Baud_Rate гораздо понятнее и приятнее чем, например, Array[64]
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Dec 17 2007, 11:48
Сообщение #5


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

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(Andrei_S @ Dec 17 2007, 14:35) *
...
Используя прямую адресацию в RAM, типа

Код
unsigned int P1x __at(0x00000000000000000)
unsigned int P2x __at(0x00000000000000001)


я смогу в одном цикле выполнить действия аналогичные примеры выше, но только с косвенной адресацией

Код
unsigned int *sptr;

sptr = & P1x;
for(a=0;a<Lengh;a++;sptr++){*sptr=Read_Eprom(a);}


Интересно, ну и что Вы хотели этим пояснить:
Код
unsigned int P1x __at(0x00000000000000000)
unsigned int P2x __at(0x00000000000000001)

07.gif

Это не скомпилиться без явного приведения типа в нормальном компиляторе:
Код
sptr = & P1x;

если P1x - структура.
Go to the top of the page
 
+Quote Post
Andrei_S
сообщение Dec 17 2007, 12:01
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 3-08-07
Из: Орловская обл.
Пользователь №: 29 535



Цитата(Юрий Санвальд @ Dec 17 2007, 14:48) *
Интересно, ну и что Вы хотели этим пояснить:
Код
unsigned int P1x __at(0x00000000000000000)
unsigned int P2x __at(0x00000000000000001)

07.gif

Это не скомпилиться без явного приведения типа в нормальном компиляторе:
Код
sptr = & P1x;

если P1x - структура.



Код
unsigned int  P111 __at (0x40003000);
unsigned int  P112 __at (0x40003002);


int main(void){

unsigned int *aptr;

aptr = & P111;
for(hhh=0;hhh<10;hhh++)
{
  *aptr=hhh;
  aptr++;
}



}


Пардон, скомпилилось без вопросов...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 17 2007, 12:12
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Andrei_S @ Dec 17 2007, 15:01) *
Пардон, скомпилилось без вопросов...

Ага, только работать не будет (int по адресу 0x40003002).
Честное слово, не могу понять, что Вам нужно получить в результате - структуру меню с возможностью загрузки из EEPROM? Зачем эти фиксированные адреса и прочие извращения?
Go to the top of the page
 
+Quote Post
Andrei_S
сообщение Dec 17 2007, 12:26
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 3-08-07
Из: Орловская обл.
Пользователь №: 29 535



Цитата(aaarrr @ Dec 17 2007, 15:12) *
Ага, только работать не будет (int по адресу 0x40003002).
Честное слово, не могу понять, что Вам нужно получить в результате - структуру меню с возможностью загрузки из EEPROM? Зачем эти фиксированные адреса и прочие извращения?



Имеется большое количество переменных. Я хочу как можно сильней упростить их перезапись (в том числе и в ПЗУ).

Например писать:
BaudRate = Read_Eprom(10);
StopBit = Read_Eprom(11); и так сто раз весьма утомительно.

Вариант с адресацией, на мой взгляд, избавит от рутины, к тому же имена переменных будут осмысленны, в отличие от массива.
Может есть какие-то отлаженные решения?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Andrei_S   struct - непонятка с косвенной адресацией   Dec 17 2007, 09:51
- - sergik_vrn   Цитата(Andrei_S @ Dec 17 2007, 12:51) Set...   Dec 17 2007, 10:05
- - VladislavS   Хотите массив - используйте!!! typedef...   Dec 17 2007, 10:18
|- - Юрий Санвальд   Цитата(sergik_vrn @ Dec 17 2007, 13:52) ....   Dec 17 2007, 11:25
|||- - Юрий Санвальд   Если уж все элементы однотипные, то чем тогда не п...   Dec 17 2007, 12:34
|||- - sergik_vrn   Цитата(Andrei_S @ Dec 17 2007, 15:26) Име...   Dec 17 2007, 12:34
||- - Юрий Санвальд   Цитата(Andrei_S @ Dec 17 2007, 15:01) Пар...   Dec 17 2007, 12:18
|- - sergik_vrn   Цитата(Andrei_S @ Dec 17 2007, 14:35) ......   Dec 17 2007, 12:20
|- - tag   Цитата(sergik_vrn @ Dec 17 2007, 15:20) у...   Dec 18 2007, 10:45
|- - Andrei_S   Цитата(tag @ Dec 18 2007, 13:45) ...как в...   Dec 18 2007, 11:48
- - zhevak   присоединяюсь к sergik_vrn Структура, все элемент...   Dec 17 2007, 11:41
|- - Юрий Санвальд   Цитата(zhevak @ Dec 17 2007, 14:41) ... С...   Dec 17 2007, 12:01
|- - Сергей Борщ   Цитата(zhevak @ Dec 17 2007, 13:41) Струк...   Dec 17 2007, 12:36
|- - Andrei_S   Цитата(Сергей Борщ @ Dec 17 2007, 15:36) ...   Dec 17 2007, 12:52
|- - sergik_vrn   Цитата(Andrei_S @ Dec 17 2007, 15:52) Воо...   Dec 17 2007, 13:27
|- - Andrei_S   Большое спасибо всем! Буду пробовать...   Dec 17 2007, 13:33
- - vmp   Почитайте про перечислимый тип (enum). Именно он н...   Dec 17 2007, 11:53
- - digital   union { unsigned char mass[10]; struct...   Dec 17 2007, 13:28
- - digital   по поводу enum: не хорошо, так как заставляет сам...   Dec 17 2007, 13:47
- - MALLOY2   ЦитатаГоспода, что-то не понимаю следующего: Даю ...   Dec 17 2007, 14:40
- - vet   memset(&LocalSetup, 0, sizeof(Setup)) тогда уж...   Dec 17 2007, 14:47
- - MALLOY2   А если такая ситуация Кодfor (c=0; c<siz...   Dec 17 2007, 16:29
|- - Andrei_S   Итак, общими усилиями получилось следующее: имеетс...   Dec 18 2007, 08:34
|- - sergik_vrn   Цитата(Andrei_S @ Dec 18 2007, 11:34) Ита...   Dec 18 2007, 09:00
||- - Andrei_S   Цитата(sergik_vrn @ Dec 18 2007, 12:00) я...   Dec 18 2007, 10:26
|- - vmp   Цитата(Andrei_S @ Dec 18 2007, 11:34) Но,...   Dec 18 2007, 13:10
- - _dem   Цитата..как вариант#define BAUD_RATE ...   Dec 18 2007, 12:31
- - Andrei_S   КодRead_EEPROM((u8 *)&config.info_...   Dec 18 2007, 13:01
- - _dem   Если типов данных сравнительно немного, сделайте о...   Dec 18 2007, 14:07


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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 19:53
Рейтинг@Mail.ru


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