Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 45, средняя оценка - 4.67
Vizlim
3 / 3 / 0
Регистрация: 24.10.2011
Сообщений: 269
#1

Как подсчитать длину динамического массива? - C++

22.10.2006, 17:00. Просмотров 5509. Ответов 9
Метки нет (Все метки)

Лирическое отступлене: С++ мне не нравиться уж больно кривой язык и майкрасофт и борланд как то криво друг с другом взаимодействуют плюс ещё линуксоидные плюсы, муть одним словом =)))
Возник вопрос как можно посчитать длину динамического массива...
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream.h>
int a[]={0};
int b;
int main() {
a[1]=5;
a[2]=7;
cout << "sizeof(a)/sizeof(int)" << sizeof(a)/sizeof(int) << endl;
cin >> b;
return 0;
}
зы: странно в других языках есть функция по вычислению длины массива, а тута хз, все ссылаються на вектора =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2006, 17:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как подсчитать длину динамического массива? (C++):

Узнать длину динамического массива - C++
Здравствуйте! В интернете никак не могу найти способ, который бы позволил найти длину динамического массива без использования каких-либо...

Как подсчитать Длину строки в двойном массиве char - C++
Как подсчитать Длину строки в двойном массиве char char c; int a; for(int j=0;j&lt;10;j++) for(int i=0;i&lt;10;i++) cin &gt;&gt;...

Как организовать сортировку динамического массива - C++
Ввести num - количество массивов. Ввести размерность очередного массива и его элементы типа double, разместить их в динамической памяти....

Как удалить элемент из динамического массива? - C++
Доброго времени суток. Как удалить элемент с динамического массива? Zombie *virusDinArr=new Zombie; Удальть например 2-й. ...

Как посмотреть значение динамического массива - C++
Друзья изучение С++ привели меня к ужасно непонятным фактам.))) Прошу помочь мне втолковать. Как просмотреть элемент динамического...

Как изменить размер динамического массива структур после того как был добавлен товар - C++
Подскажите как мне изменить размер динамической массива структур после того как был добавлен товар , countProduct-это и есть размер массива...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
bazile
58 / 34 / 20
Регистрация: 15.03.2007
Сообщений: 6,911
22.10.2006, 17:19 #2
У тебя здесь нет динамического массива, а есть только код который пишет за пределы массива. Изучай STL и начинай пользоваться классом vector<>.
C++
1
2
3
4
std::vector<int> a;
a.push_back(1);
a.push_back(2);
std::cout << a.size() << std::endl;
Vizlim
3 / 3 / 0
Регистрация: 24.10.2011
Сообщений: 269
22.10.2006, 18:16  [ТС] #3
bazile (22.10.2006)
У тебя здесь нет динамическго массива, а есть только код который пишет за пределы массива....
согласен, по поводу динамического массива это я погарячился =) Здесь безразмерный/без ограничений массив =) И как в безразмерном массиве можно выйти за пределы массива, ведь у безразмерного массива "нет предела"...
Опять вектора =)) Тут уже вопрос принципа возникает, как узнать длину массива в приведённом мною примире? =)
bazile
58 / 34 / 20
Регистрация: 15.03.2007
Сообщений: 6,911
22.10.2006, 18:41 #4
В С++ нет понятия безразмерного массива или массива без ограничений. Запись int a[] = {0} указывает компилятору создать массив с длиной равной 1. Если бы ты написал int a[] = {0,1,2}, то длина массива равнялась бы трем.
Далее, так как нумерация элементов массивов начинается с нуля, то запись a[1]=5 в твоем примере приводит к тому, что ты записываешь данные за пределы массива в область памяти, которой ты не владеешь. Массив при этом не расширяется. Он и не обязан этого делать. Поэтому твой пример абсолютно неправильный.
Выражение sizeof(a)/sizeof(int) является константой и вычисляется на этапе компиляции. Чтобы убедиться в этом напиши вместо int a[] = {0}; строку int a[]; и посмотри что тебе скажет компилятор.
Вектор дает возможность иметь "массив без ограничений". Он выделяет новую память по мере необходимости скрывая детали реализации. Именно поэтому все и советуют им пользоваться.
Vizlim
3 / 3 / 0
Регистрация: 24.10.2011
Сообщений: 269
22.10.2006, 19:44  [ТС] #5
bazile
Огромное тебе спасибо за пояснения.
хм, но всё же странно если в моём примере вызвать к примеру вывод на дисплей елемент a[8], не задавая его значение, вместо того что бы выдать к примеру ошибку или нечто подобное оно выводит область памяти или нечто т.п. Интересно можно ли это отловить распознавание участкок памяти или нет.
bazile
58 / 34 / 20
Регистрация: 15.03.2007
Сообщений: 6,911
22.10.2006, 20:36 #6
Массивы в С++ не имеют средств контроля выхода на границы. Кстати говоря, vector<> тоже не контролирует выход за границы диапазона. При необходимости программист может реализовать такую функциональность самостоятельно. Сделано это, насколько я знаю, из соображений эффективности. Язык С++ дает программисту широкую свободу действий взамен требуя высокого уровня ответственности за свой код.
Vadim_ig
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 235
02.11.2006, 12:18 #7
Честно говоря, не вижу проблемы. Да простые массивы достались с++ от с, но что мешает сохранить размер массива при создании??? Или записывай в конец массива специальное значение. Если же вопрос скорости доступа не критичен, то лучше использовать какую-то коллекцию из стандартной библиотеки. Да не такие уж стандартные контейнеры и медленные...
Alexei_A
0 / 0 / 0
Регистрация: 03.10.2006
Сообщений: 19
02.11.2006, 15:02 #8
А можно самому написать простенький класс, типа SafeArray.
...помню курсе на 3-ем на лабах писали защенный двухмерный массив. =)
Vyacheslav
Сообщений: n/a
02.11.2006, 17:42 #9
А можно самому написать простенький класс, типа SafeArray.
Заверни в него <vector>.
Vadim_ig
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 235
03.11.2006, 11:04 #10
Ну писать свой массив - это для лабы может и не плохо, но в общем-то скорее извращение. Если все что нужно, это контроль границ - в стандартной библиотеке есть вектор с такой функциональностью, называется, если не ошибаюсь, Vec
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2006, 11:04
Привет! Вот еще темы с ответами:

Как выделить память для динамического массива? - C++
Как выделить память для динамического массива? typedef TPrimitives *TPrimitive; //... TPrimitives Primitives; Мне нужно выделить...

Как вызвать метод вектора из динамического массива? - C++
vector&lt;some_type&gt; *t=new vector&lt;int&gt; ; как вызвать метод из структуры\класса some_type? как разыменовать этот указатель, я уже как не...

Как ввести с клавиатуры элементы динамического массива? - C++
int *mass=new int; for(int i=0;i&lt;10;i++) { } Как ввести в цикле элементы массива , а потом вывести их на экран? Подскажите...

Как создать шаблон класса одномерного динамического массива? - C++
Нужно решить задачу(консольное приложение(совместимое с visual studio 2005)): Со-здать ша-блон кл-асса од-номерного ди-намического...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.11.2006, 11:04
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru