с, структура/данные/наполнение, как оптимизировать?!

Модератор: Модераторы разделов

Аватара пользователя
sunjob
Сообщения: 504

с, структура/данные/наполнение, как оптимизировать?!

Сообщение sunjob »

день добрый, товарищи колдуны! :о)

краткое строение проекта:

Код: Выделить всё

- struct.x      - описание структуры, массив/список данных/структур, функции работы со структурой/списком.
- struct_cust.x - кастомные данные, создание экземпляров структуры, добавление в "список"
некоторые неудобства:

Код: Выделить всё

- наполнение данных/добавление в "список" происходит в реализации/struct_cust.с
- установка счетчика списка в хедере/struct_cust.h
по другому не получилось "реализовать", хотелось бы все логично/в одном месте:

Код: Выделить всё

- создание данных/добавление в список
- определение/установка счетчика
какие есть мнение/идеи/хаки-каки итд?!

Код: Выделить всё

- linux, gcc, c-pure
спасиб

main.c

Код: Выделить всё

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include "main.h"
#include "struct.h"

int main (void)
{
printf("### struct ###\n");
struct_list();
return 0;
}
struct.h

Код: Выделить всё

struct data_struct 
{
uint8_t num;
void  (*func)(uint8_t id);
};

void struct_list(void);
struct.c

Код: Выделить всё

#include "struct.h"
#include "struct_cust.h"

struct data_struct * lst[NUM];

void struct_list()
{
printf("struct_list()\n");

for(uint8_t i=0; i<NUM; i++)
  {
  printf("lst[%u].num = %u; ",i, lst[i]->num);
  if(lst[i]->func != NULL)  { lst[i]->func(i); }
  printf("\n");
  }
}
struct_cust.h

Код: Выделить всё

#define NUM 3
void struct_cust_func(uint8_t id);
struct_cust.c

Код: Выделить всё

#include "struct.h"
#include "struct_cust.h"

struct data_struct data1 = { .num = 1, .func = struct_cust_func };
struct data_struct data2 = { .num = 2, };// .func = struct_cust_func };
struct data_struct data3 = { .num = 3, .func = struct_cust_func };

extern struct data_struct * lst[NUM];
       struct data_struct * lst[NUM] = { &data1, &data2, &data3 };

void struct_cust_func(uint8_t id)
{
printf("struct_cust_func(%u)", id);
}
makefile

Код: Выделить всё

all: main.o struct.o struct_cust.o
	gcc -o main main.o struct.o struct_cust.o

main.o: main.c
	gcc -c main.c

struct.o: struct.c
	gcc -c struct.c

struct_cust.o: struct_cust.c
	gcc -c struct_cust.c

clean:
	rm -f *.o main
main out

Код: Выделить всё

### struct ###
struct_list()
lst[0].num = 1; struct_cust_func(0)
lst[1].num = 2;
lst[2].num = 3; struct_cust_func(2)
struct_multi_file.txz
У вас нет необходимых прав для просмотра вложений в этом сообщении.
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21180
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: с, структура/данные/наполнение, как оптимизировать?!

Сообщение Bizdelnick »

  1. Зачем глобальные переменные? Ими не нужно пользоваться без крайней необходимости. В struct_list передавайте массив и его размер аргументами.
  2. Нарушена логика разбиения на модули, взаимозависимостей между ними следует избегать. Не надо подключать struct_cust.h из struct.c.
  3. Объявления extern стоит выносить в заголовочник. Впрочем, если избавитесь от глобальных переменных, оно станет не нужно.
  4. Макросы — зло, вместо них лучше использовать типизированные константы. Но, опять-таки, без глобального lst и глобальный NUM будет не нужен.
  5. В Makefile не стоит хардкодить команды сборки, чтобы можно было задать опции переменными без правки файла. В данном случае вообще достаточно встроенных неявных правил, надо только определить зависимости:

    Код: Выделить всё

    main: struct.o struct_cust.o
    По крайней мере, для GNU make этого хватит.
    Если имя исполняемого файла не совпадает с именем одного из модулей, правило для линковки надо определить явно:

    Код: Выделить всё

    structtest: main.o struct.o struct_cust.o
    	$(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) $(LDLIBS)
    
  6. Имя цели в Makefile должно совпадать с именем создаваемого файла. Если хотите задать цель all, делайте её зависимой от собираемых файлов, а правило для её сборки не задавайте.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 504

Re: с, структура/данные/наполнение, как оптимизировать?!

Сообщение sunjob »

ну то-есть вы очень хорошо и дотошно разобрались в "теме" и готовы показать как надо? тогда, спецом для этого, я приложил архив с "проектом" для быстрого прототипирования! буду безгранично благодарен в разумных пределах! :о)
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21180
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: с, структура/данные/наполнение, как оптимизировать?!

Сообщение Bizdelnick »

sunjob писал(а):
20.02.2025 13:01
готовы показать как надо?
Я готов объяснить как надо, что и сделал. Готов пояснить оставшееся непонятным. Готов прокомментировать сделанные Вами исправления.
sunjob писал(а):
20.02.2025 13:01
приложил архив с "проектом" для быстрого прототипирования! буду безгранично благодарен в разумных пределах! :о)
За 100$ благодарности могу и это, хотя считаю непродуктивным.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 504

Re: с, структура/данные/наполнение, как оптимизировать?!

Сообщение sunjob »

вот и славно, вот и хорошо, вот и поговорили.
сэкономим наши кошельки и ваши безграничные желания. :crazy:
многозначительное спасибо!
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 504

Re: с, структура/данные/наполнение, как оптимизировать?!

Сообщение sunjob »

от пустых кошелькоф :crazy:
struct_multi_file.3.txz
У вас нет необходимых прав для просмотра вложений в этом сообщении.
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали: