|
|
|
Supreme 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; } зы: странно в других языках есть функция по вычислению длины массива, а тута хз, все ссылаються на вектора =)
----------------------------------
Я безработный...
Возьмите меня на работу. =)
|
|
|
|
|
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;
|
|
|
|
|
Supreme Being
      
участник
Last Login: 29.05.2008 20:04
Сообщ.: 269,
Visits: 2 381
|
|
bazile (22.10.2006) У тебя здесь нет динамическго массива, а есть только код который пишет за пределы массива.... согласен, по поводу динамического массива это я погарячился =) Здесь безразмерный/без ограничений массив =) И как в безразмерном массиве можно выйти за пределы массива, ведь у безразмерного массива "нет предела"... Опять вектора =)) Тут уже вопрос принципа возникает, как узнать длину массива в приведённом мною примире? =)
----------------------------------
Я безработный...
Возьмите меня на работу. =)
|
|
|
|
|
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[]; и посмотри что тебе скажет компилятор. Вектор дает возможность иметь "массив без ограничений". Он выделяет новую память по мере необходимости скрывая детали реализации. Именно поэтому все и советуют им пользоваться.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 29.05.2008 20:04
Сообщ.: 269,
Visits: 2 381
|
|
| bazile Огромное тебе спасибо за пояснения. хм, но всё же странно если в моём примере вызвать к примеру вывод на дисплей елемент a[8], не задавая его значение, вместо того что бы выдать к примеру ошибку или нечто подобное оно выводит область памяти или нечто т.п. Интересно можно ли это отловить распознавание участкок памяти или нет.
----------------------------------
Я безработный...
Возьмите меня на работу. =)
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Массивы в С++ не имеют средств контроля выхода на границы. Кстати говоря, vector<> тоже не контролирует выход за границы диапазона. При необходимости программист может реализовать такую функциональность самостоятельно. Сделано это, насколько я знаю, из соображений эффективности. Язык С++ дает программисту широкую свободу действий взамен требуя высокого уровня ответственности за свой код.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 30.03.2008 17:43
Сообщ.: 247,
Visits: 2 370
|
|
| Честно говоря, не вижу проблемы. Да простые массивы достались с++ от с, но что мешает сохранить размер массива при создании??? Или записывай в конец массива специальное значение. Если же вопрос скорости доступа не критичен, то лучше использовать какую-то коллекцию из стандартной библиотеки. Да не такие уж стандартные контейнеры и медленные...
|
|
|
|
|
Junior Member
      
участник
Last Login: 07.05.2007 14:24
Сообщ.: 19,
Visits: 34
|
|
| А можно самому написать простенький класс, типа SafeArray. ...помню курсе на 3-ем на лабах писали защенный двухмерный массив. =)
|
|
|
|
|
Supreme Being
      
участник
Last Login: 02.08.2008 10:18
Сообщ.: 143,
Visits: 1 405
|
|
| | |