Как динамично создать и считать структуры в C?

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

Сначала можно использовать окно визуализации для создания запроса рабочего элемента в пользовательском интерфейсе веб-портала.

Например, как показано ниже:

enter image description here

Затем сохраните запрос и откройте запрос в Visual Studio. Или вы можете использовать какое-то 3-стороннее расширение, такое как это - Wiql Editor

Он будет напрямую переводить запрос рабочего элемента на язык WIQL. Например, WIQL указанного выше запроса должен быть:

enter image description here

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

[System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward'

blockquote>

6
задан user94405 22 April 2009 в 15:05
поделиться

3 ответа

Фактически демонстрирует код эта работа в C слишком сложна для поста SO. Но объяснить основную концепцию выполнимо.

Здесь вы действительно создаете шаблонную систему пакетов свойств. Единственное, что вам понадобится для продолжения работы, - это некоторая ассоциативная структура, такая как хеш-таблица. Я бы сказал, пойти с std :: map, но вы упомянули, что это было решение только для C Ради обсуждения я просто собираюсь предположить, что у вас есть какая-то хеш-таблица.

Вызов «create_struct» должен будет вернуть структуру, которая содержит указатель на хеш-таблицу, что делает const char * практически равным size_t. Эта карта определяет, что вам нужно для создания нового экземпляра структуры.

Метод «insance», по существу, создаст новую хеш-таблицу с таким же количеством членов, что и в хеш-таблице шаблона. Давайте на секунду выбросим ленивое измышление и предположим, что вы создали всех участников заранее. Метод должен будет зацикливаться на хеш-таблице шаблона, добавляя элемент для каждой записи и malloc'ing кусок памяти указанного размера.

Реализация instance_get_member просто сделает поиск по карте по имени. Хотя подпись и модель использования должны будут измениться. C не поддерживает шаблоны и должен выбрать общий тип возврата, который может представлять все данные. В этом случае вам нужно будет выбрать void * , поскольку именно так будет необходимо хранить память.

void* instance_get_member(any_struct_instance* inst, const char* name);

Вы можете сделать это немного лучше, добавив макрос envil для имитации шаблонов

#define instance_get_member2(inst, name, type) \
  *((type*)instance_get_member((inst),(name)))
...
int i = instance_get_member2(pInst,"a", int);
6
ответ дан 17 December 2019 в 00:14
поделиться

You ' Мы дошли до того, что определили проблему, и все, что осталось, это немного (немного сложно в некоторых частях) реализации. Вам просто нужно отслеживать информацию:

typedef struct {
    fieldType type;
    char      name[NAMEMAX];
    /* anything else */
} meta_struct_field;
typedef struct {
    unsigned          num_fields;
    meta_struct_field *fields;
    /* anything else */
} meta_struct;

Затем create_struct () выделяет память для meta_struct и инициализирует ее в 0, а add_struct_member () делает alloc () / realloc () для my_struct.fields и увеличение my_struct.num_fields . Остальное следует в том же духе.

Вам также потребуется объединение в meta_struct_field для хранения фактических значений в экземплярах.

1
ответ дан 17 December 2019 в 00:14
поделиться

Я делал это давным-давно.

То, как я это сделал, было сгенерировать код, содержащий определение структуры, плюс все процедуры для доступа к нему, а затем скомпилировать и связать его с DLL "на лету", затем динамически загружайте эту DLL.

0
ответ дан 17 December 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: