Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2008, 22:49   #1
Мессир
Пользователь
 
Аватар для Мессир
 
Регистрация: 24.01.2008
Сообщений: 12
По умолчанию Истинный объём памяти занимаемый записью, record

Сколько не искал, не нашёл, проблема вот в чём:
Код:
type
    Ttest = record
        param1: widestring;
        param2: widestring;
    end;

    TarrayTest = array[1..N] of Ttest;

var
    test: TarrayTest;

begin
    test[1].param1 := 'asfasdfdsfdsafasdfasfasfas';
    test[1].param2 := 'asfsdfdasfdasfasdfdasfdsafasdfasdfas';
    showmessage( IntToStr( sizeof(test[1]) ) );
end.
выводит 4 или 8 байт размер... но это совершенно неверно, в widestring я могу и 1 мегабайт и 2 записать, и гигабайт, дак как получить истинное значение?
Если нельзя получить средствами делфи, можно ли как-нибудь перебрать все поля записи в цикле? ибо параметров может быть много, и функцию статичную писать неудобно К тому же не одну...
Плохо, когда не знаешь, да ещё и забудешь.
Мессир вне форума Ответить с цитированием
Старый 24.01.2008, 23:03   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Кто запретил использовать Length() ?

TTest, размер записи = SizeOf(TTest);
Узнать параметр Length(param1) + Length(param2)
BOBAH13 вне форума Ответить с цитированием
Старый 25.01.2008, 00:08   #3
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Мессир Посмотреть сообщение
Сколько не искал, не нашёл, проблема вот в чём:
выводит 4 или 8 байт размер... но это совершенно неверно, в widestring я могу и 1 мегабайт и 2 записать, и гигабайт, дак как получить истинное значение?
Вот это-то как раз и неверно потому, что там не widestring, а указатель на widestring, который в зависимости от машины может быть и 4, и 8, и 2, и т.д. байт. А вообще, да, sizeof() для самой записи и lstrlenW (и еще множество вариантов, вроде нулевого элемента строки в паскале) для юникод-строк.
B_N вне форума Ответить с цитированием
Старый 25.01.2008, 00:38   #4
Мессир
Пользователь
 
Аватар для Мессир
 
Регистрация: 24.01.2008
Сообщений: 12
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Кто запретил использовать Length() ?

TTest, размер записи = SizeOf(TTest);
Узнать параметр Length(param1) + Length(param2)
тогда уж Length(param1)*sizeof(char)?

Но придётся ведь все параметры в ручную обрабатывать, о чём я писал выше, а их может быть с десяток...

если б можно было сделать перебор в цикле всех полей записи... типа
"foreach (a in Ttest) size := size + length(a)*sizeof(char);" - типа подобное что-нибудь?!!
Плохо, когда не знаешь, да ещё и забудешь.
Мессир вне форума Ответить с цитированием
Старый 25.01.2008, 00:41   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Мессир, Вы чего делаете-то, никак не пойму? размер строки определяете или размер структуры?
B_N вне форума Ответить с цитированием
Старый 25.01.2008, 00:52   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

sizeof(char) - ничего подобного сроду не видел ))) какой смысл умножать на 1 ? Или я математику призабыл... Поставьте точный вопрос ! И зачем всякие циклы если структуру всеравно не поменять во время выполнения программы. Опишите функцию которая возвращает размер структуры и юзайте ее, в чем проблема, уточните, что вы делаете со структурой ?

Последний раз редактировалось BOBAH13; 25.01.2008 в 00:58.
BOBAH13 вне форума Ответить с цитированием
Старый 25.01.2008, 00:55   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
sizeof(char) - ничего подобного сроду не видел )))
Он, очевидно, имел в виду sizeof(TCHAR)
B_N вне форума Ответить с цитированием
Старый 25.01.2008, 00:59   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
Он, очевидно, имел в виду sizeof(TCHAR)
Извините, а не припомню чтобы в дельфи ( я использую 7ю версию ) был такой тип TChar ?! и даже если так, то какой смысл умножать на это ?!
BOBAH13 вне форума Ответить с цитированием
Старый 25.01.2008, 01:04   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Потому, что у него размер short - два байта
B_N вне форума Ответить с цитированием
Старый 25.01.2008, 01:04   #10
Мессир
Пользователь
 
Аватар для Мессир
 
Регистрация: 24.01.2008
Сообщений: 12
По умолчанию

Эх, нужно определить размер того, что хранится в структуре. Есть запись, в переменных param1 & param2 хранятся значения, переменных этих может быть 10, может быть 20, и надо определить размер в байтах всей записи! Не отдельно каждого поля записи! И не размер указателей на widestring, а именно того, что хранится в записи для последующей блочной записи в файловый поток.

Вот я и хочу описать функцию, которая высчитывает размер всех данных, хранящихся в структуре, но я не хочу писать типа:
inc(size, lstrlenW(param1));
inc(size, lstrlenW(param2));
inc(size, lstrlenW(param3));
это было бы неплохо как-то автоматизировать... Ибо таких записей может быть несколько, и для каждой писать такую функцию, конечно, не составит огромного труда, но как-то некрасиво получается...
Плохо, когда не знаешь, да ещё и забудешь.
Мессир вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
определить тактовою частоту процессора и узнать название активной видеокарты и объём памяти SalasAndriy C++ Builder 7 14.04.2012 16:17
Найти объём куба и площадь его боковой поверхности BASIC Ветренная Помощь студентам 23 02.06.2008 13:15
record/file potion Паскаль, Turbo Pascal, PascalABC.NET 3 10.05.2008 20:15
ОБъём скачанного из интернета Kostia Работа с сетью в Delphi 2 23.11.2007 00:25
Направьте на путь истинный! [FlekS] Помощь студентам 3 20.02.2007 11:51