Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

Что подумает об этом компилятор?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.023 c
2-1190006417
bss
2007-09-17 09:20
2007.10.14
Как избавиться от мигания в гриде при переоткрытии запроса


2-1190044966
ANTPro
2007-09-17 20:02
2007.10.14
procedure RotateX


2-1190130186
Евгений Р.
2007-09-18 19:43
2007.10.14
Заштриховать область


2-1190372911
webpauk
2007-09-21 15:08
2007.10.14
Array of TmyRec


2-1189747819
artem779
2007-09-14 09:30
2007.10.14
как подключить модуль?