Jump to content
    

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

1 час назад, sunjob сказал:

очень даже не лишний: разделение на библиотеку и данные

код посмотрю обязательно, отпишусь позже 

 

По сути это вариация на эту тему:

 

1 час назад, sunjob сказал:

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

Да там все просто - обычный #define / #undef  #include плюс выбор нужной части файла по #ifdef

1 час назад, sunjob сказал:

разделение на библиотеку и данные

Так в том-то и дело, что вы там не данные объявляете т.к. с ними в том файле не работаете. У вас там объявление данных которые используются в другом файле.

ЗЫ. Кстати, а что мешало сделать тупо #include "struct_cust.c" в файле struct.c ?

Типа так:

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

struct data_struct * lst[NUM];

#include "struct_cust.c"


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

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

? Естественно, исключив struct_cust.c из проекта.

Share this post


Link to post
Share on other sites

2 часа назад, sunjob сказал:

по моему не прокатит

Почему не прокатит? В пределах одной единицы трансляции у компилятора есть вся информация чтобы автоматически посчитать  NUM и положить его в память. В других единицах он будет доступен так же как адрес массива. Имея адрес массива, тип его элементов и их количество можно всё что надо делать.

Зачем помещать в массив индекс его элементов, если вы всё равно по индексу обращаетесь и знаете с каким элементом работаете?

 

Share this post


Link to post
Share on other sites

13 hours ago, artemkad said:

сделать тупо #include "struct_cust.c"

это не правильный подход :о)

12 hours ago, VladislavS said:

Зачем помещать в массив индекс его элементов

это не индекс, это "эмуляция каких-либо данных"... :о)

13 hours ago, artemkad said:

У вас там объявление данных которые используются в другом файле

ну все же именно так: 

- в одном модуле - бибилотека с обвесом

- во втором данные, которые используется именно в библиотеке... (она и написана для того, что-бы работать с этими данными), что не так?

(возможно, я что-то не так обьясняю?!) :о)

12 hours ago, VladislavS said:

чтобы автоматически посчитать  NUM

я предпочитаю использовать жесткую прописку размерности (во вс.случае пока идет отладка/запуск библиотеки)

Share this post


Link to post
Share on other sites

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

В языке Си модуль - функционально законченная единица. Реализация функционала - в файле *.с, интерфейс модуля - в файле *.h. Взаимодействие с модулем - через его интерфейс. Этот подход позволяет отделить внутренние функциии и данные модуля от внешних и не допустить случайных ошибок использования.

То, что написал автор вопроса, это какая-то каша непонятного замеса. Её сложно будет контролировать. Наваливать кучу указателей на функции, а потом вызывать их в цикле последовательно - какой в этом смысл? Разбивка на функции должна быть логичной, функционально законченной.
То есть, например функция int Sum(int a, int b) суммирует два элемента, она логически закончена и может вызываться там, где нужно именно просуммировать эти два элемента. Её бессмысленно вызывать в цикле внавалку с другими функциями.

Ну, в общем, прежде чем писать кучу бессмысленного кода, надо разобраться с принципами построения кода.

Share this post


Link to post
Share on other sites

2 часа назад, sunjob сказал:

я предпочитаю использовать жесткую прописку размерности

Тогда #define NUM 100500 в заголовочном файле и extern datastruct lst[] в модуле где будете использовать массив. ЧТО ВЫЗЫВАЕТ ПРОБЛЕМУ? 

Share this post


Link to post
Share on other sites

2 часа назад, sunjob сказал:

во втором данные, которые используется именно в библиотеке..

Да нивапрос.

Файл data.c

static int data[] = { ....,...,...,.. }
int ReadData(int index) { retutn data[index]; }
Файл daha.h

int ReadData(int index);

И ReadData вызывайте в том месте, где нужно получить данные.

А все эти последовательные вызовы функций в цикле - эт какая-то каша без особого смысла. Тут нужно разбираться именно с основами построения, иерархии, связей. А не лепить сразу же какие-то структуры и циклы.

Edited by EdgeAligned

Share this post


Link to post
Share on other sites

Право то имеет, но это создаст путаницу, усложнит поддержку, внесение изменений. Если просто переставить две функции местами, то получится ошибка, которую визуально не так то просто будет отыскать. Да и вообще, функции, они ведь не однотипные, они могут иметь разное число входных параметров и разный возвращаемый тип. 

Повторюсь, тут вместо написания каких-то бессмысленных структур с указателями на функции нужно вначале разобраться с принципами компоновки, построения, иерархии программы, с принципами модульности.

А вот может кто-нибудь из вас объяснить, какой глубинный смысл заложен вот в этом участке:

for(uint8_t i=0; i<3; i++)
  {

  if(lst[i]->func != NULL)  { lst[i]->func(i); }

  }

СМЫСЛ какой? 
Вот в том и вопрос, что тут надо вначале изучить принципы построения программ в целом

Edited by EdgeAligned

Share this post


Link to post
Share on other sites

3 часа назад, sunjob сказал:

ну все же именно так: 

- в одном модуле - бибилотека с обвесом

- во втором данные, которые используется именно в библиотеке... (она и написана для того, что-бы работать с этими данными), что не так?

(возможно, я что-то не так обьясняю?!) :о)

Ну так зачем 2 модуля? Сделайте один модуль, но разделенный на 2 файла. Просто файл с данными включите include - ом в файл библиотеки.

Share this post


Link to post
Share on other sites

Да какая разница? В одном модуле данные (менюшки, допустим, нарисованы), а в другом движок эти менюшки отрисовывающий. Ну или не менюшки, а командный автомат какой-нибудь. Автор не описал задачу. Как не описал и что вызвало проблему, а мы тут гадаем...

 

Share this post


Link to post
Share on other sites

4 часа назад, sunjob сказал:

возможно, я что-то не так обьясняю

Объясните, зачем вы создаёте массив указателей на структуры? Они же однотипны по сути и всё равно в памяти лежат. Если в проекте планируется их сделать разного типа, то "Хьюстон, у нас проблема" у вас ещё только впереди.

1 час назад, EdgeAligned сказал:

СМЫСЛ какой?

Это всего лишь ТЕСТОВЫЙ код. В реальном проекте будет откуда-то извне приходить команда "запусти функцию №X". Легко, мой хороший,  if(lst[x]->func != NULL) lst[x]->func(x);

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

 

Share this post


Link to post
Share on other sites

43 minutes ago, VladislavS said:

Автор не описал задачу. Как не описал и что вызвало проблему,

как мог описал! спасибо что сапогами не забрасываете! :о)

Share this post


Link to post
Share on other sites

5 minutes ago, VladislavS said:

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

 

это точно! :о)

еще раз: как мог так описал, за что не велите казнить!!!

если что, попробуйте

1. еще раз прочитать топик

2. посмотреть шаблон проекта

3. совместить 1е со 2м... 

 

если не получается, пожалуйста, отавьте это гиблое дело, я по ходу добью вопрос, если интересно, выложу решение, вот тогда и поржем вместе! :о)

вот тогда и понакидаете мне помидоров. договорились? :о)))

Edited by sunjob

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...