Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
ВнизЧто подумает об этом компилятор? Найти похожие ветки
← →
NL (2007-09-18 00:13) [0]Всем привет!
SizeOf(2) - выделит 1, 2 или 4 байта? И чем он (компилятор) будет руководствоваться?
← →
Dimaxx © (2007-09-18 00:15) [1]Попробуй и увидишь. Я думаю будет 4, ибо "по умолчанию" используется 32-разрядный тип.
← →
Сергей М. © (2007-09-18 00:15) [2]А рядом деньги ходят)
← →
Сергей М. © (2007-09-18 00:20) [3]
> SizeOf(2) - выделит 1, 2 или 4 байта?
Когда SizeOf(..) чего-то там кому-то там выделит - "Я дам тебе знать - И ты вернешься ко мне" (С) Макар
← →
NL (2007-09-18 00:20) [4]
> Сергей М. © (18.09.07 00:15) [2]
т.е.?
← →
NL (2007-09-18 00:22) [5]А тут все в поряде:
type
PSomeRecord = ^TSomeRecord;
TSomeRecord = record
F1: Byte;
F2: DWORD;
end;
function GetSomeRecord: PSomeRecord;
var
A: Byte;
B: DWORD;
begin
A := 1;
B := 2;
GetMem(Result, SizeOf(A) + SizeOf(B));
Result^.F1 = A;
Result^.F2 = B;
end;
?
← →
Суслик © (2007-09-18 00:25) [6]практика - критерий истины.
я не помню, что константы специфицированы в сорв. версии дельфи.
раньше было что-то вроде.
← →
NL (2007-09-18 00:25) [7]
> Dimaxx © (18.09.07 00:15) [1]
Нифига SizeOf(2) = 1; SizeOf(256) = 2;
← →
Сергей М. © (2007-09-18 00:27) [8]
> A: Byte;
SizeOf(A) = 1
← →
Dimaxx © (2007-09-18 00:28) [9]Не вижу связи сабжа с [5]...
← →
NL (2007-09-18 00:29) [10]
> Не вижу связи сабжа с [5]...
Там есть ошибка, а какая - не знаю. Вот, подумал, может с выделением памяти?
← →
Сергей М. © (2007-09-18 00:33) [11]
> Там есть ошибка, а какая - не знаю
Лучшего удобрения Орешнику нет и не будет)
← →
DrPass © (2007-09-18 00:34) [12]
> А тут все в поряде:
> type
> PSomeRecord = ^TSomeRecord;
> TSomeRecord = record
> F1: Byte;
> F2: DWORD;
> end;
>
> function GetSomeRecord: PSomeRecord;
> var
> A: Byte;
> B: DWORD;
> begin
> A := 1;
> B := 2;
> GetMem(Result, SizeOf(A) + SizeOf(B));
> Result^.F1 = A;
> Result^.F2 = B;
> end;
> Там есть ошибка, а какая - не знаю. Вот, подумал, может
> с выделением памяти
С выравниванием полей
Тогда уже TSomeRecord = packed record
← →
NL (2007-09-18 00:42) [13]
> С выравниванием полей
Ну и что получится?
← →
DrPass © (2007-09-18 00:44) [14]
> NL (18.09.07 00:42) [13]
>
> > С выравниванием полей
>
> Ну и что получится?
Да, это вопрос на 5 баллов :)
Как это что? За тобой прилетят братья по разуму с планеты Плюк и привезут два эцика с КЦ на своем пепелаце.
← →
NL (2007-09-18 00:47) [15]
> Да, это вопрос на 5 баллов :)
> Как это что? За тобой прилетят братья по разуму с планеты
> Плюк и привезут два эцика с КЦ на своем пепелаце.
Задай, плз, значения переменным, чтобы вылезла ошибка. Я что-то не могу.
> Сергей М. © (18.09.07 00:33) [11]
Подсказал бы, а орешник не будет забыт.
← →
DrPass © (2007-09-18 01:00) [16]
> Задай, плз, значения переменным, чтобы вылезла ошибка
Причем здесь значения? Sizeof значений никоим образом не касается. Эта функция проверяет только тип. Это грубо говоря, т.к. на самом деле это и не функция даже, а такой себе compiler-magic макрос, на этапе компиляции заменяющийся на вычисленный по ходу размер переменной.
← →
Суслик © (2007-09-18 01:01) [17]есть еще порох в пороховницах, не разучился искать (хелп из д2007 - ms-help://borland.bds5/devcommon/declaredconstants_xml.html)
Types for integer constants
Range of constant(hexadecimal) Range of constant(decimal) Type
-$8000000000000000..-$80000001 -2^63..-2147483649 Int64
-$80000000..-$8001 -2147483648..-32769 Integer
-$8000..-$81 -32768..-129 Smallint
-$80..-1 -128..-1 Shortint
0..$7F 0..127 0..127
$80..$FF 128..255 Byte
$0100..$7FFF 256..32767 0..32767
$8000..$FFFF 32768..65535 Word
$10000..$7FFFFFFF 65536..2147483647 0..2147483647
$80000000..$FFFFFFFF 2147483648..4294967295 Cardinal
$100000000..$7FFFFFFFFFFFFFFF 4294967296..2^631 Int64
-----------
Думаю, что это ответ на вопрос?
← →
Суслик © (2007-09-18 01:07) [18]
> NL (18.09.07 00:13)
> Всем привет!
> SizeOf(2) - выделит 1, 2 или 4 байта? И чем он (компилятор)
> будет руководствоваться?
Можно умный вещь скажу, только тыне обижайся (с)
Если ты хочешь заложица на то, что SizeOf(2) = 1, то напиши в коде{$if sizeof(2)<>1}
ошибка
{$ifend}
При переезде на новую версию Дельфи будешь уверен, что нет регресса и все работает точно также как раньше.
← →
Германн © (2007-09-18 01:14) [19]
> Суслик © (18.09.07 01:07) [18]
>
Если это шутка юмора, то не понял, где нужно смеяться.
← →
NL (2007-09-18 01:15) [20]
> {$if sizeof(2)<>1}
> ошибка
> {$ifend}
ShowMessage(IntToStr(SizeOf(2)));
рисует 1!
> Думаю, что это ответ на вопрос?
Сомневаюсь
> DrPass © (18.09.07 01:00) [16]
Когда может произойти ошибка?
← →
DrPass © (2007-09-18 01:16) [21]
> Германн © (18.09.07 01:14) [19]
Почему шутка? Это естественное следствие
> на самом деле это и не функция даже, а такой себе compiler-
> magic макрос
← →
Германн © (2007-09-18 01:18) [22]
> ShowMessage(IntToStr(SizeOf(2)));
>
> рисует 1!
>
Плюнь и разотри. Бо значение SizeOf(2) не имеет никакого практического смысла.
← →
DrPass © (2007-09-18 01:21) [23]
> NL (18.09.07 01:15) [20]
> ShowMessage(IntToStr(SizeOf(2)));
>
> рисует 1!
Да. Ну и что?
> > Думаю, что это ответ на вопрос?
>
> Сомневаюсь
Это ответ на вопрос. Вспомни старую поговорку "смотрим в книгу, видим фигу"
> Когда может произойти ошибка?
GetMem(Result, SizeOf(A) + SizeOf(B)) выделяет 5 байт. В то же время TSomeRecord занимает по умолчанию 16 байт, если она неупакована. Такая некорректная работа привести к AV, к повреждению значений других переменных... а может не привести. Это уж как повезет.
← →
Суслик © (2007-09-18 01:23) [24]
> NL (18.09.07 01:15) [20]
> ShowMessage(IntToStr(SizeOf(2)));
>...
> Сомневаюсь
Эта, автар. Я же привел кусок справки (справка, правда, говно - но это всем известно). Так по ней получаетца, что 1 и должно быть.
Т.е. ты нашел ответ. Что еще надо?
Если хочешь не потерять совместимость с новой версией Дефльи, то воспользуйся советом из [18].
← →
NL (2007-09-18 01:41) [25]
> Бо значение SizeOf(2) не имеет никакого практического смысла.
Я не говорил о практическом смысле.
> Так по ней получаетца, что 1 и должно быть.
Согласен, но это не ответ на вопрос.
> DrPass © (18.09.07 01:21) [23]
> В то же время TSomeRecord занимает по умолчанию 16 байт
Это почему же? Я думал 8.
← →
Суслик © (2007-09-18 01:44) [26]
> NL (18.09.07 01:41) [25]
>
> > Так по ней получаетца, что 1 и должно быть.
>
> Согласен, но это не ответ на вопрос.
ну тогда ищи свой ответ :)
← →
Германн © (2007-09-18 01:46) [27]
> NL (18.09.07 01:41) [25]
>
>
> > Бо значение SizeOf(2) не имеет никакого практического
> смысла.
>
> Я не говорил о практическом смысле.
>
А вот это зря.
← →
Anatoly Podgoretsky © (2007-09-18 08:38) [28]> NL (18.09.2007 00:22:05) [5]
Ты больше так не пиши, а то потом удивляемся почему АЭС на воздух взлетают
← →
Anatoly Podgoretsky © (2007-09-18 08:40) [29]> NL (18.09.2007 00:47:15) [15]
> Подсказал бы, а орешник не будет забыт.
Не уже ли за инструментом пойдешь?
← →
Anatoly Podgoretsky © (2007-09-18 08:42) [30]> Суслик (18.09.2007 01:23:24) [24]
А как ты эту справку интерпритируешь?
← →
Anatoly Podgoretsky © (2007-09-18 08:42) [31]> NL (18.09.2007 01:41:25) [25]
> Это почему же? Я думал 8.
Чего тут думать, трясти надо.
← →
имя (2007-09-18 08:50) [32]Удалено модератором
← →
isasa © (2007-09-18 09:04) [33]А написать
GetMem(Result, SizeOf(TSomeRecord));
не сподобил Господь, или это изошренный пример на ловле выравнивания полей в записи ... :)
"Так жить(писать) нельзя" (с) Кто-то.
← →
clickmaker © (2007-09-18 09:32) [34]тестовое задание в яндекс-деньги?
← →
Суслик © (2007-09-18 12:58) [35]
> [30] Anatoly Podgoretsky © (18.09.07 08:42)
> > Суслик (18.09.2007 01:23:24) [24]
> А как ты эту справку интерпритируешь?
сложно ее интерпретировать, ибо загадочен смысл строки0..$7F 0..127 0..127
Но есть у меня ощущение, что константа 2 типа shortint. Посему 1.
← →
DiamondShark © (2007-09-18 13:12) [36]
> загадочен смысл строки
> 0..$7F 0..127 0..127
Чего загадочного? Там же колонки подписаны.
Константа из диапазона 0..127 имеет тип 0..127.
Значит для sizeof(2) вернёт sizeof(T), где type T=0..127
← →
Denis_ © (2007-09-18 13:13) [37]
> Я не говорил о практическом смысле.
Тоды зачем ты сюды писал? ИМХО смысла нет.
← →
Anatoly Podgoretsky © (2007-09-18 13:31) [38]
> Но есть у меня ощущение, что константа 2 типа shortint.
> Посему 1.
Byte := 1;
Word := 1;
Integer := 1;
Int64 := 1;
Что теперь скажешь?
Как много людей не понимает, что такое константы.
← →
Anatoly Podgoretsky © (2007-09-18 13:32) [39]
> Значит для sizeof(2) вернёт sizeof(T), где type T=0..127
Не имеет практического смысла.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.041 c