0 / 0 / 1
Регистрация: 21.09.2013
Сообщений: 41
1

ERangeCheckError при удалении элемента из динамического массива

25.11.2014, 20:57. Показов 1057. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно удалить из массива элемент по его индексу. Как я понял, нужно сдвинуть элементы идущие после индекса на -1.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure DeleteFromList(z: integer);
var a,aback:integer;
buf:array of TCol;
begin
 
 
aback:=0;
setlength(buf,high(FList)-1);
for a:=low(FList) to high(FList) do
    begin
       if a=z then
          begin
             aback:=aback+1;
          end
          else
          buf[a]:=FList[a-aback];
    end;
 
 
setlength(FList,high(FList)-1);
for a:=low(FList) to high(FList) do
  begin
     FList[a]:=buf[a];
  end;
end;
Однако при вызове процедуры вылетает ошибка ERangeCheckError.
Предполагаю, что при вызове:
Delphi
1
setlength(FList,high(FList)-1);
Длина массива устанавливается в 0 и массив уничтожается, и в цикле где процедура вызывается идёт обращение к несуществующему элементу.

Процедура вызывается так:
Delphi
1
2
3
4
5
6
7
8
9
10
j:=0;
for p:=low(FList) to high(FList) do
  begin
     if not(IntersectRect(buffer,FList[p-j].CRect,FList[p-j].CRect)) then
      begin
 
         DeleteFromList(p);
 
         j:=j+1;
      end;
Заранее благодарен за помощь.

Добавлено через 2 часа 35 минут
Проконтролировал пошагово удаление.
Да, скорее всего проблема именно в этом. И ошибка вылетает как раз, когда в массиве один элемент. Он имеет индекс 1. При удалении длине массива присваивается 0, что равно Nil. И в этом же цикле попытка обращение к пустому месту.
Только вот что с этим делать я не знаю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2014, 20:57
Ответы с готовыми решениями:

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

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

Ошибка при удалении динамического массива
Доброго времени суток! ПРоблема заключается в том, что при попытке очистить память из под...

Ошибка при удалении динамического массива
Добрый вечер! Ругается на HEAP CORRUPTION DETECTED в строке с delete vertex; В чём может быть...

2
669 / 559 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
26.11.2014, 07:17 2
Цитата Сообщение от Warenav Посмотреть сообщение
procedure DeleteFromList(z: integer);
ИМХО код бредовый.
Если известна позиция удаляемого элемента, то производится смещение всех элементов массива "правее" этой позиции на одну позицию "влево", и затем уменьшается список на 1.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
var
a: array of integer;
........
SetLength (A, 24);
....
procedure DeleteFromList(z: integer);
var i : integer;
begin
For i:=z+1 to High(A) do
a[i-1]:=a[i];
SetLength(A, Length(A));
end;
Добавлено через 9 минут
Цитата Сообщение от Warenav Посмотреть сообщение
когда в массиве один элемент. Он имеет индекс 1
В динамических массивах индексы начинаются с 0, а не с 1.
setlength(a,1);
то
Length(a) выдаст 1
High (a) выдаст 0
Останется проверять значение Z
Delphi
1
2
if z> High (a) then 'Ошибка диапозона' else 
 if High(a) = 0 then 'Удаление последнего элемента' else
1
0 / 0 / 1
Регистрация: 21.09.2013
Сообщений: 41
26.11.2014, 16:23  [ТС] 3
Цитата Сообщение от ZfoxAK Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
procedure DeleteFromList(z: integer);
var i : integer;
begin
For i:=z+1 to High(A) do
a[i-1]:=a[i];
SetLength(A, Length(A)[U]-1[/U]{?});
end;
Так ведь, раз уменьшить на один нужно. Спасибо, сейчас попробую.

Добавлено через 3 минуты
Ошибка пропала, огромное спасибо.
0
26.11.2014, 16:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2014, 16:23
Помогаю со студенческими работами здесь

Ошибка при удалении динамического массива
Непонятная мне ошибка при удалении массива #include <iostream> #include <conio.h> using...

Ошибка SIGTRAP при удалении динамического 2D массива
Нужно было создать двухмерный динамический массив в форме "пирамиды", скажем так, заполнить его...

Вылет программы при удалении динамического массива
Писал программу с использованием динамического массива, все компилилось нормально, но в какой-то...

Нужно ли при удалении динамического массива присваивать NULL?
Вот создал я динамический массив N на M: int **mas; mas=new int*; for(i=0;i<n;i++) mas=new...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru