Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-78039
Skier
2003-07-07 09:23
2003.07.24
---|Ветка была без названия|---


3-77739
MakNik
2003-06-27 09:34
2003.07.24
как в DBCtrlGrid сделать кнопу


3-77785
Котяра
2003-07-01 14:01
2003.07.24
Конвертация даты в строку на SQL сервере


3-77787
Bless
2003-06-27 16:47
2003.07.24
Параметры с одинаковыми именами


6-78028
Yegorchic
2003-05-19 21:12
2003.07.24
Как определить сколько получено и отправлено байт?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский