Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/64: Рейтинг темы: голосов - 64, средняя оценка - 4.52
8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135

Можно ли обойти динамический массив не зная его размер?

11.04.2016, 02:13. Показов 13805. Ответов 79
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Массив ниже. 
Есть ли способ обойти такой массив используя указатель pArr на него? Не используя count.
 
    int count = 7;
    
    int *pArr = new int[count];
    
    int id = 0;
    while (id < count)
    {
        int value;
        cout << "pArr[" << id << "]=";
        cin >> value;
        pArr[id] = value;
        id++;
    }
    
    delete pArr;
        
    _getch();
    return 0;
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2016, 02:13
Ответы с готовыми решениями:

Как создать двумерный динамический массив не зная его размеров?
Привет. Не смог найти в гугле как можно создать двумерный динамический массив не зная его длины вообще. Нашел только создание...

Можно ли создать массив, изначально не зная его размерности?
Доброго времени суток. Формируется некая последовательность (https://www.cyberforum.ru/pascalabc/thread1962554.html#post10342225) Нужно...

Можно ли задать массив, не зная заранее его длину?
Доброе утро всем. Вчера начал читать &quot;главу 4 Массивы&quot;. Там предложили 2 варианта объявления массива: 1) неинициализированный int...

79
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
11.04.2016, 02:42
Есть идейка, например, если вы поместите в конец массива определенное число (предварительно добавив там еще место для еще одного значения), при нахождении которого цикл будет прекращен, это неудобно, потому что, если, например, в начале где-то в массив будет введено то самое "останавливающие" число, то пройтись по нему не получится и память лишняя расходуется. Но в конце концов, count не нужен.

Вот пример:
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
#include <iostream>
#include <conio.h>
 
using namespace std;
int main() {
 
    int count = 7, stopNumber = 228;
 
    int *pArr = new int[count+1];
    pArr[count] = stopNumber;
 
    int id = 0;
    while (pArr[id] != stopNumber)
    {
        int value;
        cout << "pArr[" << id << "]=";
        cin >> value;
        pArr[id] = value;
        id++;
    }
 
    cout << "\n\n";
    for (int i = 0; pArr[i] != stopNumber; i++)
        cout << "pArr[" << i << "] = " << pArr[i] << endl;
 
    delete pArr;
 
    _getch();
    return 0;
}
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
11.04.2016, 03:00
Если массив весь заполнен то можно вот так
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main(int argc, char*argv[]) {
    int* Array = new int[10];
    int count = _msize(Array) / sizeof(Array[0]);
    std::cout << count << std::endl;
    std::cin.ignore();
    return 0;
}
Но проблеммы могут возникнуть, если мы используем 5 из 10 элементов, т.к _msize возвращает блок памяти выделенной под массив
1
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
11.04.2016, 04:02
решил дыру сваять ? ))
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.04.2016, 04:46
Цитата Сообщение от obivan Посмотреть сообщение
то можно вот так
Лучше не нужно так.
Цитата Сообщение от obivan Посмотреть сообщение
Но проблеммы могут возникнуть, если мы используем 5 из 10 элементов
Не только.
выделение памяти new и ее подсчет _msize
0
8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135
11.04.2016, 11:45  [ТС]
решил дыру сваять ? ))
всмысле?

Вот нашёл такой способ, но он не рабочий =):
//проблема в том что если цикл выходит за массив, указатель pArr содержит кучу, которая может быть как "true"
C++
1
2
3
4
5
while (*pArr)
    {
        cout << "pArr[]=" << *pArr;
        pArr++;
    }
0
 Аватар для maxm
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
11.04.2016, 12:27
Вы, может быть, видели иногда в примерах, как в функцию передают два параметра сразу - указатель и размерность. Это делается по той причине, что есть масса возможных проблем с вычислением корректной длины массива, в том числе и sizeof способа.
Поэтому, если Вы хотите куда либо передавать такие значения, передавайте еще и размерность. Если нет необходимости использовать именно стандартный массив, используйте std::vector - это сильно упростит Вам жизнь.
1
11.04.2016, 12:32

Не по теме:

nd2,

Цитата Сообщение от nd2 Посмотреть сообщение
Не только.
выделение памяти new и ее подсчет _msize
чот стало стражно аж :scare:

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.04.2016, 12:37
nofx,

