Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 29.12.2019
Сообщений: 4
1

Доступ к полю структуры

29.12.2019, 10:38. Показов 1979. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Подскажите пожалуйста как передать в функцию указатель, который является указателем на массив в поле структуры.

Имеется:

1). Структура типа:

C
1
2
3
4
5
6
volatile struct FSM_BASE                   
{
                    u8 *message;  
                  void *data;     
    struct TIMERS *tim;     
};

2). Массив структур, поле каждой структуры про инициализированно именем соответствующего созданного ранее массива
C
1
2
3
4
5
6
7
8
struct FSM_BASE all_fsm [FSM]= 
{
    {msg_uart, dat_uart,  tim_uart}, 
    {msg_key,  dat_key,   tim_key}, 
    {msg_lcd,  dat_lcd,   tim_lcd}, 
    {msg_tmp,  dat_tmp,   tim_tmp}, 
    {msg_clk, &data_time, tim_clk}
};

3). Для удобства работы с элементами массива, введены указатели

C
1
2
3
4
5
struct FSM_BASE *uart_fsm = &all_fsm[0];
struct FSM_BASE *key_fsm  = &all_fsm[1];
struct FSM_BASE *lcd_fsm   = &all_fsm[2];
struct FSM_BASE *tmp_fsm  = &all_fsm[3];
struct FSM_BASE *tim_fsm   = &all_fsm[4];

4). В соответствующем модуле программы, введено объявление
extern struct FSM_BASE *uart_fsm;
Необходимо передать в функцию указатель на массив
s8 get_Message(u8 *msg, u8 num);


Пытаюсь мыслить логически, но не понимаю очерёдности действий:
- имеем указатель на элемент массива структур;
- для доступа к элементу структуры, необходимо разименовать этот указатель через оператор ->;
- поле структуры, является так же указателем, вот тут затык .
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2019, 10:38
Ответы с готовыми решениями:

Доступ к полю структуры из буфера
Добрый день. Столкнулся с такой проблемой - необходимо обратиться к полю структуры,которая...

Поиск по полю структуры
struct s { int k; char p; float l; char n; } дана структура как осуществить поиск по...

Сортировка по структуры по полю ФИО
О ГУРУ программирования! Помогите мне решить задачу. Нужно отсортировать структуру по полю FIO. Но...

Сортировка структуры по полю char
Есть структура struct AeroFlot { char* destination; char* tip; int nomer; int...

6
фрилансер
5504 / 5099 / 1048
Регистрация: 11.10.2019
Сообщений: 13,366
29.12.2019, 14:56 2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
struct FSM_BASE all_fsm [FSM]; //массив
...
 
s8 get_Message(const struct FSM_BASE* pArray, unsigned int count) //функция
{
}
...
 
...
{
   //вызываем функцию
   get_Message(all_fsm,FSM);
}
Добавлено через 1 минуту
может, я что не так понял. Пост немного туманный. Покажи лучше кусок кода, которые не компилируется/работает неправильно, а там дальше сообразим )
0
0 / 0 / 0
Регистрация: 29.12.2019
Сообщений: 4
29.12.2019, 16:24  [ТС] 3
Всё верно, раньше так и делал как вы предлагаете, в качестве аргумента передавал указатель на структуру, а внутри функции её разбирал. Всё работало.

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

Проект содержит:

1). Глобальный модуль с определениями типов данных include.h
C++
1
2
3
4
5
6
7
//Структура данных базовый конечный автомат
volatile struct FSM_BASE                   
{
               u8 *message;  //Указатель на массив сообщений FSM
             void *data;     //Указатель на данные FSM
    struct TIMERS *tim;      //Указатель на массив таймеров FSM
};
2). Модули представления и реализации для каждого объекта (конечного автомата)
например uart_fsm.h, uart_fsm.c с указанием наличия внешней переменной (указателя)
C++
1
extern struct FSM_BASE *uart_fsm;
3). Модуль сообщений (для обмена данными между автоматами)
message.h, mesagge.c, с функциями которые могут передавать и читать сообщения от (между) автоматов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void send_Message(u8 *msg, u8 num) //Функция отправки сообщения
{
    if (msg[num] == Pass)
        msg[num] = Set;
}
 
s8 get_Message(u8 *msg, u8 num)     //Функция получения сообщения
{
    if (msg[num] == Activ)
        {
            msg[num] = Pass;
            return 0;
        }
    
    return -1;
}

4). В функции main, созданы глобальные переменные (массивы) для инициализации структур конечных автоматов, и создан массив структур для конечных автоматов. Для удобства, решил каждому конечному автомату (элементу массива структур), присвоить свой указатель.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//------------------------------Глобальные переменные для обмена данными между модулями----------------------------------//
/*************************************************************************************************************************/
    
//--------------------Массивы сообщений FSM----------------//
state msg_uart[BUF_MSG_FSM]; //UART
state msg_key [BUF_MSG_FSM]; //KEY
state msg_lcd [BUF_MSG_FSM]; //LCD
state msg_tmp [BUF_MSG_FSM]; //
state msg_clk [BUF_MSG_FSM]; //
 
//----------------Типы данных для обмена между FSM---------------//
u8 dat_uart[2][BUFFER_SIZE]; // UART
u8 dat_key    [BUF_DAT_FSM]  // KEY
u8 dat_lcd    [BUF_DAT_FSM]; // LCD
u8 dat_tmp    [BUF_DAT_FSM]; //
struct DATA_TIME data_time;  //
    
//------------Массивы таймеров FSM---------//
struct TIMERS tim_uart[BUF_TIM_FSM]; //UART
struct TIMERS tim_key [BUF_TIM_FSM]; //KEY
struct TIMERS tim_lcd [BUF_TIM_FSM]; //LCD
struct TIMERS tim_tmp [BUF_TIM_FSM]; //
struct TIMERS tim_clk [BUF_TIM_FSM]; //
 
struct FSM_BASE all_fsm [FSM]= 
{
    {msg_uart, dat_uart,  tim_uart}, 
    {msg_key,  dat_key,   tim_key}, 
    {msg_lcd,  dat_lcd,   tim_lcd}, 
    {msg_tmp,  dat_tmp,   tim_tmp}, 
    {msg_clk, &data_time, tim_clk}
};
 
struct FSM_BASE *uart_fsm = &all_fsm[0];
struct FSM_BASE *key_fsm  = &all_fsm[1];
struct FSM_BASE *lcd_fsm  = &all_fsm[2];
struct FSM_BASE *tmp_fsm  = &all_fsm[3];
struct FSM_BASE *tim_fsm  = &all_fsm[4];
5). И вот теперь загвоздка, как мне в любом из модулей для конечного автомата (объекта), воспользоваться функцией передачи или чтения сообщения?

6). Параллельно всплыл ещё вопрос, как работать с двухмерным массивом в модуле объекта
когда в функцию необходимо передать указатель на первый элемент массива (не нулевой), и содержание нулевого элемента массива
C++
1
2
3
//---------------------------Функция передачи массива байта по UART----------------------------------------//
//---------------------------------------------------------------------------------------------------------//
s8 tx_Srting(const u8 *data, u8 size)
Простите возможно сумбурно и сложно, но вот как есть .
0
фрилансер
5504 / 5099 / 1048
Регистрация: 11.10.2019
Сообщений: 13,366
29.12.2019, 16:38 4
Цитата Сообщение от ProTV Посмотреть сообщение
5). И вот теперь загвоздка, как мне в любом из модулей для конечного автомата (объекта), воспользоваться функцией передачи или чтения сообщения?
видимо, так
C
1
2
3
4
send_Message(lcd_fsm->message,BUF_TIM_FSM);
get_Message(lcd_fsm->message,BUF_TIM_FSM);
 
