Подскажите, кто знает, ответ на такой вопрос.
В моем проекте два С-блока. Из одного блока программно вызывается другой, а глобальные переменные, которые используют оба блока определены в файле глобальных переменных на панели-тексте.
Почему-то в в каждом С-блоке создаются свои копии переменных, чтобы я не делал, ни satic ни extern не помогают.
Связь между блоками
А для чего тогда вкладка "Панель-текст"?
Каким образом объявить глобальные переменные на языке С.
Ведь очень неудобно создавать сложные структуры визуально.
А если мне нужно объявить массив структур, я даже не смогу воспользоваться диррективой #define, например,
struct A {
int Name1;
int Name2;
};
struct ArrStruct[10];
Я могу сделать #define для ArrStruct, но как обраться к элементам
Name1 и Name2?
Каким образом объявить глобальные переменные на языке С.
Ведь очень неудобно создавать сложные структуры визуально.
А если мне нужно объявить массив структур, я даже не смогу воспользоваться диррективой #define, например,
struct A {
int Name1;
int Name2;
};
struct ArrStruct[10];
Я могу сделать #define для ArrStruct, но как обраться к элементам
Name1 и Name2?
VictorP
Вкладка "Панель-текст" используется только для директив
#define.
Глобальные переменные объявляются только во вкладке "Панель".
Сложные структуры создавать неудобно но можно.
Если я правильно понял, то не struct ArrStruct[10] a A [10];
На самом деле Разработчик создает массив так:
struct arr_type {
A ArrData[10];
WORD Counts[1]; // 1- одна размерность.
} arr_var;
Так что можно например сделать:
#define Name1_3 arr_var.ArrData[3].Name1
Изучите что генерирует Разработчик в h-файле(в каталоге вывода), тогда будет понятно
как писать #define.
#define.
Глобальные переменные объявляются только во вкладке "Панель".
Сложные структуры создавать неудобно но можно.
Если я правильно понял, то не struct ArrStruct[10] a A [10];
На самом деле Разработчик создает массив так:
struct arr_type {
A ArrData[10];
WORD Counts[1]; // 1- одна размерность.
} arr_var;
Так что можно например сделать:
#define Name1_3 arr_var.ArrData[3].Name1
Изучите что генерирует Разработчик в h-файле(в каталоге вывода), тогда будет понятно
как писать #define.
Да я немного ошибся при написании примера.
Конечно массив структур объявляется так:
struct A ArrStruct[10];
Но в примере #define Name1_3 arr_var.ArrData[3].Name1
индекс массива присутствует в #define, что по понятным причинам, бессмысленно. Если делать отдельные #define для массива и элементов структуры, тогда зачем вообще она нужна. Видимо, в разработчике не поддерживаются такие объявления, хотя я изучал, что он генерит и в файле глобальных переменных есть все мои структуры и их объявления. По видимому, при компиляции, разработчик "проглатывает" объявления extern, ведь по всем законам С все должно работать правильно.
Конечно массив структур объявляется так:
struct A ArrStruct[10];
Но в примере #define Name1_3 arr_var.ArrData[3].Name1
индекс массива присутствует в #define, что по понятным причинам, бессмысленно. Если делать отдельные #define для массива и элементов структуры, тогда зачем вообще она нужна. Видимо, в разработчике не поддерживаются такие объявления, хотя я изучал, что он генерит и в файле глобальных переменных есть все мои структуры и их объявления. По видимому, при компиляции, разработчик "проглатывает" объявления extern, ведь по всем законам С все должно работать правильно.
Итак, вы кладете на панель массив , в него структруру из 2х элементов WORD. Устанавливаете у него макс кол-во эл-тов 10.
Разработчик генерит (файл глобальных переменных еее):
в h-файле (eee.h):
typedef struct {
WORD DDataItem1;
WORD DDataItem2;
} eee_DDataItem0;
typedef struct {
eee_DDataItem0 ArrData[10];
WORD Counts [1];
} eee_DGlobItem0;
typedef struct {
eee_DGlobItem0 DGlobItem0;
} struct_eee;
extern struct_eee eee;
в с-файле(_global.c):
struct_eee eee;
на панели-текст объявляете макрос:
#define ArrItem eee.DGlobItem0.ArrData
Тогда в с-тексте чтобы обратиться к 1-му элементу структуры по 5-му индексу массива нужно написать:
ArrItem[5].DDataItem1 = 1;
Поменять DDataItem1 на Name1 нельзя.
Хотя можно сделать еще так:
на "панели-текст" определить макрос:
#define Name1(x) eee.DGlobItem0.ArrData[x].Name1
тогда в с-тексте предыдущий пример выглядит так:
Name1(5) = 1;
Это все, что можно выжать из Разработчика.
Повторюсь, на "Панели-текст" определять переменные нельзя.
Разработчик генерит (файл глобальных переменных еее):
в h-файле (eee.h):
typedef struct {
WORD DDataItem1;
WORD DDataItem2;
} eee_DDataItem0;
typedef struct {
eee_DDataItem0 ArrData[10];
WORD Counts [1];
} eee_DGlobItem0;
typedef struct {
eee_DGlobItem0 DGlobItem0;
} struct_eee;
extern struct_eee eee;
в с-файле(_global.c):
struct_eee eee;
на панели-текст объявляете макрос:
#define ArrItem eee.DGlobItem0.ArrData
Тогда в с-тексте чтобы обратиться к 1-му элементу структуры по 5-му индексу массива нужно написать:
ArrItem[5].DDataItem1 = 1;
Поменять DDataItem1 на Name1 нельзя.
Хотя можно сделать еще так:
на "панели-текст" определить макрос:
#define Name1(x) eee.DGlobItem0.ArrData[x].Name1
тогда в с-тексте предыдущий пример выглядит так:
Name1(5) = 1;
Это все, что можно выжать из Разработчика.
Повторюсь, на "Панели-текст" определять переменные нельзя.