1) динамического массива не существует
2) не используйте сырые указатели
3) если п.2 нужен по ТЗ, пишите класс-обёртку, который будет иметь методы begin, end
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 12:52
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
динамического массива не существует
Почему?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.04.2016, 13:03
nmcf, массив в С++ имеет статический размер по определению, так называемая динамика достигается созданием нового массива и копирования с старого данных.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.04.2016, 13:38
Динамический массив, это действительно миф. Массив (регулярный кусок) памяти выделенный динамически, это то, что называют динамическим массивом. И это древнее зло. Поэтому на вопрос:
Цитата Сообщение от nofx Посмотреть сообщение
Есть ли способ обойти такой массив используя указатель pArr на него?
Можно и так ответить:
Если в прямом смысле,то да. Оказаться за массивом выделенной памяти очень просто. Даже если массив имеет размер равный максимальному значению для индекса, то обращение по максимальному значению индекса будет обращением к памяти, которая находится сразу за последним элементом. Так как индексация начинается с нуля. То есть обойти массив (памяти) всегда можно. Но ни один компилятор не определяет направление обхода: "слева" или "справа".
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 13:43
rikimaru2013, на эту тему регулярно спорят здесь. Статический/динамический - характеристика способа выделения памяти, а не свойство массива изменять размер.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.04.2016, 16:35
Цитата Сообщение от nmcf Посмотреть сообщение
Статический/динамический - характеристика способа выделения памяти, а не свойство массива изменять размер.
Нет вроде бы. Массив это массив, а указатель это указатель. Для указателей я знаю три способа разыменования:
C++
1
2
3
4
5
int a;
int *pa=&a;
int b=*a;// 1-й способ
//b=a->value;//2-й способ, но тут не катит так как переменная a это не структура))
b=a[0];//3-й способ - индексное обращение
ну и что? Что же теперь всё что имеет перегруженные квадратные скобки считать массивом?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 16:48
IGPIGP, а ты ещё дальше пошёл, теперь уже понятие массив оспаривается. Т. е. массив не может быть в памяти, выделенной new? А если он внутри структуры?
0
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
11.04.2016, 17:23
Цитата Сообщение от nmcf Посмотреть сообщение
теперь уже понятие массив оспаривается.
полагаю что зарождается что то новое )))
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.04.2016, 17:30
Цитата Сообщение от nmcf Посмотреть сообщение
Т. е. массив не может быть в памяти, выделенной new?
Липпман "Язык программирования С++. Базовый курс".
Миниатюры
Можно ли обойти динамический массив не зная его размер?   Можно ли обойти динамический массив не зная его размер?  
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.04.2016, 19:09
Цитата Сообщение от nmcf Посмотреть сообщение
IGPIGP, а ты ещё дальше пошёл, теперь уже понятие массив оспаривается.
Нет, понятие не оспаривается. Массив, это и горный массив тоже. Но если иметь ввиду тип, то при выделении памяти не образуется массив. Тут неважно даже как она выделена. Вы можете объявить массив char на стеке. Длиной 40 штук например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
char mem_in_bytes[40];
int *p_int=(int*)mem_in_bytes;
for(int i=0; i<10; i++)p_int[i]=i+1;
for(int i=0; i<10; i++)cout<<p_int[i]<<" ";// 1 2 3 4 5 6 7 8 9 10
cout<<endl;
system("pause");
return 0;
}
но p_int это не массив. Это указатель. То есть неважно как выделено. Есть указатель на начало области, которая (какая удача)) оказалась ожидаемым образом размечена и заполнена в ожидаемом формате. Всё что "ожидаемо" находится в голове у программиста. Сам указатель этого никак не поддерживает. Ему всё едино. А массив это другое дело.
Цитату Липмана не смог прочесть.
ps вопрос темы сводится к тому, можно ли узнать размер выделенной динамически области, имея только указатель на неё. Ответ очевиден.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 19:11
С точки зрения структур данных это массив. Вот о чём я. А то, что размер нельзя получить - не так важно.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.04.2016, 19:19
Цитата Сообщение от nmcf Посмотреть сообщение
С точки зрения структур данных это массив. Вот о чём я. А то, что размер нельзя получить - не так важно.
Я же думал мы о вопросе топика говорим. Я Вам уже показал, что можно и в динамической памяти выделить в байтах или других кратных единицах. Потом обратиться через разыменование или если сложный тип то оператором размещения и заселить чем хотите. Нет тут массива. Есть память и есть то что Вы о ней знаете. Никто, кстати, не мешает обратиться к любому куску памяти как к массиву байт и почитать его по-байтово, например. Я думаю, мы понимаем друг друга, но к теме это не относится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2016, 19:19
Помогаю со студенческими работами здесь

Как правильно передать динамический массив в функцию, увеличивающую его размер, чтобы изменения сохранились
Извиняюсь за совсем нубский вопрос, похожее не нашел. Простая учебная задача - написать функцию, которая добавляет элемент в динамический...

Создать динамический массив, размер которого пользователь вводит с клавиатуры.Заполнить его случайными числами
Кто знает, как на С++: создать динамический массив, размер которого пользователь вводит с клавиатуры. Заполнить его случайными числами из...

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

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

Рассчитать размер 1 пикселя в мм на мониторе,зная диагональ монитора в дюймах и его разрешения
Рассчитать размер 1 пикселя в мм на мониторе,зная диагональ монитора в дюймах и его разрешения


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru