Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Все делает правильно но в конце кидает "invalid pointer oper.."


Ezorcist ©   (2007-07-07 15:29:00) 

Программа простая и решает задачу подсчета среднего балла для студентов,
на форме кнопка, два поля memo (mem и log) в mem такие данные:
1,1,1
2,2,2
3,3,3
4,4,4
5,5,5


Обработчик onclick кнопки:

procedure TForm1.Button1Click(Sender: TObject);

var i,l,g:integer; c:char; s:string;
a : array of array [1..3] of integer;

   sb : array [1..3] of real;
   counter :array [1..5] of integer;

begin
l:=mem.Lines.Count -1;

setlength(a,l);

sb[1]:=0;
sb[2]:=0;
sb[3]:=0;

for i:= 1 to 5 do counter[i]:=0;

for i:= 0 to l do begin
   s:=mem.Lines.Strings[i];
   for g:= 1 to 3 do begin
     c:=s[1+2*(g-1)];
     a[i][g] :=strtoint(c);
     sb[g]:=sb[g]+a[i][g];
     inc(counter[a[i][g]]);
   end;
end;

sb[1]:=sb[1]/mem.Lines.Count;
sb[2]:=sb[2]/mem.Lines.Count;
sb[3]:=sb[3]/mem.Lines.Count;

log.Lines.Add('Средний балл по предмету №1 = '+floattostr(sb[1]));
log.Lines.Add('Средний балл по предмету №2 = '+floattostr(sb[2]));
log.Lines.Add('Средний балл по предмету №3 = '+floattostr(sb[2]));

log.Lines.Add('Средний балл по всем предметам = '+floattostr((sb[1]+sb[2]+sb[3])/3));

end;


программа выдает верный результат, но на последней строке ошибка "invalid pointer operation" а при завершении программы - EAV а за ней "error 216 at ..."


Юрий Зотов   (2007-07-07 22:52:00) [1]

> Ezorcist   (07.07.07 22:47) [4]

По умолчанию эта проверка выключена.


Ezorcist   (2007-07-07 22:47:00) [2]

Спасибо теперь все работает! :-) Не заметил...

А почему ошибка не возникала сразу в момент обращения к несуществующему элементу массива?


Юрий Зотов   (2007-07-07 15:40:00) [3]

l := mem.Lines.Count - 1 ; // На 1 меньше нужного.
setlength(a,l);
...
for i:= 0 to l do // На 1 больше максимума
begin
 ...
 a[ i ][g] :=strtoint(c);

В индексации - полная неразбериха. Отсюда и 216.


Однокамушкин   (2007-07-07 15:37:00) [4]

Вы выделили для массива a памяти на l элементов, а цикл у вас от 0 до l - это уже получается l+1 элемент... К какой памяти вы обащаетесь на последней итерации цикла - а фиг его знает...


antonn   (2007-07-07 15:31:00) [5]


> setlength(a,l);

а без этого?


Наверх

Титульная страница Поиск, карта сайта Написать письмо