Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размер содержимого переменной 
:(
    Опции темы
Akella
Дата 25.3.2005, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Есть пример:
Код

For i:=0 to 1000 do
  StringVar := StringVar +'текст'+'текст'


Как узнать размер текстовой переменной В БАЙТАХ, а не в символах?

SizeOf(StringVar) показывает 4 байта постоянно.
PM MAIL   Вверх
Петрович
Дата 25.3.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Length(StringVar)*SizeOf(StringVar[1]) + 4*3 + 4
Добавлено @ 15:45
Но, если StringVar содержит MultiByte строку, то эта формула не прокатит.

Это сообщение отредактировал(а) Петрович - 25.3.2005, 15:44


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Akella
Дата 25.3.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



что есть MultiByte строка
PM MAIL   Вверх
Akella
Дата 25.3.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Слышь, Петрович, а если переменную сохранить в файл (обычный текстовый), размер файла будет тот же, что и по этой формуле, которую ты дал?



Это сообщение отредактировал(а) dsergey - 25.3.2005, 16:05
PM MAIL   Вверх
~FoX~
Дата 25.3.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



dsergey
Нет, размер файла будет в размер кластера.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Akella
Дата 25.3.2005, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



В размер кластера на диске, а на самом деле?
PM MAIL   Вверх
~FoX~
Дата 25.3.2005, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Точно, это он места на диске будет занимать кратное размеру кластера, а истенный размер будет то, что тебе надо.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Akella
Дата 26.3.2005, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата
Length(StringVar)*SizeOf(StringVar[1]) + 4*3 + 4

Я понимаю что, мы, программисты, любим понавыдумывать, но чтоб такое. Пучуму именно так?
PM MAIL   Вверх
Петрович
Дата 26.3.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата(dsergey @ 26.3.2005, 11:27)
Я понимаю что, мы, программисты, любим понавыдумывать, но чтоб такое. Пучуму именно так?

Почитай мою статью. Если после этого останутся еще вопросы, задавай.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Marriage
Дата 26.3.2005, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Length(StringVar)*SizeOf(char)

Может быть я слепой, но почему + 4*3 + 4 я так и не понял. smile
ничего умне в голову пока не пришло ...

Это сообщение отредактировал(а) Marriage - 26.3.2005, 20:42


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Петрович
Дата 28.3.2005, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата(Marriage @ 26.3.2005, 20:19)
но почему + 4*3 + 4 я так и не понял. 
ничего умне в голову пока не пришло ...

Блин, ошибочка вышла. Если точнее, то размер равен Length(StringVar)*SizeOf(StringVar[1]) + 1 + 4*2 + 4
Для тех кому не понятно поясню:
+ 1 - это дополнительный признак конца строки - символ с кодом 0 (#0)
+ 4*2 - это два слова находящиеся перед самой строкой Счётчик ссылок и Длина строки
+ 4 - это собственно переменная хранящая указатель на строку.

Но, возможно, что данный размер еще округляется до кратного машинному слову, или кванту распределения памяти. Точно не могу сказать, не помню. smile Да за частую, это уже не имеет значения.



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Akella
Дата 31.3.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Петрович, смотри, что получается

размер текстового файла кодировки OEM (DOS) - 3921,
копируем через буфер в memo1,
считаем по "твоему методу":

Код

Function TfmMain.LengthStr(AString:String):String;
begin
  result := '-1';
  if AString <> '' then
   result := IntToStr(Length(AString)*SizeOf(AString[1]) + 1 + 4*2 + 4);
end;


Код

 ShowMessage(LengthStr(memo1.Text));
 выдает 4010


а если сохранить содержимое memo1 в файл(memo1.lines.savetofile('c:\11.txt')),
то вообще показывает 3997. smile

Это сообщение отредактировал(а) dsergey - 31.3.2005, 14:26
PM MAIL   Вверх
Coder
Дата 31.3.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



а разве 1 символ не равен 1 байту, тем более если речь идет о ПЕРЕМЕННОЙ? smile
PM MAIL   Вверх
Snowy
Дата 31.3.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Так какой размер ты хочешь получить?
Размер занимаемой памяти переменной String или размер файла в байтах?
Если размер файла, то просто берешь количество символов, добавляешь к ним количество строк*2 - это и будет размер файла.

Цитата(dsergey @ 31.3.2005, 14:24)
размер текстового файла кодировки OEM (DOS) - 3921,
если сохранить содержимое memo1 в файл(memo1.lines.savetofile('c:\11.txt')),
то вообще показывает 3997.

Естественно. Мемо переносит строки, которые не влазят по ширине.
И, когда ты сохраняешь, строк становится больше.
А, как я писал выше, к размеру добавляется кол-во строк*2.
Вот из-за этого и возникла погрешность - строк стало больше, размер вырос.
PM MAIL   Вверх
Akella
Дата 7.4.2005, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



По подсчетам - 91581 байт (формула Петровича)
Размере файла - 91144 байт (это не размер на диске, прошу не путать)

Получается разница в 437 байт

Почему так?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.