о длине массива =)
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



о длине массива =) Expand / Collapse
Автор
Сообщение
22.10.2006 13:00
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 29.05.2008 20:04
Сообщ.: 269, Visits: 2 381
Лирическое отступлене: С++ мне не нравиться уж больно кривой язык и майкрасофт и борланд как то криво друг с другом взаимодействуют плюс ещё линуксоидные плюсы, муть одним словом =)))

Возник вопрос как можно посчитать длину динамического массива...

#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;
}

зы: странно в других языках есть функция по вычислению длины массива, а тута хз, все ссылаються на вектора =)

----------------------------------
Я безработный...
Возьмите меня на работу. =)

Сообщ. #906181
22.10.2006 13:19
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
У тебя здесь нет динамического массива, а есть только код который пишет за пределы массива. Изучай STL и начинай пользоваться классом vector<>.

std::vector<int> a;
a.push_back(1);
a.push_back(2);
std::cout << a.size() << std::endl;

Сообщ. #906184
22.10.2006 14:16
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 29.05.2008 20:04
Сообщ.: 269, Visits: 2 381
bazile (22.10.2006)
У тебя здесь нет динамическго массива, а есть только код который пишет за пределы массива....

согласен, по поводу динамического массива это я погарячился =) Здесь безразмерный/без ограничений массив =) И как в безразмерном массиве можно выйти за пределы массива, ведь у безразмерного массива "нет предела"...

Опять вектора =)) Тут уже вопрос принципа возникает, как узнать длину массива в приведённом мною примире? =)

----------------------------------
Я безработный...
Возьмите меня на работу. =)

Сообщ. #906191
22.10.2006 14:41
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
В С++ нет понятия безразмерного массива или массива без ограничений. Запись int a[] = {0} указывает компилятору создать массив с длиной равной 1. Если бы ты написал int a[] = {0,1,2}, то длина массива равнялась бы трем.

Далее, так как нумерация элементов массивов начинается с нуля, то запись a[1]=5 в твоем примере приводит к тому, что ты записываешь данные за пределы массива в область памяти, которой ты не владеешь. Массив при этом не расширяется. Он и не обязан этого делать. Поэтому твой пример абсолютно неправильный.

Выражение sizeof(a)/sizeof(int) является константой и вычисляется на этапе компиляции. Чтобы убедиться в этом напиши вместо int a[] = {0}; строку int a[]; и посмотри что тебе скажет компилятор.

Вектор дает возможность иметь "массив без ограничений". Он выделяет новую память по мере необходимости скрывая детали реализации. Именно поэтому все и советуют им пользоваться.

Сообщ. #906193
22.10.2006 15:44
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 29.05.2008 20:04
Сообщ.: 269, Visits: 2 381
bazile

Огромное тебе спасибо за пояснения.

хм, но всё же странно если в моём примере вызвать к примеру вывод на дисплей елемент a[8], не задавая его значение, вместо того что бы выдать к примеру ошибку или нечто подобное оно выводит область памяти или нечто т.п. Интересно можно ли это отловить распознавание участкок памяти или нет.

----------------------------------
Я безработный...
Возьмите меня на работу. =)

Сообщ. #906194
22.10.2006 16:36
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Массивы в С++ не имеют средств контроля выхода на границы. Кстати говоря, vector<> тоже не контролирует выход за границы диапазона. При необходимости программист может реализовать такую функциональность самостоятельно. Сделано это, насколько я знаю, из соображений эффективности. Язык С++ дает программисту широкую свободу действий взамен требуя высокого уровня ответственности за свой код.
Сообщ. #906196
02.11.2006 9:18
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 30.03.2008 17:43
Сообщ.: 247, Visits: 2 370
Честно говоря, не вижу проблемы. Да простые массивы достались с++ от с, но что мешает сохранить размер массива при создании??? Или записывай в конец массива специальное значение. Если же вопрос скорости доступа не критичен, то лучше использовать какую-то коллекцию из стандартной библиотеки. Да не такие уж стандартные контейнеры и медленные...
Сообщ. #906802
02.11.2006 12:02
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 07.05.2007 14:24
Сообщ.: 19, Visits: 34
А можно самому написать простенький класс, типа SafeArray.

...помню курсе на 3-ем на лабах писали защенный двухмерный массив. =)

Сообщ. #906814
02.11.2006 14:42
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 02.08.2008 10:18
Сообщ.: 143, Visits: 1 405