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

 
 
> 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
Ответов
MALLOY2
сообщение Dec 17 2007, 16:29
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



А если такая ситуация smile.gif
Код
for (c=0; c<sizeof(Setup); c++)  *sptr++ = get_eeprom(BASE_IMAGE+c); // Записываем по адресу некое значение


P.S. А првельней мне кажеться
Код
Read_eeprom(BASE_IMAGE, sptr, sizeof(Setup)); //:)
Go to the top of the page
 
+Quote Post
Andrei_S
сообщение Dec 18 2007, 08:34
Сообщение #3


Участник
*

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



Итак, общими усилиями получилось следующее:
имеется некая структура типа setup (все-таки структура а не массив, т.к. типы данных разные )

Код
typedef struct SettingMenu
{
   char Parametr1;
   char Parametr2;
   int    Parametr3;
   char Array[10];
   float Parametr5;
   ..........

};Setup
..........
..........
Setup LocalSetup;// Структура
char  *sptr; // Указатель


sptr = (char*)&LocalSetup;// Получили адрес
a=sizeof(Setup);// и размер

for (c=0; c<a; c++)
{
    *sptr++ = ReadEprom(StartSetupAdress+c);
}



Работает отлично, заморочек с чтением/записью разных типов данных нет. Большое спасибо!!

Но, допустим, мне необходимо перезаписать всего один элемент структуры - пускай 5 элемент.
Мне нужно узнать его адрес и размерность.

Указано явно:
Код
sptr = (char*)&LocalSetup.Parametr5;
a = sizeof(LocalSetup.Parametr5);// Получили размерность, например, он float - 4 байта
for (c=0; c<a; c++)
{
    *sptr++ = ReadEprom(StartSetupAdress+N+c);// где N-адрес в ПЗУ Параметра 5
}


Такой вопрос: как это сделать не с явным указанием, а по номеру элемента структуры
например, ReadSinglePar(LocalSetup,5), где 5 - пятый элемент структуры, т.е. Parametr5 ?

Если это делать явно, то модуль установочного меню раздуется весьма ощутимо, и будет проблемка синхронизации при изменении самой структуры(при изменении количества или названия элементов).
Можно, конечно, переписать всю структуру, но критично время.
Go to the top of the page
 
+Quote Post
vmp
сообщение Dec 18 2007, 13:10
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Цитата(Andrei_S @ Dec 18 2007, 11:34) *
Но, допустим, мне необходимо перезаписать всего один элемент структуры - пускай 5 элемент.
Мне нужно узнать его адрес и размерность.

Код
//-------------------------------------------------------------
// Вычисление смещения до поля в структуре
//-------------------------------------------------------------
#define OFFSET(type,field) ((char *)&(((type *)0)->field) - (char *)0)


Как пользоваться - OFFSET(тип_структуры, имя_элемента) выдаст смещение от начала структуры до указанного элемента. Размер элемента можно получить по sizeof(type.field).

Цитата(Andrei_S @ Dec 18 2007, 16:01) *
Но а все-таки, а как уйти от названия элементов структуры к порядковому номеру элемента этой структуры?

Хотелось бы вместо названия поля info_1 писать номер этого поля, например 1


Тогда я бы сделал еще одну табличку с дескрипторами полей. Например, массив структур с описателями параметров. В него заносил бы тип поля, смещение от начала, размер, формат вывода, строку с именем, минимальное и максимальное значения и т.д. А индекс этого массива для читабельности описал как enum. smile.gif
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
- - Andrei_S   Спасибо sergik_vrn , попробую... А насчет массива:...   Dec 17 2007, 10:35
|- - sergik_vrn   Цитата(Andrei_S @ Dec 17 2007, 13:35) Спа...   Dec 17 2007, 10:52
|- - Юрий Санвальд   Цитата(sergik_vrn @ Dec 17 2007, 13:52) ....   Dec 17 2007, 11:25
|- - Andrei_S   Цитата(sergik_vrn @ Dec 17 2007, 13:52) 1...   Dec 17 2007, 11:35
|- - Юрий Санвальд   Цитата(Andrei_S @ Dec 17 2007, 14:35) ......   Dec 17 2007, 11:48
||- - Andrei_S   Цитата(Юрий Санвальд @ Dec 17 2007, 14:48...   Dec 17 2007, 12:01
||- - aaarrr   Цитата(Andrei_S @ Dec 17 2007, 15:01) Пар...   Dec 17 2007, 12:12
|||- - Andrei_S   Цитата(aaarrr @ Dec 17 2007, 15:12) Ага, ...   Dec 17 2007, 12:26
|||- - Юрий Санвальд   Если уж все элементы однотипные, то чем тогда не п...   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
|- - 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
- - _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 Текстовая версия Сейчас: 24th June 2025 - 11:30
Рейтинг@Mail.ru


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