Есть запись в которой присутствует динамический массив, периодически необходимо из массива выносить элементы по какомуто критерию. Возникает вопрос каким наиболее эффективным способом это сделать?
У кого нибудь есть идеи?
Модератор: Модераторы
ZW писал(а):Спасибо за информацию. Но неполучается.
У меня такая структура данных:
p[j].x[y]
То есть p : array of x;
Убирать надо элемент x (то есть массив) из p[j]
Исходная процедура такая:
procedure deleteitem(var dest: integerarty; index: integer);
begin
if (index < 0) or (index > high(dest)) then begin
tlist.Error(SListIndexError, Index);
end;
move(dest[index+1],dest[index],sizeof(integer)*(high(dest)-index));
setlength(dest,high(dest));
end;
Но при компиляции возникает ругань на строку setlength(dest,high(dest));
на несовместимость типов.
debi12345 писал(а):
А если перевести на массив указателей : array of ^x ?
"Там" есть такая же процедура для указателей. Хотя и возня с динамической памятью, но обычно так и делается.
SergKam писал(а):а может компилятор не понимает что такое integerarty; ?
Нет, я ему вместо integerarty прописал array of integer
debi12345 писал(а):Нет, я ему вместо integerarty прописал array of integer
А зря. Есть в FPC такой баг-перестраховка на Var-аргументах :
------------------
работает на "ура"
Я тоже не сразу понял, почему автор MSEgui всегда объявляет новый тип для открытых массивов.
Мда... до этого я бы фиг додумался:)
Но каким образом считать память, что бы вынести элемент из двумерного массива?
ZW писал(а):Но каким образом считать память, что бы вынести элемент из двумерного массива?
Вернее из записи p[j].x[y]
То есть p : array of x;
можно ли рассматривать таким образом: если high(x)=5, то длина записи p[j] 6*integer
то есть move(dest[index+1],dest[index],sizeof(integer)*(high(dest)-index));
превращается в move(p[index+1],p[index],6*sizeof(integer)*(high(p)-index));
или как?
ZW писал(а):работает нормально только при удалении последнего элемента:(
debi12345 писал(а):ZW писал(а):работает нормально только при удалении последнего элемента:(
Вполне нормальная ситуация, если данные в памяти расположатся фрагментарно или в куче. "Move" сработает корректно только если для непрерывных областей. Поэтому позаботьтесь о минимальном размере данного массива - вместо больших элементов сохраняйте указатели на них, объявите глобально или статически, не дайте ему попасть в стек процедуры.
Если не удастся влезть в массив - придется отказаться от быстрой MOVE и вернутся к медленному и тупому линейному перебору, или вести индексы.
ZW писал(а):мда.... учитывая что там три динамических массива на месте x. Выглядит все печально:(
как нехочется лезть в указатели...
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4