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

Как проверить выходит ли цикл за размер массива - C++

Восстановить пароль Регистрация
 
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
23.01.2011, 19:11     Как проверить выходит ли цикл за размер массива #1
Давно мучает такая проблема допустим есть массив

C++
1
int x[10]={0};
и цикл
C++
1
for(int i=0; i<11; i++){x[i]=0;}
цикл выходит за размер массива, при этом прога может как просто зависнуть так и присвоить какое то левое значение совершенно другому массиву или переменной никак не связанной с массивом X.

Можно как то проанализировать код на наличие таких ошибок ? за всеми же не уследишь, а компилятор ничего плохого в них не находит.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MegaAce
 Аватар для MegaAce
330 / 304 / 65
Регистрация: 14.02.2010
Сообщений: 662
23.01.2011, 19:16     Как проверить выходит ли цикл за размер массива #2
На мой взгдяд надо грамотный писать код. В конкретной ситуации лучше создать переменную, и выглядит лучше, и геморроя поменьше
NiRamz
209 / 209 / 16
Регистрация: 26.12.2010
Сообщений: 691
23.01.2011, 19:20     Как проверить выходит ли цикл за размер массива #3
C++
1
2
int mas[10];
for(int j=0; j<sizeof(mas)/sizeof(mas[0]);j++){}
используйте это и за пределы массива вы не выйдите.
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
23.01.2011, 19:22  [ТС]     Как проверить выходит ли цикл за размер массива #4
MegaAce,
какую переменную создать ты о чем ?
код уже написан и нужна какая нить прога чтобы его проанализировать на такую ошибку мож в вижуал студии что то есть.

Добавлено через 1 минуту
NiRamz
спасибо!

а как по быстродействию такая штука ?
или это все профи так делают ?
NiRamz
209 / 209 / 16
Регистрация: 26.12.2010
Сообщений: 691
23.01.2011, 19:25     Как проверить выходит ли цикл за размер массива #5
эта штука возвращает объем памяти выделенный под весь массив, деленный на объем памяти занимаемый первым элементом. я не думаю что очень то и много тормозит.

MegaAce имел ввиду что то типо следующего,
C++
1
2
3
const int N=10;
mas[N];
for(int j=0; j<N;j++){}
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
23.01.2011, 19:28  [ТС]     Как проверить выходит ли цикл за размер массива #6
NiRamz
понятно
ну твой вариант мне нравиться больше.
хотя тоже много работы предстоит может все такие есть какая нить утилита которая сможет это сама проверить
NiRamz
209 / 209 / 16
Регистрация: 26.12.2010
Сообщений: 691
23.01.2011, 19:31     Как проверить выходит ли цикл за размер массива #7
честно не знаю, изначально пишу всегда с использованием sizeof(), поэтому таких проблем не возникает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2011, 07:36     Как проверить выходит ли цикл за размер массива
Еще ссылки по теме:

C++ Как узнать размер массива
C++ Как узнать размер массива?
Цикл выходит за рамки строки C++

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.01.2011, 07:36     Как проверить выходит ли цикл за размер массива #8
Цитата Сообщение от nill
а как по быстродействию такая штука ?
вычисляется один раз, программа содержит только число

Добавлено через 23 минуты
Цитата Сообщение от nill
может все такие есть какая нить утилита которая сможет это сама проверить
grep или sed
Код
[guest@localhost tmp]$ cat file.txt
a
bc
sdf
sdf
sdd
d
d
for(int i=0; i<11; i++)
sdf
sdf
d
     for(int i=0; i<11; i++)    
sdf
sd
sd
for(int i=0; i<11; i++
a
b

for(int i=0; i < N; i++)
s
d
       for(int i=0; i<N; i++)
s
d
[guest@localhost tmp]$ cat -n file.txt
     1  a
     2  bc
     3  sdf
     4  sdf
     5  sdd
     6  d
     7  d
     8  for(int i=0; i<11; i++)
     9  sdf
    10  sdf
    11  d
    12       for(int i=0; i<11; i++)    
    13  sdf
    14  sd
    15  sd
    16  for(int i=0; i<11; i++
    17  a
    18  b
    19
    20  for(int i=0; i < N; i++)
    21  s
    22  d
    23         for(int i=0; i<N; i++)
    24  s
    25  d
[guest@localhost tmp]$
[guest@localhost tmp]$ cat file.txt | sed -n -r '/^[[:space:]]*for\(.*;.*<[[:space:]]*[[:digit:]]+[[:space:]]*;.*\)[[:space:]]*$/{ p; = }'
for(int i=0; i<11; i++)
8
     for(int i=0; i<11; i++)    
12
[guest@localhost tmp]$

можно найти все такие места и проверить, не являются ли они циклами для перебора элементов массива
Yandex
Объявления
24.01.2011, 07:36     Как проверить выходит ли цикл за размер массива
Ответ Создать тему
Опции темы

Текущее время: 02:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru