Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334

Создать массив переменной емкости, который был бы доступен из всей формы, а не только в одной функции

20.10.2017, 23:16. Показов 1162. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Требуется создать массив переменной емкости который был бы доступен из всей формы, а не только в одной функции.
Умею создавать массивы только с постоянной емкостью)
C++
1
2
3
4
5
6
7
8
9
int TreeList[6]  //<- это определенно в .h файле формы.
 
//далее заполняю массив в методе.
   TreeList[0] = 319;
   TreeList[1] = 320;
   TreeList[2] = 321;
   TreeList[3] = 945;
   TreeList[4] = 946;
   TreeList[5] = 947;
В общем как сделать чтобы массив можно было заполнить 1 раз при инициализации переменной емкости?
помогите бедному студенту, перечитал 1000 и тем, и ничего не получается в этом с++

ps: не думал что с++ такой ужасно сложный язык, С# будет как-то по проще.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.10.2017, 23:16
Ответы с готовыми решениями:

Как создать массив в одной форме, чтобы он был доступен в другой
в первой форме создаю массив данных во второй форме его проверяю Но во второй форме он не доступен. как сделать его доступным? или...

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

Возможно ли сделать так чтобы лишь 1му пользователю который использует Wi-Fi был доступен интернет?
То вот вай-фай тчк. и пусть к ней подключаются все, а интернет от этой точки будет доступен лишь 1му человеку...

26
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
21.10.2017, 11:53
Задание одномерного массива:
в этом случае компилятор сам определяет размерность массива:
C++
1
int TreeList[] = { 319, 320, 321, 945, 946, 947,... и т.д};

P.S. не понимаю где можно было перечитать 1000 тем и не найти слона! в поисковике вбил(C++. Двумерные и одномерные массивы ) и нашел с первого раза.
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 13:28  [ТС]
Непонимаю вы чем вобще читаете ?
Нужен массив размерность которого определяется не константой, а переменной, массив который потом можно былобы заполнить даными полученными из файла.
И чтобы этот массив был доступен из всего класса формы ( или из других форм), вобщем публичный.

Добавлено через 22 минуты
Нужен любой пример обьявления публичногоо динамического массива.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
21.10.2017, 13:54
типа этого?
C++
1
2
int num; // размер массива
int *TreeList = new int[num]; // Выделение памяти для массива
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 14:08  [ТС]
Да только это неработает, потом ошибку напишу когда до компа доберусь.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
21.10.2017, 14:14
Цитата Сообщение от Fakels Посмотреть сообщение
И чтобы этот массив был доступен из всего класса формы ( или из других форм), вобщем публичный.
в
C++
1
2
public:     // User declarations
int *TreeList;
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 16:29  [ТС]
Цитата Сообщение от lifeforce Посмотреть сообщение
public: // User declarations
int *TreeList;
Ну да так и написанно, и не работает.

Делаю такой код, для примера
C++
1
2
3
4
5
6
7
8
int *TreeList = new int[6];
// типа заполняем массив в ручном цикле
   TreeList[0] = 319;
   TreeList[1] = 320;
   TreeList[2] = 321;
   TreeList[3] = 945;
   TreeList[4] = 946;
   TreeList[5] = 947;
// пытаемся узнаем его размер, но TreeListCount почему-то равна 1
TreeListCount = (sizeof(TreeList)/sizeof(int));

И если где-нибудь попытаемся получить значения из массива
ID = TreeList[random(TreeListCount - 1)];
то отладчик на этой строке выдает ошибку - типа Read of adress 00000 с кучей не понятных значений и букв, в общем я так и не понял в чем здесь ошибка и TreeList = NULL

В случае если сделать массив как ты написал выше то проблем нет.
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
21.10.2017, 16:33
Fakels, TreeList - указатель, он только хранит адрес начала массива, его размер будет одинаковым, какого бы размера массив ты не делал.
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 16:44  [ТС]
И что надо делать чтобы получить/записать данные из такого массива?

пипец что так все сложно.
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
21.10.2017, 16:47
Ну вот же, ты записал в него данные:
Цитата Сообщение от Fakels Посмотреть сообщение
TreeList[0] = 319;
TreeList[1] = 320;
TreeList[2] = 321;
TreeList[3] = 945;
TreeList[4] = 946;
TreeList[5] = 947;
Также обращаясь к элементу массива и получешь данные.
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 16:52  [ТС]
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
TreeList - указатель, он только хранит адрес начала массива,
если TreeList - указатель то где сам массив взять?

Добавлено через 1 минуту
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Также обращаясь к элементу массива и получешь данные.
Да нифига пишу потом в коде ID = TreeList[0];
А оно мне TreeList = NULL и ошибка отладчика.
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
21.10.2017, 16:57
Цитата Сообщение от Fakels Посмотреть сообщение
если TreeList - указатель то где сам массив взять?
Что ты подразумеваешь под "сам массив"?
таким способом
C++
1
int *TreeList = new int[6];
ты динамически создал интовый массив размером 6. И присвоил адрес начала массива указателю TreeList. Вся дальнейшая работа с этим массивом осуществляется через этот указатель.
Просто указателю не известно, какого размера массив, это ты должен сам помнить и учитывать при обращении к элементам.
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 17:03  [ТС]
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Просто указателю не известно, какого размера массив, это ты должен сам помнить и учитывать при обращении к элементам.
Я это уже понял.
Но получается что этот массив не паблик, потому-что из другой функции получить значения из такого указателя нельзя.
Еще раз пишу что TreeList равен NULL
В той же процедуре где заполняешь массив, получить его значение можно, но в других функциях формы уже нельзя.
Вот в чем проблема.

Как мне получить значение которое хранится в TreeList[0]
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
21.10.2017, 17:08
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int sz = Edit1->Text.ToInt();  //в Edit1 записано число 7
    int *TreeList = new int[sz];
 
    TreeList[0] = 319;
    TreeList[1] = 320;
    TreeList[2] = 321;
    TreeList[3] = 945;
    TreeList[4] = 946;
    TreeList[5] = 947;
    TreeList[6] = 123;
 
    int ID = TreeList[5];
    ShowMessage(ID);
    ShowMessage(TreeList[2]);
 
 
    delete []TreeList;
}
Добавлено через 1 минуту
Цитата Сообщение от Fakels Посмотреть сообщение
Я это уже понял.
Но получается что это массив не паблик, потому-что из другой функции получить значения из такого указателя нельзя.
Еще раз пишу что TreeList равен NULL
В той же процедуре где заполняешь массив, получить его значение можно, но в других функциях формы уже нельзя.
Вот в чем проблема.
Если ты его объявишь в классе формы (в h-файле), то никаких проблем не будет

Скорее всего, ты просто каждый раз объявляешь новый указатель с таким же именем

Добавлено через 3 минуты
В Unit1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall FormDestroy(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
 
    int *TreeList;
};
В 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
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    TreeList = new int[7];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TreeList[0] = 319;
    TreeList[1] = 320;
    TreeList[2] = 321;
    TreeList[3] = 945;
    TreeList[4] = 946;
    TreeList[5] = 947;
    TreeList[6] = 123;  
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    int ID = TreeList[5];
    ShowMessage(ID);
    ShowMessage(TreeList[2]);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    delete []TreeList;
}
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 17:24  [ТС]
То что ты выше привел пример так оно работает, добавь еще одну процедуру и попробуй получить из нее значения.

Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Если ты его объявишь в классе формы (в h-файле), то никаких проблем не будет
Скорее всего, ты просто каждый раз объявляешь новый указатель с таким же именем
Объявлено в .H формы!
Что значит каждый раз, один раз всего при инициализации данных для формы.
вот в такой бяке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
_fastcall TfrmEnv::TfrmEnv(TComponent* Owner)
        : TForm(Owner)
{
   int *TreeList = new int[6];
 
   TreeList[0] = 319;
   TreeList[1] = 320;
   TreeList[2] = 321;
   TreeList[3] = 945;
   TreeList[4] = 946;
   TreeList[5] = 947;
   TreeListCount = (sizeof(TreeList)/sizeof(int));
 
   int ID = TreeList[0]; // тут без проблем получаем значение
}
 
void TfrmEnv::Get()
{
   int ID = TreeList[0]; //тут нам выскакивает ошибка, и показывает что TreeList = NULL
}
Добавлено через 10 минут
Грубо говоря второй твой пример у меня также все написанно, и получаю ошибку, может чего в настройках компилятора надо убрать, такое вообще бывает?.
Кстати проект написан на убогом билдере 6, перенести его на XE3 не удалось.
Я попробую на пустом проекте такое сделать
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 17:35  [ТС]
Вот на всякий случай ошибку заскринил может кто вдуплит что здесь не так.
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 18:04  [ТС]
попробовал на пустом проекте сделать, и получаю тоже самую ошибку.

Пойду еще на RAD STUDIO попробую
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
21.10.2017, 18:16  [ТС]
Не знаю кто тут на форуме программист по С++)) но это нигде не работает!
Попробовал в RAD, та же ошибка TreeList = NULL.

Думайте господа программисты по с++, где собака зарыта?.
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
21.10.2017, 21:33
Цитата Сообщение от Fakels Посмотреть сообщение
рубо говоря второй твой пример у меня также все написанно, и получаю ошибку
C++
1
TreeList = new int[7];
и
C++
1
int *TreeList = new int[7];
Разница есть?

Объявлять указатель (писать int * перед именем указателя) нужно только 1 раз, например, в h-файле внутри класса формы.
Во всех остальных местах - при инициализации в конструкторе, при записи значений, при считывании - писать int * уже не нужно
1
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
22.10.2017, 01:37  [ТС]
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Разница есть?
Ну да есть) Ты то сам в первом примере * поставил)

Добавлено через 11 минут
Идем дальше по массиву, основываясь на предыдущих примерах.
Теперь в этот массив нужно запихать класс.

Здесь мне пишется что нужен какой-то конструктор для массива, что это такое и как его изготовить?
C++
1
2
3
4
5
6
7
   TreeList = new CRandomObj[count];
 
   for (int i=0; i < count; i++)
   {
         String value = iniFile->ReadString(PresetObj->Items[i].Text, "PidList", "")
         TreeList [i] = (new CRandomObj(value));
   }
в классе конструктор есть такой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CRandomObj::CRandomObj(String pidLine)
{
       TStringList *list = new TStringList();
    list->DelimitedText = Trim(pidLine);
    list->Delimiter = ',';
    this->count = list->Count;
 
    int *objPid = new int[count];
 
    for (int n = 0; n < count; n++)
    {
       objPid[n] = StrToInt(list->Strings[n]);
    }
 
    delete list;
}
Вообще это реально массив классов, или это с++ не осилит?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.10.2017, 01:37
Помогаю со студенческими работами здесь

Как объявить массив, чтобы он был доступен из всех методов
Как объявить двумерный массив так, чтобы я его мог использовать во всех процедурах программы, и как добавить элементы в него ?

Как объявить массив фреймов видимый только из одной формы?
Всем здравствуйте. Создаю массив фреймов, принадлежащих форме: #include &quot;Unit1.h&quot; #include &quot;Unit2.h&quot; // Это...

Как и где создать метод, который будет доступен всем формам Windows Form?
Как и где создать метод, который будет доступен всем формам Windows Form.Хотел через Program.cs, не получилось

Программно создать шаблон таблицы соответствия значений аргумента x некоторой функции одной переменной f(x)
Помогите, если не трудно записать макрос. просто время поджимает, и в спешке все выходит не совсем правильно Создать макрос, строящий...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки 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. На борту пять. . .
Камера 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