Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизПодсчет размера масива в байтах. Найти похожие ветки
← →
Erik (2003-07-11 18:00) [0]Есть такая структура
THole = Record
Params: RTKParams;
Stat: IDStat;
end;
TCounter = Record
UserID: Cardinal;
Hole: Array of THole; //array one user of reservi aeg
end;
FList: Array of TCounter;
Как подсчитать ее размер c номера n? Я так делаю
function CalcArraySize(const Start: Integer): Integer;
Var i: Integer;
begin
Result := 0;
for i := Start to Length(FList)-1 do
Result := Result + Length(FList[i].Hole)*SizeOf(THole) + SizeOf(TCounter);
end;
А после, где i индекс удаляеиого элемента.
MSize := CalcArraySize(i+1);
Move(FList[i+1],FList[i],MSize);
Где ошибка?
← →
Serginio (2003-07-11 18:06) [1]У тебя динамический массив
Move(FList[i+1],FList[i],(SizeOf(TCounter)*(Length(FList)-(i+1));
← →
reonid (2003-07-11 18:08) [2]В массиве FList хранятся элементы
размером SizeOf(TCounter).
← →
Erik (2003-07-11 18:11) [3]А то что в нутри него есть еще один динамический масив это как?
← →
Игорь Шевченко (2003-07-11 18:26) [4]SizeOf (TCounter) здесь вряд ли уместен. Для каждой записи, IMHO, надо вычислять Length(Hole) * sizeof(THole) + размер фиксированной части.
← →
Serginio (2003-07-11 18:32) [5]TCounter = Record
UserID: Cardinal;
Hole: Array of THole; //Это ссылка
end;
И при переносе она как указывала на один массив так и будет указывать. Аналог TStringList
← →
reonid (2003-07-11 18:33) [6]Игорь Шевченко © (11.07.03 18:26)
Конец недели, однако :((
Массивы не могут быть с элементами разной длины. Никак.
Динамический массив - это всего лишь указатель,
и в структуре он занимает 4 байта.
Другой вопрос, что при использовании Move для
удаления записи скорее всего не произойдёт финализации
этой записи и, соответственно, освобождения массива.
Но это другой вопрос.
← →
Игорь Шевченко (2003-07-11 18:41) [7]reonid © (11.07.03 18:33)
Угу, конец недели, точно :) Торможу.
← →
Erik (2003-07-11 18:41) [8]Пробовал
Result := Result + Length(FList[i].Hole)*SizeOf(THole) +
SizeOf(Cardinal);
Вылетает с ошибкой, может быть структура более хитрая?
← →
Erik (2003-07-11 18:48) [9]Так я и думал. Как же быть у меня отпуск. :( Присваивать чтоли?
← →
Serginio (2003-07-11 18:50) [10]Чтоб не мучался
procedure TStringList.Delete(Index: Integer);
begin
if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index);
Changing;
Finalize(FList^[Index]);
Dec(FCount);
if Index < FCount then
System.Move(FList^[Index + 1], FList^[Index],
(FCount - Index) * SizeOf(TStringItem));
Changed;
end;
← →
Serginio (2003-07-11 18:54) [11]Или
SetLength(FList[i].Hole,0);// Finalize(FList[i].Hole);
Move(FList[i+1],FList[i],(SizeOf(TCounter)*(Length(FList)-(i+1));
Тебе помоему уже писали ?????
← →
Erik (2003-07-11 19:00) [12]Так несработало, полая фигня была в Hole! Я добавил
for i := Start to Length(FList)-2 do
FList[i].Hole := FList[i+1].Hole;
вот тогда заработало!
← →
Serginio (2003-07-11 19:09) [13]Очень интересно почему у тебя не срабатывает
Serginio (11.07.03 18:54)
Это Аналог
for i := Start to Length(FList)-2 do
FList[i]:= FList[i+1];
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c