Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Как объявить массив с переменной размерностью?

01.06.2018, 10:11. Показов 3058. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

C++
1
int asdf[5];
успешно работает, т.к. 5 - это константа
C++
1
2
    int cnt = 5;
    int asdf[cnt];
компилятор не пропускает
Возможно ли это как-то обойти?
Вариант "объявить массив с запасом, а потом резать" не очень привлекает.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.06.2018, 10:11
Ответы с готовыми решениями:

Как создать динамический массив с переменной размерностью
Здравствуйте Все! 1. Подскажите, как в VBA сделать двухмерный (или трёхмерный) динамический массив не прямоугольной формы, а...

Как объявить массив, не указывая его размеры в переменной?
код правильный, но как объявить массив не указывая его размеры в переменной? int s, sum=0; cin >> s; int mass; ...

Объявить класс, содержащий одномерный целочисленный массив размерностью 10, индексатор для работы с этим массивом
Объявить класс, содержащий одномерный целочисленный массив размерностью 10, индексатор для работы с этим массивом, а также конструктор по...

12
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 12
01.06.2018, 10:13
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

C++
1
2
3
4
5
int *asdf;
 
// ...
int cnt = 5;
asdf = new int[cnt];
2
Модератор
 Аватар для D1973
9910 / 6447 / 2455
Регистрация: 21.01.2014
Сообщений: 27,366
Записей в блоге: 3
01.06.2018, 10:38
Динамические массивы
2
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
01.06.2018, 10:56
Кстати, по ходу вопрос возник: если такой массив организовывать в "куче" - напр. в каком-то обработчике, - то размер ограничен максимальным размером этой самой кучи. Причём компилятор скромно об этом умалчивает, а неприятности начинаются при работе программы, точнее - в "обработчике" (программа просто "сваливает" без всяких сообщений). Это можно обойти, делая массив общей переменной. Вопрос: а если в обработчике добавить к определению массива static , будет ли он организован в основной области (без такого ограничения размера)?
И на эту же тему... - я недавно попробовал "прокачивать" большие массивы (текстовый файл в несколько десятков мегабайтов) через MemoryStream, и обнаружил, что при размере файла порядка 24 и более Мб линкер начинает возмущаться.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 12
01.06.2018, 11:13
Цитата Сообщение от nick42 Посмотреть сообщение
программа просто "сваливает" без всяких сообщений
Можно посмотреть минимальный пример подобного поведения и озвучить размер массива, который необходим, чтобы программа "свалила"? 50 миллионов int-ов - достаточно много? Так вот с этим количеством программа отрабатывает запросто, выделяет массив и обрабатывает его, если выделять память в обработчике безо всяких static-ов (тестировалось, разумеется, под 32-битной WinXP со стандартными настройками проекта для XE4)
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
01.06.2018, 11:32
По поводу MemoryStream, - это я не корректно поставил вопрос.
Работая с MemoryStream создаю два байтовых массива:
C++
1
2
       char bu11[40000000];
       char bu22[40000000];
вот пока размер обоих 20 млн - ничего. Если поставлю 60 млн (обоим) - тут тебе и Access Violation, и Out of memory (от linker'а). Причем всё нечётко, что я не перевариваю в экспериментах... - если подбираться к 60 млн от меньших, то и 40, и 30 млн - без вопросов. А как только получаю error от 60 млн, то дальнейшее уменьшение размерности приводит к исчезновению ошибки лишь при откате до 20 млн.
Пардон, если изложил туманно.

Добавлено через 1 минуту
п.с. массивы bu11, bu22 оба в глобальной области.

Добавлено через 2 минуты
п.с.с. Хотелось бы понимать, с чьим размером это связано? Размеры стэка, кучи, страниц памяти, ресурсы среды программирования...?
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 12
01.06.2018, 11:35
Цитата Сообщение от nick42 Посмотреть сообщение
Работая с MemoryStream
Как работая? Почему нельзя привести компилябельный обработчик нажатия на кнопку, который можно вставить и проверить, а вместо этого приходится подключаться к карме, считывать оттуда информацию, как оно было реализовано. А сегодня, как назло, у них там в КармаNet-е сбои какие-то. Никак соединение не устанавливается...
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
01.06.2018, 11:48
Да там в обработчике много лишнего, чтоб ... . Да и дело скорее всего инициализации массива и только (на MemoryStream я зря грешил).
Вот такое начало программы__
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <fstream.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
       char bu11[20000000];
       char bu22[20000000];
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
и все дальнейшие манипуляции с размерностью вызывают (или не вызывают) появление ошибок линкера, в зависимости от чисел. Пример ошибок...
HTML5
1
2
3
[Linker Error] Fatal: Error detected (LME279)
[Linker Error] Fatal: Error detected (LME347)
[Linker Warning] Cannot release virtual memory at addr 78008000 for 33554432 bytes (errcode 487)
Я сейчас попробую всё остальное убрать, оставив только объявление; мне почему-то кажется, что с линкером так всё и сохранится...
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 12
01.06.2018, 12:05
Цитата Сообщение от nick42 Посмотреть сообщение
и все дальнейшие манипуляции с размерностью
Какие при статическом объявлении массива вообще могут быть манипуляции с его размерностью?
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
01.06.2018, 12:29
Ну, вот, - простым языком (по другому я не умею)... я ставлю по 25 (30, 40...) млн chars в объявлении этих двух массивов
char bu11[25000000]; ...
Компилирую и запускаю программу. Диспетчер задач показывает около 16 Мбайт занятого места. Потом жму на кнопку с таким обработчиком__
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm1::Button5Click(TObject *Sender)
{
     if(!OpenDialog1->Execute()) return;  
     TMemoryStream *ms = new TMemoryStream;
     ms->LoadFromFile(OpenDialog1->FileName.c_str());
     int p,i,dln=ms->Size;
     ms->Read(bu11,dln);
     for(p=0,i=0;i<ms->Size;i++)
       if(bu11[i]>0 && bu11[i]!='.')
        { bu22[p++] = bu11[i]; bu22[p]=0; dln=p; }
      ms->Clear();
      ms->Write(bu22,dln);
      ms->SaveToFile("inf.txt");
     Memo1->Text = bu22;
     dln;
     delete ms;          /*  */
}
и загружаю файл объемом 23 Мб. Диспетчер задач показывает что-то около 40 Мб (сразу; потом около 23). И всё б ничего, но когда я увеличиваю этот char bu11[] до 60000000, - линкер начинает возмущаться.
Что нужно иметь в виду, играясь с большими объемами? Хотелось бы понять.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
01.06.2018, 17:22  [ТС]
volvo, обращаюсь как у модератору. Перестали приходить письма с уведомлениями о том чта на поднятый вопрос кто-то откликнулся! Что делать?

Небольшой дополнительный вопрос:
C++
1
2
3
4
5
6
7
8
9
10
#pragma pack(push, 2)
struct ArchRecordStruct
{
    UINT t;
    float v[8];
};
#pragma pack(pop, 2)
 
int count = 1000;
struct ArchRecordStruct *arch = new struct ArchRecordStruct[count];
всё работает!

Но, всё работает и вот так:
C++
1
2
3
4
5
6
7
8
9
#pragma pack(push, 2)
struct ArchRecordStruct
{
    UINT t;
    float v[8];
};
#pragma pack(pop, 2)
 
struct ArchRecordStruct *arch = 0;
чем кординально одно объявление массива структур, отличается от другого? Что будет работать быстрее?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 12
01.06.2018, 17:26
Во втором случае никакого выделения памяти нет, описывается указатель на массив структур, и его нужно будет натравить на какой-то участок памяти, выделенный где-то в другом месте другими средствами, чтобы он (этот участок) интерпретировался, как массив структур (это то, как я тебе показывал в одной из предыдущих тем).

А в первом случае - выделяется участок памяти, достаточный для хранения n структур.

Не по теме:

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

1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
01.06.2018, 17:58  [ТС]
volvo,

Не по теме:

Вы правы, нашёл два ответа в спаме, но только два?! Такого раньше вообще не было!

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2018, 17:58
Помогаю со студенческими работами здесь

Объявить массив? Запросто! Объявить массив массивов? А как это?
Доброго времени суток! Конечно, все знают, как объявить массив! int main () { int array; }

Можно ли в сессионной переменной объявить массив?
&lt;?php session_start(); ?&gt; &lt;?php $_SESSION; $_SESSION=session_id(); $art='Артикул' $tov='Наименование товара' ?&gt;на этой...

Объявить массив размерностью от -100 до 100
Привет всем, как в си объявить массив размерностью от -100 до 100

Объявить массив из 10 целых чисел, поменять местами 5 элемент массива со значением переменной TWO=2
Никогда не сталкивался с ассемблером, но нужно сделать такое задание.Обьявить массив из 10 целых чисел . Поменять местами 5 эллемент массив...

Как объявить имя новой переменной в new
Здравствуйте, 1)Функция должна создавать новый объект структуры : struct Wagen { int weight;; char clas; };


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru