powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Соединить несколько списков в один в С.
11 сообщений из 11, страница 1 из 1
Соединить несколько списков в один в С.
    #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
Соединить несколько списков в один в С.
    #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
Соединить несколько списков в один в С.
    #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
Соединить несколько списков в один в С.
    #39978596
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда копируй
...
Рейтинг: 0 / 0
Соединить несколько списков в один в С.
    #39978599
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Тогда копируй

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

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

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

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

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

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


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

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


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