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

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

11.04.2016, 02:13. Показов 14314. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 31.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 31.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 30.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru