Главная страница
    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.007 c
3-77791
Avreliy
2003-07-02 19:25
2003.07.24
Group By и NULL.


1-77992
Вован
2003-07-10 18:09
2003.07.24
Как зделать форму которая всегда находится на заднем плане?


1-77836
Rowell
2003-07-12 01:41
2003.07.24
Автоскроллинг в ListBox


14-78138
Dmitriy O.
2003-07-09 07:55
2003.07.24
Ответственность за свой програмный продукт.


6-78016
united
2003-05-16 14:46
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский