Связь между блоками

Общие вопросы по оборудованию и программному обеспечению Компании ДЭП
Виктор
Сообщения: 2
Зарегистрирован: 14 авг 2005, 11:26
Откуда: Дубна

Сообщение Виктор » 14 авг 2005, 11:33

Подскажите, кто знает, ответ на такой вопрос.
В моем проекте два С-блока. Из одного блока программно вызывается другой, а глобальные переменные, которые используют оба блока определены в файле глобальных переменных на панели-тексте.
Почему-то в в каждом С-блоке создаются свои копии переменных, чтобы я не делал, ни satic ни extern не помогают.
VictorP

Равиль
Сообщения: 58
Зарегистрирован: 08 фев 2005, 14:48

Сообщение Равиль » 15 авг 2005, 14:43

Объявлять глобальные переменные можно только во вкладке "Панель".

Виктор
Сообщения: 2
Зарегистрирован: 14 авг 2005, 11:26
Откуда: Дубна

Сообщение Виктор » 18 авг 2005, 12:25

А для чего тогда вкладка "Панель-текст"?
Каким образом объявить глобальные переменные на языке С.
Ведь очень неудобно создавать сложные структуры визуально.
А если мне нужно объявить массив структур, я даже не смогу воспользоваться диррективой #define, например,

struct A {
int Name1;
int Name2;
};

struct ArrStruct[10];

Я могу сделать #define для ArrStruct, но как обраться к элементам
Name1 и Name2?
VictorP

Равиль
Сообщения: 58
Зарегистрирован: 08 фев 2005, 14:48

Сообщение Равиль » 18 авг 2005, 15:56

Вкладка "Панель-текст" используется только для директив
#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.

Гость

Сообщение Гость » 18 авг 2005, 16:47

Да я немного ошибся при написании примера.
Конечно массив структур объявляется так:

struct A ArrStruct[10];

Но в примере #define Name1_3 arr_var.ArrData[3].Name1
индекс массива присутствует в #define, что по понятным причинам, бессмысленно. Если делать отдельные #define для массива и элементов структуры, тогда зачем вообще она нужна. Видимо, в разработчике не поддерживаются такие объявления, хотя я изучал, что он генерит и в файле глобальных переменных есть все мои структуры и их объявления. По видимому, при компиляции, разработчик "проглатывает" объявления extern, ведь по всем законам С все должно работать правильно.

Равиль
Сообщения: 58
Зарегистрирован: 08 фев 2005, 14:48

Сообщение Равиль » 19 авг 2005, 16:50

Итак, вы кладете на панель массив , в него структруру из 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;

Это все, что можно выжать из Разработчика.
Повторюсь, на "Панели-текст" определять переменные нельзя.