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

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

08.01.2016, 19:57. Показов 3386. Ответов 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
Сообщений: 65
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
Сообщений: 65
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
Сообщений: 65
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
Сообщений: 65
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
Сообщений: 65
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
Сообщений: 65
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
Сообщений: 65
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
Сообщений: 65
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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru