Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Соединить несколько списков в один в С. / 11 сообщений из 11, страница 1 из 1
12.07.2020, 11:55
    #39978590
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
Есть объект сенсор.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
typedef struct
{
    uint8_t connection;  //0-local, 1-can, 2-rs485, 3-lan
    uint8_t type;        //sensor type
    uint8_t val_type;    //temperature, humidity, etc.
    int8_t state;       //ok, error
    
    GPIO_TypeDef * port; //for local connection
    uint32_t pin;             //for local connection
    uint32_t address       //for local connection

    uint32_t id;  //for remote connection
    
    float value;
}SENSOR;


И для каждой шины я создаю массив объектов (список) CAN, RS485 и локальная. Также я создаю общий список.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SENSOR can_sensors[32];
SENSOR rs485_sensors[32];
SENSOR loc_sensors[32];

SENSOR all_sensors[256];

uint32_t can_sens_count;
uint32_t rs485_sens_count;
uint32_t loc_sens_count;
uint32_t all_sens_count;



Теперь я инициализирую списки.
Код: plaintext
1.
2.
CAN_DiscoverSensors(can_sensors, &can_sens_count);
RS485_DiscoverSensors(rs485_sensors, &rs485_sens_count);



Я могу их соединить просто копируя?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void SENS_AddToListAll(void)
{
   all_sens_count = 0;
   
   memcpy (all_sensors+all_sens_count, can_sensors, can_sens_count * sizeof(SENSOR)); 
   all_sens_count += can_sens_count;
   
   memcpy (all_sensors+all_sens_count, rs485_sensors, rs485_sens_count * sizeof(SENSOR)); 
   all_sens_count += rs485_sens_count; 
   
   memcpy (all_sensors+all_sens_count, loc_sensors, loc_sens_count * sizeof(SENSOR)); 
   all_sens_count += loc_sens_count; 
}
...
Рейтинг: 0 / 0
12.07.2020, 12:07
    #39978593
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
У тебя POD-структуры , поэтому можно копировать memcpy()

Только непонятно зачем копирование если можно сразу писать в общий массив
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SENSOR all_sensors[256];
SENSOR *p = all_sensors;
uint32_t can_sens_count, rs485_sens_count;
CAN_DiscoverSensors(p, &can_sens_count);
p += can_sens_count;
RS485_DiscoverSensors(p, &rs485_sens_count);
p += rs485_sens_count;
...
...
Рейтинг: 0 / 0
12.07.2020, 12:11
    #39978594
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
Dima T
У тебя POD-структуры , поэтому можно копировать memcpy()

Только непонятно зачем копирование если можно сразу писать в общий массив
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SENSOR all_sensors[256];
SENSOR *p = all_sensors;
uint32_t can_sens_count, rs485_sens_count;
CAN_DiscoverSensors(p, &can_sens_count);
p += can_sens_count;
RS485_DiscoverSensors(p, &rs485_sens_count);
p += rs485_sens_count;
...


так удобнее. допустим на шину RS485 добавили пару сенсоров. тогда надо сделать заново
Код: plaintext
1.
RS485_DiscoverSensors(rs485_sensors, &rs485_sens_count);


и сделать рефреш на общий список
Код: plaintext
1.
SENS_AddToListAll();
...
Рейтинг: 0 / 0
12.07.2020, 12:13
    #39978596
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
Тогда копируй
...
Рейтинг: 0 / 0
12.07.2020, 12:22
    #39978599
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
Dima T
Тогда копируй

спасибо
...
Рейтинг: 0 / 0
12.07.2020, 12:57
    #39978605
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
jenya7,

а если использовать структуру данных Multidimensional Array, то ничего копировать не придется
...
Рейтинг: 0 / 0
12.07.2020, 13:32
    #39978613
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
mini.weblab
jenya7,

а если использовать структуру данных Multidimensional Array, то ничего копировать не придется

вопрос как определить второй dimension. списки могут меняться, сегодня добавили пару сенсоров завтра убрали.
...
Рейтинг: 0 / 0
12.07.2020, 18:38
    #39978687
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
jenya7,

вы же определили размер массива для разных типов сенсоров

Код: plaintext
1.
SENSOR can_sensors[32];


