Начальная инициализация "динамических" структур. как обычно это делается?

Тема в разделе "Флудилка", создана пользователем Igor68, 19 янв 2022.

  1. Igor68

    Igor68 Гуру

    Доброго времени суток! Речь идёт не об этом:
    devcpp_4.pdf
    тут всё ясно, в плане того, что изменение размера происходит в процессе работы программы.
    Я о другом:
    ...в самом начале работы программы, исходя из её входных параметров, задаются размерности данных в структуре. Вот как пример:
    Код (C++):

    //структура 0
    typedef struct {
        int32_t   cnums;       //количество входов
        int32_t   cnt;             //текущий счётчик указатель на вход
        float       in[cnums];   //значения входов
        float       kin[cnums]; //множитель на каждый вход
        float       y;                //выход элемента
    } ELEMENT;

    //структура 1
    typedef struct {
         int32_t  nums;          //общее количество элементов
         int32_t  cnt;              //текущий указатель на элемент
         ELEMENT el[nums]; //набор элементов
    } DEV;
     
    одним словом при запуске программы задаются параметры nums и cnums в каждой их структур.
    Этот пример не рабочий, а только для наглядности.
    Можно конечно выделять память (malloc) да ещё и массив организовать и обращаться к нему как к элементам структуры и структуры в структуре и т.д.
    Но как обычно это делается не прибегая конкретно к devcpp_4.pdf ?
     

    Вложения:

    • devcpp_4.pdf
      Размер файла:
      836,7 КБ
      Просмотров:
      237
  2. shabronov

    shabronov Нерд

    Уважаемы Igor68 Чисто "академический" интерес по "структуре". Вопрос так поставил, что бы ответ только 0(да) 1(нет)
    - программу надо уменьшить в размерах конечного кода ?
    - ................................................................ ............... текста?
    - ............................................................... занимаемой оперативной памяти при загрузке?
    - ................................................................занимаемой подгружаемой оперативной памяти в работе?
     
  3. Igor68

    Igor68 Гуру

    Доброго времени суток!
    - программу уменьшать не надо.
    - про текст ничего не понял.
    ....
    уточняю... код при загрузке конфигурируется с помощью параметров запуска в консоли. Код может работать на разных платформах и прочее. Ему надо быть "разным" по размеру в разных местах. Доступ к структуре из функций произвольный (номер элемента, номер входа элемента, весовой коэффицент входа элемента, значение на выходе элемента и пр). далее входы каждого элемента могут быть программно соединены (или по сети) с аналогичной программой (либо дублю локально, либо по сети с программой на другом устройстве).
    Это эксперимент - могу конечно вообще через массив (тупо, не удобно, и геморройно) с набором промежуточных функций для извлечения и занесения. Смысл в том, что размерность может быть разной при необходимости для каждого экземпляра.

    ЗЫ: Это, конечно громко сказано, опыт со слоями нейросети... там и количество нейронов может быть разным, и конфигурация связи у каждого разная, и весовые коэффицены и функция активации. Надо сделать что-то вроде массива динамических структур(хоть и динамические но в процессе работы не меняются) внутри динамической структуры.
     
  4. Igor68

    Igor68 Гуру

    Вот что змий зелёный, животворящий с людьми делает;)
     
  5. shabronov

    shabronov Нерд

    Уважаемый Igor68 "Академический" интерес по "структуре" угас. Это не задача, а проблема. Платформы разные, подходы будут тоже разные. Это как голосовая (телефонная) связь через телефонисток, коммутацию каналов или коммутацию сообщений. Вам успехов и здоровья.
     
  6. Igor68

    Igor68 Гуру

    Доброго времени суток!
    У меня только эксперимент... опыт (лабораторный) так сказать. Будет ли это применено - не знаю.
    По поводу платформ: разные устройства(ARM/Cortex, x86/64) с Linux на борту...
    Именно на Raspberry сейчас и происходит опыт.

    Спасибо.
    По поводу опыта... ведь надо когда-то делать, что хотел испытать. Думал о нём ещё в 1996г., но делать было не на чем... вообще... от слова совсем.
     
  7. Igor68

    Igor68 Гуру

    Не вижу иных возможностей кроме применения разделяемой памяти, сразу оговорюсь что это ещё и для взаимодействия между разными процессами.
    Думаю входное параметры должны ещё ещё и имя файла в /dev/shm. В плане того, что одна структура имеет фиксированный размер со ссылкой на ряд файлов-масивов/структур сформированных функциями инициализации и все они в /dev/shm. конечно это громоздко, но иного пути я не вижу... да и не подсказал никто.

    Просьба!
    Эту тему надо удалить - обычного решения вопроса нет!
     
    Последнее редактирование: 20 янв 2022
  8. b707

    b707 Гуру

    а чем вариант с malloc() то не подошел?
     
  9. DetSimen

    DetSimen Гуру

    еще new есть. всегда им пользуюсь, он типизированный
     
    Igor68 нравится это.
  10. Igor68

    Igor68 Гуру

    "new" мне знаком...
    "malloc" не сработал пока - пробую, но смотрю в сторону не разделяемой памяти... нейронный слой (параметры, включая размерность, задаются во входных параметрах) должен ещё и обслуживаться "клиентом" и "сервером", а они совсем отдельные процессы. Структура нужна и без неё никак. Но она должна быть доступна и другим. Ведь там кроме весов, входов и выходов есть ещё и значения кто с кем соединён... и не только локально, но и по сокетам в сети.
    Эксперимент практически в самом начале. по поводу "new", если на малине(малинах) то одно дело, а вот другие GCC (MOXA) не знаю - умеют ли. На MOXA даже семафор(мютекс) в опытах с разделяемой памятью не прокатывают - не умеют. Пришлось делать самодельный семафор(псевдо - методом проверок).
     
  11. b707

    b707 Гуру

    new и malloc по сути одно и то же, new внутри себя использует malloc
    И new и malloc есть на любом GCC, так как это фундаментальные конструкции языка, а не свойство платформы

    То что, что у вас malloc не работает - это ненормально, скорее всего вы просто не разобрались.
     
  12. SergeiL

    SergeiL Оракул Модератор

    new - появился в C++
    malloc - был и в древнем Си. Использовал его еще в конце 80-ых, на СМ1420 под UNIX.
     
  13. b707

    b707 Гуру

    ок, поправлюсь, malloc есть в любом компиляторе C, а new - а любом С++
    По остальному замечаний нет?
     
  14. SergeiL

    SergeiL Оракул Модератор

    Да и так не было замечаний, просто добавил. :)
     
  15. Igor68

    Igor68 Гуру

    Доброго времени суток!!!
    Странно как-то... два дня ждал ответа и решил применить другой вариант и попросил закрыть тему.
    Как вдруг толпа участников.... странно.
    Будь то malloc, которым пользуюсь постоянно или new, который не удалось применить в C, а в C++ нормально работает и к нему вопросов нет...
    Скажу одно: ориентируюсь на старый компилятор для MOXA UC-7112-Lx-Plus, т.е. если на нём не собирается и/или не работает, то такой код выбраковывается, невзирая на то, что на малине и/или PC всё отлично. Применяю Си без плюсов - привычка, за что прошу прощения. Тут на форуме добрый человек мне дал исходники конверсии BMP->PNG на C++, которые я перепиливал в C(Си) что бы всё работало на UC-7112-LX-Plus... точнее компилятор их не собирал.
    Конечно тема не про комуникационный контроллер, но он будет принимать участия в опытах, несмотря на то что всё пилю на малине 4 в рам-диске. Если честно, то и ядро для AT91SAM9260-EK я собирал на той же малине, а ноут был как терминал SSH для малины.

    Теперь про овец: "весь вопрос в #1", чего зря повторять? Может пример какой кто покажет... чисто механизм... короткий.
    Что касается /dev/shm, то это для механизма связей между разными запущенными программами... ну и за одно решил им обойтись дабы упростить задачу коли организовать сам пока не в состоянии.

    ЗЫ: и простите, если что грубое сказал.
     
  16. b707

    b707 Гуру

    я не вижу там конкретного вопроса, если честно, поэтому и не стал отвечать.
    Есть какой-то код, который, как оговаривается, не имеет отношения к задаче, а "только для примера".
    И вопрос, как обычно выделяется динамическая память для структур без использования malloc() ? - никак, по-моему
     
  17. Igor68

    Igor68 Гуру

    А это?
    Код (C++):
    //структура 0
    typedef struct {
        int32_t   cnums;       //количество входов
        int32_t   cnt;             //текущий счётчик указатель на вход
        float       in[cnums];   //значения входов
        float       kin[cnums]; //множитель на каждый вход
        float       y;                //выход элемента
    } ELEMENT;

    //структура 1
    typedef struct {
         int32_t  nums;          //общее количество элементов
         int32_t  cnt;              //текущий указатель на элемент
         ELEMENT el[nums]; //набор элементов
    } DEV;
    в структуре 1 хотя бы
    Код (C++):
     ELEMENT el[nums]; //набор элементов
    где в этой же структуре:
    Код (C++):
    int32_t  nums;          //общее количество элементов
    Я знаю, что так нельзя, потому на самом деле так:
    Код (C++):
    //структура 1
    typedef struct {
         int32_t  nums;          //общее количество элементов
         int32_t  cnt;              //текущий указатель на элемент
         ELEMENT *el;           //набор элементов
    } DEV;
    но параметр
    Код (C++):
    ELEMENT *el;           //набор элементов
    является указателем на "массив" из структур:
    Код (C++):
    //структура 0
    typedef struct {
        int32_t   cnums;       //количество входов
        int32_t   cnt;             //текущий счётчик указатель на вход
        float       in[cnums];   //значения входов
        float       kin[cnums]; //множитель на каждый вход
        float       y;                //выход элемента
    } ELEMENT;
    которая тоже неправильно описана, а только для понимания и на самом деле надо так:
    Код (C++):
    //структура 0
    typedef struct {
        int32_t   cnums;       //количество входов
        int32_t   cnt;             //текущий счётчик указатель на вход
        float       *in;   //значения входов
        float       *kin; //множитель на каждый вход
        float       y;                //выход элемента
    } ELEMENT;
    В результате имеем в структуре 0 указатель на толпу структур 1, в которой есть несколько массивов переменного размера. Задача определять размерность структур исходя из входных параметров запускаемой программы и формировать эти структуры.
    функцию malloc применяю, компилится успешно но запуск выдаёт ошибку сегментации... что и логично.
    Код пока не буду выкладывать - стыдно за корявость.
     
  18. b707

    b707 Гуру

    я знаю как это делается через классы и шаблоны, но если вы используете только Си...
    Вариант 1 - Нужно описать конструктор для класса. который будет создавать динамические массивы и присваивать указатели на них полям структуры. Нужный размер массива должен быть параметром конструктора.
    вариант 2 - использовать внутри структур _не_динамические_ массивы, а размер задавать через шаблон
     
  19. Igor68

    Igor68 Гуру

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

    Igor68 Гуру

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