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

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


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



присоединяюсь к sergik_vrn

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

Сложно запомнить? Хорошо. А для чего тогда используются комментарии?

Комирование структуртоже никто не отменял

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

LocalSetup = eeSetup;
...
*sptr = eeSetup;


Сообщение отредактировал zhevak - Dec 17 2007, 11:52


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 17 2007, 12:36
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zhevak @ Dec 17 2007, 13:41) *
Структура, все элементы которой имеют одинаковый тип, явно напрашивается на то, чтобы быть массивом.
Вовсе нет. Смотрите:
Код
typedef struct
{
    uint8_t Size_X;
    uint8_t Size_Y;
    uint8_t Bitmap[];
}  bmp_font_t;
Здесь Size_X и Size_Y имеют такой же тип, что и члены следующего за ними массива, но включать их в этот массив было бы очень ненаглядно.
Как я понял, автор вопроса хранит в структуре данные, которые хоть и имеют один и тот же интегральный тип, но логически не эквивалентны. Если я не прав, то красивым и верным будет решение, предложенное vmp, если же я прав, то подход автора в осмысленным именовании каждого члена безусловно правильный, а для удобства на каких-то операциях работать со структурой как с массивом можно использовать union:
Код
typedef union
{
    struct
    {
        uint8_t member1;
        uint8_t member2;
        uint8_t member3;
    };
    uint8_t   Array[1];
} setup_t
использование здесь массива размером 1 является некоторым хаком чтобы не именовать структуру. При проверке индекса массива нужно использовать sizeof() от union. Если структуре дать имя, тогда можно в качестве размера массива задать sizeof() структуры, но в коде при доступе к членам появляется в общем-то ненужное имя структуры.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Andrei_S
сообщение Dec 17 2007, 12:52
Сообщение #4


Участник
*

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



Цитата(Сергей Борщ @ Dec 17 2007, 15:36) *
Вовсе нет. Смотрите:
Код
typedef struct
{
    uint8_t Size_X;
    uint8_t Size_Y;
    uint8_t Bitmap[];
}  bmp_font_t;
Здесь Size_X и Size_Y имеют такой же тип, что и члены следующего за ними массива, но включать их в этот массив было бы очень ненаглядно.
Как я понял, автор вопроса хранит в структуре данные, которые хоть и имеют один и тот же интегральный тип, но логически не эквивалентны. Если я не прав, то красивым и верным будет решение, предложенное vmp, если же я прав, то подход автора в осмысленным именовании каждого члена безусловно правильный, а для удобства на каких-то операциях работать со структурой как с массивом можно использовать union:
Код
typedef union
{
    struct
    {
        uint8_t member1;
        uint8_t member2;
        uint8_t member3;
    };
    uint8_t   Array[1];
} setup_t
использование здесь массива размером 1 является некоторым хаком чтобы не именовать структуру. При проверке индекса массива нужно использовать sizeof() от union. Если структуре дать имя, тогда можно в качестве размера массива задать sizeof() структуры, но в коде при доступе к членам появляется в общем-то ненужное имя структуры.


Вообще-то типы переменных разные, но для упрощения я их привел к одному типу, нехваткой памяти я не жалуюсь...

Простите за серость, но адресацию элементов через enum я еще не делал...
Pls, не подскажете ли конструкцию???
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Dec 17 2007, 13:27
Сообщение #5


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

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



Цитата(Andrei_S @ Dec 17 2007, 15:52) *
Вообще-то типы переменных разные, но для упрощения я их привел к одному типу, нехваткой памяти я не жалуюсь...

Простите за серость, но адресацию элементов через enum я еще не делал...
Pls, не подскажете ли конструкцию???

если разные, делайте как делали, это правильно
по поводу enum:
Код
const u8 CONFIG_SIZE = 3;
enum Config_Items { baud_rate = 0, parity, stop_bits }; // и т.д. - по необходимости
typedef u8 Configuration[CONFIG_SIZE];
Configuration my_config;

for (int i = 0; i < CONFIG_SIZE; ++i)
    my_config[i] = Read_EEEPROM(i);

...

Set_UART(my_config[baud_rate], my_config[parity], my_config[stop_bits]);
...
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 @ Dec 17 2007, 14:41) ... С...   Dec 17 2007, 12:01
|- - 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 Текстовая версия Сейчас: 29th June 2025 - 15:00
Рейтинг@Mail.ru


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