а здесь будет
Код: plaintext
1.
SENSOR all_sensors[3][32]; // 3 строки, 32 столбца
...
Рейтинг: 0 / 0
13.07.2020, 00:48
    #39978751
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
sensors.h
Код: plaintext
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.
#ifndef SENSORS_H
#define SENSORS_H
#define NUM_OF_TYPES 4
#define MAXNUM 32

typedef enum {LOCAL, CAN, RS, LAN} SensorType;
typedef enum {OFF, ON, DUMMY} SensorStatus;

typedef struct {
	SensorType stype;
	SensorStatus status;
	float value;
} SENSOR;

SENSOR loc_sensors[MAXNUM];
SENSOR can_sensors[MAXNUM];
SENSOR rs_sensors[MAXNUM];
SENSOR lan_sensors[MAXNUM];

// Initialize group of sensors
SENSOR *SensorGroupInit(SENSOR s[MAXNUM], SensorType type);
// Display all sensors
void display_sensors(SENSOR **s);
// Display group of sensors
void display_group(SENSOR *s);

#endif



sensors.c
Код: plaintext
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.
#include <stdio.h>
#include "sensors.h"

SENSOR *SensorGroupInit(SENSOR s[MAXNUM], SensorType type) {
	for (int i = 0; i < MAXNUM; i++) {
		s[i].stype = type;
		s[i].status = DUMMY;
		s[i].value = 0;
	}
	return s;
}

void display_group(SENSOR *s) {
	for (short i = 0; i < MAXNUM; i++) {
		printf("Sensor id: %-4d type: %-4d status %-4d value %.2f\n",
				i, s[i].stype, s[i].status, s[i].value);
	}
}

void display_sensors(SENSOR **s) {
	for (SensorType type = LOCAL; type <= LAN; type++) {
		printf("\nSensors of type: %d:\n", type);
		for (short j = 0; j < MAXNUM; j++) {
			printf("Sensor id: %-4d status: %-4d value: %.2f\n",
					j, s[type][j].status, s[type][j].value);
		}
	}
}



main.c
Код: plaintext
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.
#include <stdio.h>
#include "sensors.h"

int main(void) {
	SENSOR *loc = SensorGroupInit(loc_sensors, LOCAL);
	SENSOR *can = SensorGroupInit(can_sensors, CAN);
	SENSOR *rs = SensorGroupInit(rs_sensors, RS);
	SENSOR *lan = SensorGroupInit(lan_sensors, LAN);

	SENSOR *sensors[4] = {
			loc_sensors,
			can_sensors,
			rs_sensors,
			lan_sensors
	};

	// Display all sensors on the sensor board
	printf("\nDisplaying all sensors:\n");
	display_sensors(sensors);

	// Display sensors by group
	printf("\nDisplaying sensors by group.\n");
	// LOCAL
	printf("\nDisplaying LOCAL sensors:\n");
	display_group(loc);
	// CAN
	printf("\nDisplaying CAN sensors:\n");
	display_group(can);
	// RS
	printf("\nDisplaying RS sensors:\n");
	display_group(rs);
        // LAN
        printf("\nDisplaying LAN sensors:\n");
        display_group(lan);

	return 0;
}

...
Рейтинг: 0 / 0
13.07.2020, 09:26
    #39978793
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
mini.weblab
jenya7,

вы же определили размер массива для разных типов сенсоров

Код: plaintext
1.
SENSOR can_sensors[32];


а здесь будет
Код: plaintext
1.
SENSOR all_sensors[3][32]; // 3 строки, 32 столбца


да но если all_sensors[3][32]; заполнены частично то будут дырки. я же хочу дать пользователю единый список чтоб он обратился по абсолютному индексу. скажем он пишет в терминале "sensor get 7" и получает all_sensors[7].value. ему не нужно ломать голову в какой группе какой индекс выбрать. предварительно он может получить список всех сенсоров "sensor list", так он знает какой сенсор по какому индексу.
...
Рейтинг: 0 / 0
13.07.2020, 13:53
    #39978957
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить несколько списков в один в С.
jenya7,

проблема в том, что приложение использует в 3 раза больше памяти, чем ему на самом деле нужно.
дальше, это уже вам решать, подходит вам такое или нет.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Соединить несколько списков в один в С. / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]