artemkad 149 February 20, 2025 Posted February 20, 2025 · Report post 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 из проекта. Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 February 20, 2025 Posted February 20, 2025 · Report post 2 часа назад, sunjob сказал: по моему не прокатит Почему не прокатит? В пределах одной единицы трансляции у компилятора есть вся информация чтобы автоматически посчитать NUM и положить его в память. В других единицах он будет доступен так же как адрес массива. Имея адрес массива, тип его элементов и их количество можно всё что надо делать. Зачем помещать в массив индекс его элементов, если вы всё равно по индексу обращаетесь и знаете с каким элементом работаете? Quote Share this post Link to post Share on other sites More sharing options...
sunjob 1 February 21, 2025 Posted February 21, 2025 · Report post 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 я предпочитаю использовать жесткую прописку размерности (во вс.случае пока идет отладка/запуск библиотеки) Quote Share this post Link to post Share on other sites More sharing options...
EdgeAligned 136 February 21, 2025 Posted February 21, 2025 · Report post Возможно, здесь стоит разобраться вообще с принципами построения кода, с иерархией программы, понятиями модульности, логики вызовов? В языке Си модуль - функционально законченная единица. Реализация функционала - в файле *.с, интерфейс модуля - в файле *.h. Взаимодействие с модулем - через его интерфейс. Этот подход позволяет отделить внутренние функциии и данные модуля от внешних и не допустить случайных ошибок использования. То, что написал автор вопроса, это какая-то каша непонятного замеса. Её сложно будет контролировать. Наваливать кучу указателей на функции, а потом вызывать их в цикле последовательно - какой в этом смысл? Разбивка на функции должна быть логичной, функционально законченной. То есть, например функция int Sum(int a, int b) суммирует два элемента, она логически закончена и может вызываться там, где нужно именно просуммировать эти два элемента. Её бессмысленно вызывать в цикле внавалку с другими функциями. Ну, в общем, прежде чем писать кучу бессмысленного кода, надо разобраться с принципами построения кода. Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 February 21, 2025 Posted February 21, 2025 · Report post 2 часа назад, sunjob сказал: я предпочитаю использовать жесткую прописку размерности Тогда #define NUM 100500 в заголовочном файле и extern datastruct lst[] в модуле где будете использовать массив. ЧТО ВЫЗЫВАЕТ ПРОБЛЕМУ? Quote Share this post Link to post Share on other sites More sharing options...
EdgeAligned 136 February 21, 2025 Posted February 21, 2025 (edited) · Report post 2 часа назад, sunjob сказал: во втором данные, которые используется именно в библиотеке.. Да нивапрос. Файл data.c static int data[] = { ....,...,...,.. } int ReadData(int index) { retutn data[index]; } Файл daha.h int ReadData(int index); И ReadData вызывайте в том месте, где нужно получить данные. А все эти последовательные вызовы функций в цикле - эт какая-то каша без особого смысла. Тут нужно разбираться именно с основами построения, иерархии, связей. А не лепить сразу же какие-то структуры и циклы. Edited February 21, 2025 by EdgeAligned Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 February 21, 2025 Posted February 21, 2025 · Report post Хочет человек функции из библиотеки по номеру вызывать, а не по имени. Имеет на это право. Quote Share this post Link to post Share on other sites More sharing options...
EdgeAligned 136 February 21, 2025 Posted February 21, 2025 (edited) · Report post Право то имеет, но это создаст путаницу, усложнит поддержку, внесение изменений. Если просто переставить две функции местами, то получится ошибка, которую визуально не так то просто будет отыскать. Да и вообще, функции, они ведь не однотипные, они могут иметь разное число входных параметров и разный возвращаемый тип. Повторюсь, тут вместо написания каких-то бессмысленных структур с указателями на функции нужно вначале разобраться с принципами компоновки, построения, иерархии программы, с принципами модульности. А вот может кто-нибудь из вас объяснить, какой глубинный смысл заложен вот в этом участке: for(uint8_t i=0; i<3; i++) { if(lst[i]->func != NULL) { lst[i]->func(i); } } СМЫСЛ какой? Вот в том и вопрос, что тут надо вначале изучить принципы построения программ в целом Edited February 21, 2025 by EdgeAligned Quote Share this post Link to post Share on other sites More sharing options...
artemkad 149 February 21, 2025 Posted February 21, 2025 · Report post 3 часа назад, sunjob сказал: ну все же именно так: - в одном модуле - бибилотека с обвесом - во втором данные, которые используется именно в библиотеке... (она и написана для того, что-бы работать с этими данными), что не так? (возможно, я что-то не так обьясняю?!) :о) Ну так зачем 2 модуля? Сделайте один модуль, но разделенный на 2 файла. Просто файл с данными включите include - ом в файл библиотеки. Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 February 21, 2025 Posted February 21, 2025 · Report post Да какая разница? В одном модуле данные (менюшки, допустим, нарисованы), а в другом движок эти менюшки отрисовывающий. Ну или не менюшки, а командный автомат какой-нибудь. Автор не описал задачу. Как не описал и что вызвало проблему, а мы тут гадаем... Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 February 21, 2025 Posted February 21, 2025 · Report post 4 часа назад, sunjob сказал: возможно, я что-то не так обьясняю Объясните, зачем вы создаёте массив указателей на структуры? Они же однотипны по сути и всё равно в памяти лежат. Если в проекте планируется их сделать разного типа, то "Хьюстон, у нас проблема" у вас ещё только впереди. 1 час назад, EdgeAligned сказал: СМЫСЛ какой? Это всего лишь ТЕСТОВЫЙ код. В реальном проекте будет откуда-то извне приходить команда "запусти функцию №X". Легко, мой хороший, if(lst[x]->func != NULL) lst[x]->func(x); Это я уже за автора сценарии придумываю, хотелось бы не гадать, а из первоисточника услышать. Quote Share this post Link to post Share on other sites More sharing options...
sunjob 1 February 21, 2025 Posted February 21, 2025 · Report post 43 minutes ago, VladislavS said: Автор не описал задачу. Как не описал и что вызвало проблему, как мог описал! спасибо что сапогами не забрасываете! :о) Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 February 21, 2025 Posted February 21, 2025 · Report post Ну правда, вы показываете рабочий код и просите каких-то советов. Что не так то? Quote Share this post Link to post Share on other sites More sharing options...
sunjob 1 February 21, 2025 Posted February 21, 2025 (edited) · Report post 5 minutes ago, VladislavS said: Это я уже за автора сценарии придумываю, хотелось бы не гадать, а из первоисточника услышать. это точно! :о) еще раз: как мог так описал, за что не велите казнить!!! если что, попробуйте 1. еще раз прочитать топик 2. посмотреть шаблон проекта 3. совместить 1е со 2м... если не получается, пожалуйста, отавьте это гиблое дело, я по ходу добью вопрос, если интересно, выложу решение, вот тогда и поржем вместе! :о) вот тогда и понакидаете мне помидоров. договорились? :о))) Edited February 21, 2025 by sunjob Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 February 21, 2025 Posted February 21, 2025 · Report post 49 минут назад, sunjob сказал: если что, попробуйте Ну, попробовал. Так задумано? Quote Share this post Link to post Share on other sites More sharing options...