tx_Srting(lcd_fsm->data,BUF_TIM_FSM);
доступ к элементу по индексу
lcd_fsm->data[1];
0
0 / 0 / 0
Регистрация: 29.12.2019
Сообщений: 4
30.12.2019, 01:43  [ТС] 5
Спасибо за ответы.

Решил пока частично вернутся к старому "стилю", передаю указатель на структуру в функции а там его уже разбираю на необходимые элементы.
Возможно понимание придёт чуть позже .

Открытый вопрос (пункт 5):

Функция передачи строки должна принять указатель на первый элемент массива, и содержимое нулевого элемента (в нём содержится колличество байт для передачи).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//---------------------------Функция передачи массива байта по UART----------------------------------------//
//---------------------------------------------------------------------------------------------------------//
s8 tx_Srting(const u8 *data, u8 size)
{
    u8 i = put_String_rBuf(&tx_Buf, data, size);
    
    if (!i)
    {
        PORTD |= (1<<2);                     //Переключить RS485 на передачу
        _delay_us(5);                        //Задержка для переключения микросхемы драйвера
        UCSR0B |= (1<<UDRIE0) | (1<<TXCIE0);
    }
    
    return i;
}
Есть указатель
C++
1
struct FSM_BASE *uart_fsm = &all_fsm[0];
на всё ту же структуру
C++
1
2
3
4
5
6
7
//Структура данных базовый конечный автомат
struct FSM_BASE                   
{
    volatile u8            *message;  //Указатель на массив сообщений FSM
    volatile void          *data;     //Указатель на данные FSM
    volatile struct TIMERS *tim;      //Указатель на массив таймеров FSM
};
Поле "void *data;", которой про инициализировано именем созданного двумерного массива
C++
1
u8 dat_uart[2][BUFFER_SIZE]; // UART
Пытаюсь передать необходимые аргументы функции следующим образом (хочу передать dat_uart[1][0]
C++
1
tx_Srting((u8*)uart_fsm->data, *((u8*)uart_fsm->data) + 1);
Предупреждений и ошибок от компилятора нет, но в итоге - не работает.

Добавлено через 25 минут
Методом "Втыка" разобрался
Для передачи в функцию необходимых параметров нулевого массива необходимо
C++
1
tx_Srting(((u8*)uart_fsm->data) + 1, *((u8*)uart_fsm->data));
Вот теперь думаю, как передать параметры первого массива?
Вопрос в адресной арифметике указателей двумерного массива .

Добавлено через 22 минуты
Вот так будет правильно?
C++
1
tx_Srting(((u8*)uart_fsm->data+1) + 1, *((u8*)uart_fsm->data+1));
0
фрилансер
5504 / 5099 / 1048
Регистрация: 11.10.2019
Сообщений: 13,366
30.12.2019, 09:15 6
ProTV, предлагаю следующую схему:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
struct DATA_TIME
{
    int value_in_timer;
};
struct TIMERS
{
    int value_in_TIMERS;
};
 
//константы
enum{BUFFER_SIZE=1000};
enum{BUF_MSG_FSM=51};
enum{BUF_TIM_FSM=52};
enum{FSM        =53};
 
//алиасы
typedef u8 td_dat_uart[2][BUFFER_SIZE];
typedef u8 td_dat_xxxx[BUFFER_SIZE];
typedef u8 td_messages[BUF_MSG_FSM];
typedef struct TIMERS td_timers[BUF_TIM_FSM];
 
//Структура данных базовый конечный автомат
struct FSM_BASE
{
    td_messages* messages; //Указатель на массив сообщений FSM
    td_dat_uart* dat_uart; //Указатель на данные FSM
    td_dat_xxxx* dat_xxxx; //Указатель на данные FSM
    td_timers  * timers  ; //Указатель на массив таймеров FSM
    struct DATA_TIME* data_time;//
};
 
//------------------------------Глобальные переменные для обмена данными между модулями----------------------------------//
/*************************************************************************************************************************/
 
//--------------------Массивы сообщений FSM----------------//
state td_messages msg_uart; //UART
state td_messages msg_key ; //KEY
state td_messages msg_lcd ; //LCD
state td_messages msg_tmp ; //
state td_messages msg_clk ; //
 
//----------------Типы данных для обмена между FSM---------------//
td_dat_uart      dat_uart ; // UART
td_dat_xxxx      dat_key  ; // KEY
td_dat_xxxx      dat_lcd  ; // LCD
td_dat_xxxx      dat_tmp  ; //
struct DATA_TIME data_time; //
 
//------------Массивы таймеров FSM---------//
td_timers tim_uart; //UART
td_timers tim_key ; //KEY
td_timers tim_lcd ; //LCD
td_timers tim_tmp ; //
td_timers tim_clk ; //
 
struct FSM_BASE all_fsm[FSM]=
{
    {&msg_uart, &dat_uart, 0        , &tim_uart ,0         },
    {&msg_key , 0        , &dat_key , &tim_key  ,0         },
    {&msg_lcd , 0        , &dat_lcd , &tim_lcd  ,0         },
    {&msg_tmp , 0        , &dat_tmp , &tim_tmp  ,0         },
    {&msg_clk , 0        , 0        , &tim_clk  ,&data_time},
};
 
struct FSM_BASE* uart_fsm = &all_fsm[0];
struct FSM_BASE* key_fsm  = &all_fsm[1];
struct FSM_BASE* lcd_fsm  = &all_fsm[2];
struct FSM_BASE* tmp_fsm  = &all_fsm[3];
struct FSM_BASE* tim_fsm  = &all_fsm[4];
 
void func(struct FSM_BASE* p)
{
    if(p->messages)
    {
        (*(p->messages))[11]=0x00;//[BUF_MSG_FSM]
    }
 
    if(p->dat_uart)
    {
        (*(p->dat_uart))[1][11]=0x00;//[2][BUFFER_SIZE]
    }
 
    if(p->dat_xxxx)
    {
        (*(p->dat_xxxx))[11]=0x00;//[BUFFER_SIZE]
    }
 
    if(p->timers)
    {
        (*(p->timers))[11].value_in_TIMERS=0;//[BUF_TIM_FSM]
    }
 
    if(p->data_time)
    {
        (*p->data_time).value_in_timer=1;
    }
}
вызов функции
C
1
func(lcd_fsm);
можешь дополнительные параметры в функцию нарисовать, если нужно
0
0 / 0 / 0
Регистрация: 29.12.2019
Сообщений: 4
31.12.2019, 18:31  [ТС] 7
Добрый вечер, поздравляю всех с наступающим Новым Годом!

При разработке проекта (на мк Atmega 8), за основу было взято цикл статей Татарчесвкого об автоматном программировании
http://www.kit-e.ru/articles/c... 11_164.php

В статьях содержатся примеры реализации на псевдокоде.
Собственно попытался создать чуть более универсализированую версию .

Во вложении рабочие наброски (Atmel Studio 7).
Буду признателен за критику.
Вложения
Тип файла: rar switch-tech-new.rar (225.2 Кб, 1 просмотров)
0
31.12.2019, 18:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2019, 18:31
Помогаю со студенческими работами здесь

Сортировка структуры по полю double
Доброе утро! Написал программу.. вот: #include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include...

Быстрая сортировка структуры по одному полю
Задача такова: Составить программу, в которой будет таблица, которая будет выводится после...

Каким образом получить доступ к полю i через указатель ptr?
Дан код: struct K {int i, char a;}; struct K *ptr; struct K a1={8,”abcdefg”}; ptr=&amp;a1;

Можно ли присвоить случайное значение (rand), полю символьному структуры, состоящему из N элементов?
Здравствуйте, возник один вопросик. Можно ли присвоить случайное значение (rand), полю символьному...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru