Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 69

Объявление и определение глобального массива структуры

08.01.2016, 19:57. Показов 3443. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть структура

C++
1
2
3
4
5
6
struct DatSob
{
    int year;  // Год события
    int month; // Месяц события
    int day;   // день события
} mas[500];
И есть несколько переменных
C++
1
2
int a;
int b;
Нужно, чтобы таких структур было создано 500 шт.
И... нужно к ним обращаться из других форм билдера.

Прога у меня компилится, но, как я понял, статично (т.е. внутри своего файла). А нужно, чтобы все это было связано. Т.е. глобально... Посоветуйте как?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2016, 19:57
Ответы с готовыми решениями:

Объявление и определение глобального массива структур. Доступ к нему из любого cpp. Как?
Вот такая тема. Есть файл BazaOfProgram.h //--------------------------------------------------------------------------- ...

Объявление глобального массива (размерности и элементы известны заранее)
Столкнулся с такой задачей: есть два массива real по 10 элементов каждый. И они будут использоваться во вложенных подпрограммах...

Объявление глобального объекта класса
Есть RecTrans.h #include "StdAfx.h" #pragma once using namespace System; public value class RecTrans { private: String^ ...

19
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
09.01.2016, 03:58
Как вариант: в хедере пропиши структуру и прототип функции:
C++
1
2
3
4
5
6
7
8
struct DatSob
{
    int year;  // Год события
    int month; // Месяц события
    int day;   // день события
};
 
DatSob* getArrDatSob();
В .cpp - реализацию функции:
C++
1
2
3
4
5
DatSob* getArrDatSob()
{
    static DatSob mas[500];
    return mas;
}
Там, где нужен доступ к этому массиву, подключай хедер, и, через вызов функции, получай доступ к массиву:
C++
1
2
3
    getArrDatSob()[0].year = 2016;
    getArrDatSob()[0].month = 1;
    getArrDatSob()[0].day = 9;
1
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 69
09.01.2016, 12:26  [ТС]
Спасибо! только один момент... Если у меня форм много.... Это не важно, что реализация функции будет только в файле 1.cpp? Или... мне нужно будет реализовывать эту же функцию и в других 2.cpp и 3.cpp?
И еще... там есть еще парочку не структурных переменных... На доступ к ним я тоже должен в хеадере прописать прототип функции на их получение и в одном из cpp прописывать реализацию? А других cpp?

Как-то сложно здесь реализуются такие простые понятия как глобальные переменные.

В любом случае спасибо! Просто так я не думал (таким способом реализовывать). В любом случае щас буду экспериментировать. Но! Буду очень благодарен, если вы сможете найти еще чуть чуть для меня времени для моих уточняющих вопросов. =) Спасибо!

Добавлено через 1 час 24 минуты
Дополнение.
Провел пару экспериментов.
Описал всё как в образце. Не видит массив.
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
09.01.2016, 12:51
На счет функции:
1) хедер во все формы, в которых собираешься с этой функцией работать
2) достаточно 1 реализации в любом .cpp, но static тогда нужно убрать (оно ограничивает область видимости до одного файла)

На счет переменных:
1) В каждом .cpp в котором собираешься использовать общую для всех .cpp глобальную переменную объявляешь ее (только объявляешь!!!) перед ее использованием
C++
1
 exter int x;
2) В одном из .cpp ее нужно определить:
C++
1
int x;    //теперь все ок, x видно на все .cpp
Само собой это касается глобальных переменных, которые находятся вне функций, классов и др.
1
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 69
09.01.2016, 13:10  [ТС]
А статик надо будет заменить на паблик?
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
09.01.2016, 13:12
нет, просто убери статик, если хочешь, чтоб функцией могли пользоваться все .cpp
вообще не плохо было б, если б ты код скинул)
0
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 69
09.01.2016, 13:20  [ТС]
Окей=) Только... чур не смеяться=) Я всего неделю в этом деле залипаю=)

Программа будет создавать события на какую-нибудь дату. Потом напоминать об этом событии.

Да... я тут начал делать изменения, согласно вашим рекомендациям... Само собой... еще не везде все тут поправил. Поэтому переменные щас не особо совпадают.

unit 1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include File1.h
#include "Unit1.h"
#include "Unit2.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CCALENDR"
#pragma link "CSPIN"
#pragma resource "*.dfm"
TFormMain *FormMain;
 
DatSob* getArrDatSob()
{
    static DatSob mas[500];
    return mas;
}
 
 Mainfile* getArrMainfile()
{
    static Mainfile info;
    return info;
}
 
getArrDatSob()[0].year
 
 
//---------------------------------------------------------------------------
 
__fastcall TFormMain::TFormMain(TComponent* Owner)
        : TForm(Owner)
{
 
 
}
//---------------------------------------------------------------------------
 
 
 
 // Эксперементальная кнопка.--------------получение дат и перевод их в форму-------------------------------------------
 void __fastcall TFormMain::SpeedButton4Click(TObject *Sender)
{
  MonthCalendar1->Date=Date(); // В календаре – текущая дата.
                               // dd.mm.yyyy
  DayOfWeekLabel->Caption=FormatDateTime("dd", Date());
  CSpinEdit7->Value=StrToInt(DayOfWeekLabel->Caption);
}
 
 
//Функция добавления нового объекта в массив---------------------------------------------------------------------------
void __fastcall TFormMain::SpeedButton1Click(TObject *Sender)
{
     //info.mas[1].line1
    // info.___items
      FormMain->Action;
    NewElement->Edit1_->Text="";
 
    NewElement->Left=FormMain->Left+50;
    NewElement->Top=FormMain->Top+50;
 
    FormMain->Enabled=false;
              
    FormMain->La_______l13->Caption = info.___items;
     //--
}
 
 
//Выделение объекта в списке событий listbox1. Выбор события-----------------
void __fastcall TFormMain::ListBox1Click(TObject *Sender)
{
 
 
         // определение номера
      info.indx            = ListBox1->ItemIndex; //          ListBox1->ItemIndex - Номер обекта выделеный в поле ListBox1
        Edit4->Text        = info.mas[info.indx].line1;
 
 
 
 
 
 
        GroupBox2->Caption = "Настройки - "+info.mas[info.indx].line1;
 
 
 
 
        L_____15->Caption="Номер соб. - "+IntToStr(info.indx);
}
//---------------------------------------------------------------------------
 
 
void __fastcall TFormMain::SpeedButton5Click(TObject *Sender)
{
 
        //
        info.mas[info.indx].line1=Edit4->Text;
        GroupBox2->Caption = "Настройки - "+info.mas[info.indx].line1;
 
        if  (Edit4->Text==info.mas[info.indx].line1) { SpeedButton1->Enabled=false; }
 
      // изменение данных в ListBox1 ==================================
 
         ListBox1->Items->Strings[info.indx] =  info.mas[info.indx].line1;
 
      //===========================
 
 
}
//---------------------------------------------------------------------------
unit 2.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include File1.h
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TNewElement *NewElement;
extern mainfile info;
extern DatSob mas [500];
//---------------------------------------------------------------------------
 
 
 
__fastcall TNewElement::TNewElement(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TNewElement::SpeedButton1Click(TObject *Sender)
{
      ///  NewElement->GroupBox1
      //  FormMain->GroupBox1
 
   // Ввод данных в массив при  ==================================
      if (NewElement->Edit1_->Text!="")
      {
 
      info.mas[info.___items].line1=Edit1_->Text; //Добавление нового события в массив данных.
 
 
      info.___items=info.___items+1;   //Перевод счетчика на 1. (переход к следующему событию)
      FormMain->La_______l13->Caption = info.___items;
 
       }
 
      // Вывод данных в ListBox1 ==================================
 
 
                      FormMain->ListBox1->Items->Add(info.mas[info.___items].line1);    //Добавление нового элемента в листбокс. Цикл до 500 событий.
 
 
      //===========================
 
      NewElement->Left=-2000;
      FormMain->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TNewElement::SpeedButton2Click(TObject *Sender)
{
    NewElement->Left=-2000;
    FormMain->Enabled=true;
 
}
//---------------------------------------------------------------------------
 
 
void __fastcall TNewElement::FormCreate(TObject *Sender)
{
NewElement->Left=-2000;
}
//---------------------------------------------------------------------------
File 1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
struct DatSob
        {
                int year;  // Год события
                int month; // Месяц события
                int day;   // день события
                int hors;  // час события
                int mins;  // минуты события
 
                int sizeX;  // Ширина окна
                int sizeY;  // Высота окна
                int posX;   // позиция окна  по горизонтале
                int posY;   // Ширина окна  по вертикале
 
 
                int year2;  // Год напоминания события - Не используется пока.
                int month2; // Месяц напоминания события
                int day2;   // день напоминания события
                int hors2;  // час напоминания события
                int mins2;  // минуты напоминания события
 
                unsigned char everychar; // Галка учитывания года. (вкл/выкл)
 
                unsigned char onpoint; // Галка дополнительного оповещения. (вкл/выкл)
                int hors3;             // Час напоминания события (вторично за день)
                int mins3;              // Минуты напоминания события (вторично за день)
 
                AnsiString line1;   // Имя события
                AnsiString line2;   // 1-ая строка сообщения
                AnsiString line3;   // 2-ая строка сообщения
                AnsiString line4;   // 3-ая строка сообщения
        };
 
  DatSob* getArrDatSob();
 
  struct Mainfile
        {
             DatSob mas [500];
             int  ___items; //количество событий (строк) счетчик
             int indx; // Индекс (номер) объекта.
        };
 
  Mainfile* getArrMainfile();
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
09.01.2016, 14:56
Цитата Сообщение от Lawliet1 Посмотреть сообщение
но static тогда нужно убрать (оно ограничивает область видимости до одного файла)
Не нужно static убирать, это не глобальная переменная со static, это локальный static, у него видимость тело функции, так и задумано, сама функция везде видна, где хедер подключен. Если его уберёшь, то при каждом вызове функции будет массив создаваться, а при выходе из функции - удаляться, а со static, только при первом вызове создаётся, и существует до конца программы.

Добавлено через 3 минуты
Цитата Сообщение от Brakses Посмотреть сообщение
Как-то сложно здесь реализуются такие простые понятия как глобальные переменные.
Недостаток глобальных переменных, что они отовсюду видны (поэтому советуют, при возможности, их избегать), а при таком способе, массив виден только в теле функции, а доступ к нему можно из любого места получить с помощью вызова функции (которая везде видна, где хедер подключен).
2
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
09.01.2016, 14:58
да, все верно... не то сказал...

P.S.: у него в программе эта функция отказывается работать напрочь, хотя я склепал маленький проект и у меня все ок...
1
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
09.01.2016, 15:00
Цитата Сообщение от Lawliet1 Посмотреть сообщение
хотя я склепал маленький проект и у меня все ок...
Да, и у меня всё ок... Не может оно не работать, если правильно всё делать.
0
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 69
09.01.2016, 15:04  [ТС]
Смотрите... Если я начинаю писать
в 1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
DatSob* getArrDatSob()
{
    DatSob mas[500];
    return mas;
}
 
 Mainfile* getArrMainfile()
{
    Mainfile info;
    return info;
}
а в File1.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  struct DatSob
        {
                int year;  // Год события
                int month; // Месяц события
                int day;   // день события
                int hors;  // час события
                int mins;  // минуты события
 
                int sizeX;  // Ширина окна
                int sizeY;  // Высота окна
                int posX;   // позиция окна  по горизонтале
                int posY;   // Ширина окна  по вертикале
 
 
                int year2;  // Год напоминания события - Не используется пока.
                int month2; // Месяц напоминания события
                int day2;   // день напоминания события
                int hors2;  // час напоминания события
                int mins2;  // минуты напоминания события
 
                unsigned char everychar; // Галка учитывания года. (вкл/выкл)
 
                unsigned char onpoint; // Галка дополнительного оповещения. (вкл/выкл)
                int hors3;             // Час напоминания события (вторично за день)
                int mins3;              // Минуты напоминания события (вторично за день)
 
                AnsiString line1;   // Имя события
                AnsiString line2;   // 1-ая строка сообщения
                AnsiString line3;   // 2-ая строка сообщения
                AnsiString line4;   // 3-ая строка сообщения
        };
 
  DatSob* getArrDatSob();
 
  struct Mainfile
        {
             DatSob mas [500];
             int  ___items; //количество событий (строк) счетчик
             int indx; // Индекс (номер) объекта.
        };
 
  Mainfile* getArrMainfile();

То, правильно я понимаю, что теперь из любого места (любого другого cpp) если я написал
C++
1
#include "File1.h"
то при вводе (вне функции)

getArrDatSob()[0]. - он, после точки, должен выдать мне список полей моей структуры?
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
09.01.2016, 15:11
Вот это что?
Цитата Сообщение от Brakses Посмотреть сообщение
getArrDatSob()[0].year
Вот это зачем?
Цитата Сообщение от Brakses Посмотреть сообщение
extern DatSob mas [500];
Не вижу вызова функции для доступа к массиву.

Добавлено через 2 минуты
Цитата Сообщение от Brakses Посмотреть сообщение
он, после точки, должен выдать мне список полей моей структуры?
Имеешь в виду подсказки в среде? Да.

Добавлено через 2 минуты
Это что за массив? Не слишком много у тебя DatSob mas[500]?
Цитата Сообщение от Brakses Посмотреть сообщение
struct Mainfile
* * * * {
* * * * * * *DatSob mas [500];
* * * * * * *int *___items; //количество событий (строк) счетчик
* * * * * * *int indx; // Индекс (номер) объекта.
* * * * };
1
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 69
09.01.2016, 15:12  [ТС]
Убираю лишнее. Это был мой способ реализовать глобальную структуру. Через другую структуру=) Уже это исправлено.
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
09.01.2016, 15:16
File1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <vcl.h>
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma link "CCALENDR"
#pragma link "CSPIN"
 
 
struct DatSob
        {
                int year;  // Год события
                int month; // Месяц события
                int day;   // день события
                int hors;  // час события
                int mins;  // минуты события
 
                int sizeX;  // Ширина окна
                int sizeY;  // Высота окна
                int posX;   // позиция окна  по горизонтале
                int posY;   // Ширина окна  по вертикале
 
 
                int year2;  // Год напоминания события - Не используется пока.
                int month2; // Месяц напоминания события
                int day2;   // день напоминания события
                int hors2;  // час напоминания события
                int mins2;  // минуты напоминания события
 
                unsigned char everychar; // Галка учитывания года. (вкл/выкл)
 
                unsigned char onpoint; // Галка дополнительного оповещения. (вкл/выкл)
                int hors3;             // Час напоминания события (вторично за день)
                int mins3;              // Минуты напоминания события (вторично за день)
 
                AnsiString line1;   // Имя события
                AnsiString line2;   // 1-ая строка сообщения
                AnsiString line3;   // 2-ая строка сообщения
                AnsiString line4;   // 3-ая строка сообщения
        };
 
  DatSob* getArrDatSob();
 
  struct Mainfile
        {
             DatSob mas [500];
             int  ___items; //количество событий (строк) счетчик
             int indx; // Индекс (номер) объекта.
        };
 
  Mainfile* getArrMainfile();
Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "File1.h"
 
TFormMain *FormMain;
 
DatSob* getArrDatSob()
{
    static DatSob mas[500];
    return mas;
}
 
 Mainfile* getArrMainfile()
{
    static Mainfile info;
    return &info;
}
 
getArrDatSob()[0].year = 2016;
 
 
//---------------------------------------------------------------------------
 
__fastcall TFormMain::TFormMain(TComponent* Owner)
        : TForm(Owner)
{
 
 
}
//---------------------------------------------------------------------------
 
 
 
 // Эксперементальная кнопка.--------------получение дат и перевод их в форму-------------------------------------------
 void __fastcall TFormMain::SpeedButton4Click(TObject *Sender)
{
  MonthCalendar1->Date=Date(); // В календаре – текущая дата.
                               // dd.mm.yyyy
  DayOfWeekLabel->Caption=FormatDateTime("dd", Date());
  CSpinEdit7->Value=StrToInt(DayOfWeekLabel->Caption);
}
 
 
//Функция добавления нового объекта в массив---------------------------------------------------------------------------
void __fastcall TFormMain::SpeedButton1Click(TObject *Sender)
{
     //info.mas[1].line1
    // info.___items
      FormMain->Action;
    NewElement->Edit1_->Text="";
 
    NewElement->Left=FormMain->Left+50;
    NewElement->Top=FormMain->Top+50;
 
    FormMain->Enabled=false;
              
    FormMain->La_______l13->Caption = info.___items;
     //--
}
 
 
//Выделение объекта в списке событий listbox1. Выбор события-----------------
void __fastcall TFormMain::ListBox1Click(TObject *Sender)
{
 
 
         // определение номера
      info.indx            = ListBox1->ItemIndex; //          ListBox1->ItemIndex - Номер обекта выделеный в поле ListBox1
        Edit4->Text        = info.mas[info.indx].line1;
 
 
 
 
 
 
        GroupBox2->Caption = "Настройки - "+info.mas[info.indx].line1;
 
 
 
 
        L_____15->Caption="Номер соб. - "+IntToStr(info.indx);
}
//---------------------------------------------------------------------------
 
 
void __fastcall TFormMain::SpeedButton5Click(TObject *Sender)
{
 
        //
        info.mas[info.indx].line1=Edit4->Text;
        GroupBox2->Caption = "Настройки - "+info.mas[info.indx].line1;
 
        if  (Edit4->Text==info.mas[info.indx].line1) { SpeedButton1->Enabled=false; }
 
      // изменение данных в ListBox1 ==================================
 
         ListBox1->Items->Strings[info.indx] =  info.mas[info.indx].line1;
 
      //===========================
 
 
}
//------------------------------------------
Unit2.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "File1.h"
 
TNewElement *NewElement;
//---------------------------------------------------------------------------
 
 
 
__fastcall TNewElement::TNewElement(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TNewElement::SpeedButton1Click(TObject *Sender)
{
      ///  NewElement->GroupBox1
      //  FormMain->GroupBox1
 
   // Ввод данных в массив при  ==================================
      if (NewElement->Edit1_->Text!="")
      {
 
      info.mas[info.___items].line1=Edit1_->Text; //Добавление нового события в массив данных.
 
 
      info.___items=info.___items+1;   //Перевод счетчика на 1. (переход к следующему событию)
      FormMain->La_______l13->Caption = info.___items;
 
       }
 
      // Вывод данных в ListBox1 ==================================
 
 
                      FormMain->ListBox1->Items->Add(info.mas[info.___items].line1);    //Добавление нового элемента в листбокс. Цикл до 500 событий.
 
 
      //===========================
 
      NewElement->Left=-2000;
      FormMain->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TNewElement::SpeedButton2Click(TObject *Sender)
{
    NewElement->Left=-2000;
    FormMain->Enabled=true;
 
}
//---------------------------------------------------------------------------
 
 
void __fastcall TNewElement::FormCreate(TObject *Sender)
{
NewElement->Left=-2000;
}
//---------------------------------------------------------------------------

nord_v, в Unit1.cpp строки 5 и 17 глянь... Unit2 можно вообще не трогать пока.. в 5 строке пишет ошибку: не удается перегрузить функции различаемые только по типу возвращаемого значения
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
09.01.2016, 15:26
Цитата Сообщение от Lawliet1 Посмотреть сообщение
и 17 глянь...
Я формы не знаю, может там так и можно, но в С++, в глобальной области нельзя функции вызывать. Зачем там этот вызов?
Цитата Сообщение от Lawliet1 Посмотреть сообщение
getArrDatSob()[0].year = 2016;
1
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 69
09.01.2016, 15:42  [ТС]
Это был эксперимент. Проверка... Подсказку не выдает =) т.е. имя полей не высвечивается. пробовал и внутри кнопок и форм и функций. Щас выложу поправленный код.
и сразу вопрос. Такая строчка вообще возможна? getArrDatSob()[getArrMainfile().indx].line1 ??
Я правильно понимаю, что с помощью данной функции я могу и изменять их значение и просто считывать?


Поправленный код, кроме обращений к глобальным переменным. Никак не могу просто вызвать список полей после точки, чтобы заменять их везде:

unit 1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include File1.h
#include "Unit1.h"
#include "Unit2.h"
 
 
#pragma package(smart_init)
#pragma link "CCALENDR"
#pragma link "CSPIN"
#pragma resource "*.dfm"
TFormMain *FormMain;
 
DatSob* getArrDatSob()
{
    static DatSob mas[500];
    return mas;
}
 
 Mainfile* getArrMainfile()
{
    static Mainfile info;
    return info;
}
 
 
 
 
//---------------------------------------------------------------------------
 
__fastcall TFormMain::TFormMain(TComponent* Owner)
        : TForm(Owner)
{
 
 
}
//---------------------------------------------------------------------------
 
 
 
 // Эксперементальная кнопка.--------------получение дат и перевод их в форму-------------------------------------------
 void __fastcall TFormMain::SpeedButton4Click(TObject *Sender)
{
  MonthCalendar1->Date=Date(); // В календаре – текущая дата.
                               // dd.mm.yyyy
  DayOfWeekLabel->Caption=FormatDateTime("dd", Date());
  CSpinEdit7->Value=StrToInt(DayOfWeekLabel->Caption);
}
 
 
//Функция добавления нового объекта в массив---------------------------------------------------------------------------
void __fastcall TFormMain::SpeedButton1Click(TObject *Sender)
{   //getArrMainfile()[0].___items
    //getArrDatSob()[0].line1
    // getArrMainfile()[0].indx
    //getArrDatSob()[getArrMainfile().indx].line1
    //
    FormMain->Action;
    NewElement->Edit1_->Text="";
 
    NewElement->Left=FormMain->Left+50;
    NewElement->Top=FormMain->Top+50;
 
    FormMain->Enabled=false;
              
    FormMain->La_______l13->Caption = info.___items;
     //--
}
 
 
//Выделение объекта в списке событий listbox1. Выбор события-----------------
void __fastcall TFormMain::ListBox1Click(TObject *Sender)
{
 
 
         // определение номера
        info.indx            = ListBox1->ItemIndex; //          ListBox1->ItemIndex - Номер обекта выделеный в поле ListBox1
        Edit4->Text        = info.mas[info.indx].line1;
 
 
 
 
 
 
        GroupBox2->Caption = "Настройки - "+info.mas[info.indx].line1;
 
 
 
 
        L_____15->Caption="Номер соб. - "+IntToStr(info.indx);
}
//---------------------------------------------------------------------------
 
 
void __fastcall TFormMain::SpeedButton5Click(TObject *Sender)
{
 
        //
        info.mas[info.indx].line1=Edit4->Text;
        GroupBox2->Caption = "Настройки - "+info.mas[info.indx].line1;
 
        if  (Edit4->Text==info.mas[info.indx].line1) { SpeedButton1->Enabled=false; }
 
      // изменение данных в ListBox1 ==================================
 
         ListBox1->Items->Strings[info.indx] =  info.mas[info.indx].line1;
 
      //===========================
 
 
}
//---------------------------------------------------------------------------
unit 2.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include File1.h
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TNewElement *NewElement;
 
//---------------------------------------------------------------------------
 
 
 
__fastcall TNewElement::TNewElement(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TNewElement::SpeedButton1Click(TObject *Sender)
{
      ///  NewElement->GroupBox1
      //  FormMain->GroupBox1
 
   // Ввод данных в массив при  ==================================
      if (NewElement->Edit1_->Text!="")
      {
 
      info.mas[info.___items].line1=Edit1_->Text; //Добавление нового события в массив данных.
 
 
      info.___items=info.___items+1;   //Перевод счетчика на 1. (переход к следующему событию)
      FormMain->La_______l13->Caption = info.___items;
 
       }
 
      // Вывод данных в ListBox1 ==================================
 
 
                      FormMain->ListBox1->Items->Add(info.mas[info.___items].line1);    //Добавление нового элемента в листбокс. Цикл до 500 событий.
 
 
      //===========================
 
      NewElement->Left=-2000;
      FormMain->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TNewElement::SpeedButton2Click(TObject *Sender)
{
    NewElement->Left=-2000;
    FormMain->Enabled=true;
 
}
//---------------------------------------------------------------------------
 
 
void __fastcall TNewElement::FormCreate(TObject *Sender)
{
NewElement->Left=-2000;
}
//---------------------------------------------------------------------------
File1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  struct DatSob
        {
                int year;  // Год события
                int month; // Месяц события
                int day;   // день события
                int hors;  // час события
                int mins;  // минуты события
 
                int sizeX;  // Ширина окна
                int sizeY;  // Высота окна
                int posX;   // позиция окна  по горизонтале
                int posY;   // Ширина окна  по вертикале
 
 
                int year2;  // Год напоминания события - Не используется пока.
                int month2; // Месяц напоминания события
                int day2;   // день напоминания события
                int hors2;  // час напоминания события
                int mins2;  // минуты напоминания события
 
                unsigned char everychar; // Галка учитывания года. (вкл/выкл)
 
                unsigned char onpoint; // Галка дополнительного оповещения. (вкл/выкл)
                int hors3;             // Час напоминания события (вторично за день)
                int mins3;              // Минуты напоминания события (вторично за день)
 
                AnsiString line1;   // Имя события
                AnsiString line2;   // 1-ая строка сообщения
                AnsiString line3;   // 2-ая строка сообщения
                AnsiString line4;   // 3-ая строка сообщения
        };
 
  DatSob* getArrDatSob();
 
  struct Mainfile
        {
 
             int  ___items; //количество событий (строк) счетчик
             int indx; // Индекс (номер) объекта.
        };
 
  Mainfile* getArrMainfile();
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
09.01.2016, 15:53
Цитата Сообщение от Brakses Посмотреть сообщение
Такая строчка вообще возможна? getArrDatSob()[getArrMainfile().indx].line1 ??
Возможна.
Цитата Сообщение от Brakses Посмотреть сообщение
Я правильно понимаю, что с помощью данной функции я могу и изменять их значение и просто считывать?
Правильно, получаешь указатель на начало массива, со всеми вытекающими.
Цитата Сообщение от Brakses Посмотреть сообщение
Никак не могу просто вызвать список полей после точки, чтобы заменять их везде:
Тут я не могу ничего подсказать, у тебя формы, и, как я понимаю, билдер? Ни того, ни другого не знаю (и не тянет).
1
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 69
09.01.2016, 16:47  [ТС]
Ну вот... я все переменные изменил. Вроде должно работать. Но... теперь не запускается вообще...

О, программисты=)! Есть ли еще советы как "оживить эту штуку"
Выкладываю код

unit 1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include File1.h
#include "Unit1.h"
#include "Unit2.h"
 
 
#pragma package(smart_init)
#pragma link "CCALENDR"
#pragma link "CSPIN"
#pragma resource "*.dfm"
TFormMain *FormMain;
 
DatSob* getArrDatSob()
{
    static DatSob mas[500];
    return mas;
}
 
 Mainfile* getArrMainfile()
{
    static Mainfile info;
    return info;
}
 
 
 
 
//---------------------------------------------------------------------------
 
__fastcall TFormMain::TFormMain(TComponent* Owner)
        : TForm(Owner)
{
 
 
}
//---------------------------------------------------------------------------
 
 
 
 // Эксперементальная кнопка.--------------получение дат и перевод их в форму-------------------------------------------
 void __fastcall TFormMain::SpeedButton4Click(TObject *Sender)
{
  MonthCalendar1->Date=Date(); // В календаре – текущая дата.
                               // dd.mm.yyyy
  DayOfWeekLabel->Caption=FormatDateTime("dd", Date());
  CSpinEdit7->Value=StrToInt(DayOfWeekLabel->Caption);
}
 
 
//Функция добавления нового объекта в массив---------------------------------------------------------------------------
void __fastcall TFormMain::SpeedButton1Click(TObject *Sender)
{   //getArrMainfile()[0].___items
    //getArrDatSob()[0].line1
    // getArrMainfile().indx
    //getArrDatSob()[getArrMainfile().indx].line1
    // getArrMainfile().___items
    FormMain->Action;
    NewElement->Edit1_->Text="";
 
    NewElement->Left=FormMain->Left+50;
    NewElement->Top=FormMain->Top+50;
 
    FormMain->Enabled=false;
              
    FormMain->La_______l13->Caption = getArrMainfile().___items;
     //--
}
 
 
//Выделение объекта в списке событий listbox1. Выбор события-----------------
void __fastcall TFormMain::ListBox1Click(TObject *Sender)
{
 
 
         // определение номера
        getArrMainfile().indx = ListBox1->ItemIndex; //          ListBox1->ItemIndex - Номер объекта выделеный в поле ListBox1
        Edit4->Text = getArrDatSob()[getArrMainfile().indx].line1;
 
 
 
 
 
 
        GroupBox2->Caption = "Настройки - "+getArrDatSob()[getArrMainfile().indx].line1;
 
 
 
 
        L_____15->Caption="Номер соб. - "+IntToStr(getArrMainfile().indx);
}
//---------------------------------------------------------------------------
 
 
void __fastcall TFormMain::SpeedButton5Click(TObject *Sender)
{
 
        //
        getArrDatSob()[getArrMainfile().indx].line1=Edit4->Text;
        GroupBox2->Caption = "Настройки - "+getArrDatSob()[getArrMainfile().indx].line1;
 
        if  (Edit4->Text==info.mas[getArrDatSob()[getArrMainfile().indx].line1) { SpeedButton1->Enabled=false; }
 
      // изменение данных в ListBox1 ==================================
 
         ListBox1->Items->Strings[info.indx] =  getArrDatSob()[getArrMainfile().indx].line1;
 
      //===========================
 
 
}
//---------------------------------------------------------------------------

unit 2.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include File1.h
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TNewElement *NewElement;
 
//---------------------------------------------------------------------------
 
    // getArrMainfile().indx
    //getArrDatSob()[getArrMainfile().indx].line1
    //
    // getArrDatSob()[getArrMainfile().___items].line1
__fastcall TNewElement::TNewElement(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TNewElement::SpeedButton1Click(TObject *Sender)
{
      ///  NewElement->GroupBox1
      //  FormMain->GroupBox1
 
   // Ввод данных в массив при  ==================================
      if (NewElement->Edit1_->Text!="")
      {
 
      getArrDatSob()[getArrMainfile().___items].line1=Edit1_->Text; //Добавление нового события в массив данных.
 
 
      getArrMainfile().___items=getArrMainfile().___items+1;   //Перевод счетчика на 1. (переход к следующему событию)
      FormMain->La_______l13->Caption = getArrMainfile().___items;
 
       }
 
      // Вывод данных в ListBox1 ==================================
 
 
                      FormMain->ListBox1->Items->Add(getArrDatSob()[getArrMainfile().___items].line1);    //Добавление нового элемента в листбокс. Цикл до 500 событий.
 
 
      //===========================
 
      NewElement->Left=-2000;
      FormMain->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TNewElement::SpeedButton2Click(TObject *Sender)
{
    NewElement->Left=-2000;
    FormMain->Enabled=true;
 
}
//---------------------------------------------------------------------------
 
 
void __fastcall TNewElement::FormCreate(TObject *Sender)
{
NewElement->Left=-2000;
}
//---------------------------------------------------------------------------

File 1.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <vcl.h>
#pragma hdrstop
 
  struct DatSob
        {
                int year;  // Год события
                int month; // Месяц события
                int day;   // день события
                int hors;  // час события
                int mins;  // минуты события
 
                int sizeX;  // Ширина окна
                int sizeY;  // Высота окна
                int posX;   // позиция окна  по горизонтале
                int posY;   // Ширина окна  по вертикале
 
 
                int year2;  // Год напоминания события - Не используется пока.
                int month2; // Месяц напоминания события
                int day2;   // день напоминания события
                int hors2;  // час напоминания события
                int mins2;  // минуты напоминания события
 
                unsigned char everychar; // Галка учитывания года. (вкл/выкл)
 
                unsigned char onpoint; // Галка дополнительного оповещения. (вкл/выкл)
                int hors3;             // Час напоминания события (вторично за день)
                int mins3;              // Минуты напоминания события (вторично за день)
 
                AnsiString line1;   // Имя события
                AnsiString line2;   // 1-ая строка сообщения
                AnsiString line3;   // 2-ая строка сообщения
                AnsiString line4;   // 3-ая строка сообщения
        };
 
  DatSob* getArrDatSob();
 
  struct Mainfile
        {
 
             int  ___items; //количество событий (строк) счетчик
             int indx; // Индекс (номер) объекта.
        };
 
  Mainfile* getArrMainfile();
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
09.01.2016, 16:54
Цитата Сообщение от Brakses Посмотреть сообщение
О, программисты=)! Есть ли еще советы как "оживить эту штуку"
Про билдер лучше там спрашивать (у него своя специфика): https://www.cyberforum.ru/cpp-builder/
1
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 69
09.01.2016, 18:14  [ТС]
Проблема решена! Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.01.2016, 18:14
Помогаю со студенческими работами здесь

Объявление глобального указателя всего проекта
Здравствуйте! Программа состоит из нескольких модулей. В одном из модулей написан класс, объект которого используется в других модулях. Как...

Совместите объявление и инициализацию структуры. После инициализации структуры выполните изменение ее полей с последующи
Написать программу структурного описания каталога одной книги. Программный код решения примера #include...

Объявление структуры
Я объявляю структуру так: typedef struct { BYTE aaa; BYTE bbb; short ccc; int ddd; }ABC; Нашёл один пример, где...

Объявление структуры
Поясните , пожалуйста, почему надо объявлять структуру перед main? Особенно в случаях, где она кроме как в main больше нигде не...

Объявление и определение функции
В учебнике такой код: void somefunction(int); int main() { //неважно }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru