Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2009, 22:39   #1
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

Добрый вечер!

Разрешите обратиться с таким вопросом: В моем задании нужно обработать искл. ситуацию при обращении к несуществующему элементу массива[0..i] (не динамический). Я так понимаю это class EAccessViolation, т.к. эта ошибка возникает при i<0 и обрабатывается после try. Но если i > чем max значение массива (на 7 едениц) эта ошибка не возникает. А если i больше, чем max на 8 и более, то ошибка в except не обрабатывается.

Как быть?

Выкладываю код.
Программа читает числа(не цифры) из Memo (между числами буквы) и заносит их в массив. Главная проблема - при наличии в Memo чисел больше 50, - цикл продолжает заносить их в массив, а исключения не происходит. И только когда массив основательно переполнен возникает EAccessViolation. Которое не обрабатывается в except.

Подскажите пожалуста, как обработать исключительную ситуацию обращения к несуществующему элементу массива.

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  i,j,k,z:integer;
  mas: array[0..49] of integer;
  str: string;
  n,res :real;
begin
  try
    n := StrToFloat(Edit2.Text); // степень
    for i := 0 to 49 do
        mas[i] := 0;

    j := 0;
    for i := 0 to Memo1.Lines.Count-1 do
        begin
          str := Memo1.Lines.Strings[i]; // получаем строку
            for k := 1 to Length(str) do
              if (str[k] >= '0') and (str[k] <= '9') then
                  begin
                      mas[j] := mas[j] + StrToInt(str[k]);
                      if  (str[k+1] <> '0') and (str[k+1] <> '1') and
                          (str[k+1] <> '2') and (str[k+1] <> '3') and
                          (str[k+1] <> '4') and (str[k+1] <> '5') and
                          (str[k+1] <> '6') and (str[k+1] <> '7') and
                          (str[k+1] <> '8') and (str[k+1] <> '9')
                      then Inc(j)  // увеличиваем счетчик массива
                      else mas[j] := mas[j] *10;
                  end;
        end;
    for z := 0 to 49 do
            begin
              res := mas[z];
              res := power(res, n);
              StringGrid1.Cells[z,1] := IntToStr(Trunc(res));
            end;
  except
     on EAccessViolation do
        begin
          ShowMessage('Обращение к несуществующему эл-ту массива!');
          Exit;
        end;

     on EConvertError do
        begin
          ShowMessage('Ошибка преобразования типов!');
          Exit;
        end;
  end;
end;

Последний раз редактировалось Stilet; 01.06.2009 в 09:07.
VadEr вне форума Ответить с цитированием
Старый 01.06.2009, 09:10   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
i > чем max
Чет я это в твоем коде не увидел.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.06.2009, 12:02   #3
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

В коде: max - это 49 (mas[0..49]). i и max я просто использовал только для объяснения проблемы. Насамом деле, если я напишу условие выхода из цикла как
Код:
.......
                    then Inc(j)  // увеличиваем счетчик массива
                      else mas[j] := mas[j] *10;
                      if j>50 then
                        begin
                         ShowMessage('Массив заполнен!');
                         goto go;
                        end;  
                  end;
        end;
go :  for z := 0 to 49 do
            begin
              res := mas[z];
              res := power(res, n);
- то как обработать исключительную ситуацию обращения к несуществующему эл-ту массива? Её, просто, не возникнет. Нужно именно исключение.

Помогите!

Последний раз редактировалось VadEr; 01.06.2009 в 12:07.
VadEr вне форума Ответить с цитированием
Старый 01.06.2009, 12:30   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот тее панацея:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
{$R+}
 try
  for i:=1 to 4 do
   a[i]:=0;
 except
  ShowMessage('Вылезло');
 end;
end;
Включение проверки на выход за диапазон директивой $R
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.06.2009, 12:53   #5
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

Спасибо, но не получается.
Я так понял это ERangeError, а не EAccessViolation.
После включения {$R+}, ошибка ERangeError вылезает, если в Memo более 5 чисел, а нужно более 50.
VadEr вне форума Ответить с цитированием
Старый 01.06.2009, 13:27   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
После включения {$R+}, ошибка ERangeError вылезает, если в Memo более 5 чисел, а нужно более 50.
Тогда прикрепляй сюда вексь проект в архиве. Так сразу я лично не скажу...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.06.2009, 13:46   #7
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

Все, спасибо, разобрался!
{$R+} - эта дирректива, оказывается, еще и обращение к несуществующему символу в строке контролирует (сдесь был подвох).
VadEr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исключительные ситуации BulbaZavr Общие вопросы C/C++ 3 29.12.2008 23:05
исключительные ситуации WebBrowser1 beegl Работа с сетью в Delphi 5 29.06.2008 09:36
Исключительные ситуации FIIR БД в Delphi 5 19.06.2008 16:30
Исключительные ситуации FIIR Помощь студентам 1 19.06.2008 13:50
Исключительные ситуации Mickle Общие вопросы Delphi 6 07.10.2007 21:03