![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
типы
zibert © (2013-10-02 21:42:00)Dxe4. пишу без проверки на d (сейчас нет возможности проверить), но было примерно так. Поясните, почему так?
..Unit1;
..
Type TMy=Record
x:String[32];
..
end;
..
Impl..
..
uses unit2;
..
proc..e MyForm.Btn1Click(sender:..);
begin
showmessage(inttostr(sizeof(TMy.x))); // показывает 33
end;
proc..e MyForm.Btn2Click(sender:..);
begin
showmessage(inttostr(myproc2(TMy.x))); // показывает 3, а жду 32 - - - почему?
end;
..Unit2;
..
fun..n MyProc2(s:string):integer;
begin
result:=sizeof(s)-1;
end;
Dimka Maslov (2013-10-03 12:01:00) [1]1. Используй array[1..32] of Char
2. Используй sizeof
3. ???
4. PROFIT
ProgRAMmer Dimonych (2013-10-03 09:36:00) [2]> Приведи точное описание входных данных и того, что ты хочешь
> получить. А то многоточия одни какие то.
<OffTop>
Это не многоточия. Это эти, как их?.. Немноготочия! Многоточия — они вот такие: … Ну или в крайнем случае вот такие: ...
</OffTop>
Anatoly Podgoretsky (2013-10-03 00:49:00) [3]А ты тоже отвечай многоточиями
DVM (2013-10-03 00:38:00) [4]
> zibert (03.10.13 00:34) [13]
> блин чегото савсем запутался. мне нужно что - еще раз -
> получить размер подтипа в скобках. их там очень много и
> отдельные константы не оч. хочется объявлять. может не так
> объясняю? :(
Приведи точное описание входных данных и того, что ты хочешь получить. А то многоточия одни какие то.
zibert (2013-10-03 00:38:00) [5][14]
спасибо. пойду еще раз читать :( пока не доходит.
zibert (2013-10-03 00:36:00) [6]где r - это какаято временная переменная x или на худой случай сам тип.
DVM (2013-10-03 00:36:00) [7]
> как же так?
А вот так.
string[32] - это короткая Ansi строка, такая как была в старом добром паскале (почти). Ее размер 33 (32 символа + нулевой байт под размер), в чем ты сам убедился.
zibert (2013-10-03 00:34:00) [8]блин чегото савсем запутался. мне нужно что - еще раз - получить размер подтипа в скобках. их там очень много и отдельные константы не оч. хочется объявлять. может не так объясняю? :(
вот вопрос, имея запись типа Type TMy в сообщении [0] могу я какой-нибудь функцией, не зная описания типа вытащить размер подтипов записи, т.е.
..
uses unit1;
..
var
x:TMy;
..
Imp..
Fun..n MyRecLen(r:?):integer;
begin
result:=length\sizeof\or (r) // ?
end;
zibert (2013-10-03 00:28:00) [9]т.е. в последнем sizeof должно показать как минимум 2(4?). а по вашему будет 1?
zibert (2013-10-03 00:26:00) [10]>> String[32] - это тоже shortstring
как же так? там вроде в хелпе читаю, что если
mystr0:shortstring;
mystr1:ansistring;
mystr2:widestring;
mystr3:unicodestring;
а unicodestring почти = string умолчальному (w+a)
то по ихнему (и как думаю)
String[32]=должно быть widestring[32] как минимум, ну а как ожидаю unicodestring[32], с соответствующими размерами позиций разными (sizeof(y[1])), где y - тип строки
zibert (2013-10-03 00:19:00) [11]спасиб, сеня попробую.
DVM (2013-10-03 00:00:00) [12]
> zibert (02.10.13 23:35) [5]
> мне нужно получить размер подзаписи\подтипа который в [скобках]
> в типе указан.
ясно
> а при этом все мои юникоды в стр. не обрежет?
Смотря как ты свои юникоды туда положишь. String[32] - это тоже shortstring и вообще говоря не юникод.
Хочу заметить, что параметр надо объявить не как shorstring непосредственно (его размер 255), а так:
TMyString = string[32];
TMyRec=Record
x: TMyString;
end;
function MyProc2(s: TMyString): integer;
только нафига это все надо непонятно, размер строки нам и так известен.
Германн (2013-10-02 23:59:00) [13]
> мне нужно получить размер подзаписи
Размер x:String[32]всегда будет 33. Независимо от длины строки, которая в нем хранится.
> а при этом все мои юникоды в стр. не обрежет?
Обрежет. Так же как и в String[32].
zibert (2013-10-02 23:40:00) [14]>> shortstring
а при этом все мои юникоды в стр. не обрежет?
zibert (2013-10-02 23:37:00) [15]>> и в своей функции MyProc2 ты замеряешь размер указателя и вычитаешь из него 1
а, кажется доходит. т.е. в myproc2 я беру размер не от того что в нее засылаю, а от переменной в ее параметрах... тогда вот вопрос - как в ней вычислить то, что указано в [] в типе.
zibert (2013-10-02 23:35:00) [16]length в первом и втором случае случае покажет неправильные значения. я пробовал. мне нужно получить размер подзаписи\подтипа который в [скобках] в типе указан.
DVM (2013-10-02 22:48:00) [17]
> zibert
И вообще, для вычисления дины строки есть функция Length()
DVM (2013-10-02 22:46:00) [18]
> Поясните, почему так?
потому, что string - ссылочный тип и имеет размер указателя, т.е 4 байта в 32 бит системах, и в своей функции MyProc2 ты замеряешь размер указателя и вычитаешь из него 1. Надо поменять тип параметра функции на shortstring.
Германн (2013-10-02 22:43:00) [19]Все размеры показаны абсолютно верно.
zibert (2013-10-02 21:44:00) [20]может неправильно функцию вызываю? как правильно передать параметр, чтобы размер показала?