Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1189595935
S@D
2007-09-12 15:18
2007.10.14
Помогите ПЛИЗ!


2-1190484669
ari_9
2007-09-22 22:11
2007.10.14
Получить нажатие клавиши на произв. контроле без регистр. HotKey


8-1167946339
joseph
2007-01-05 00:32
2007.10.14
DSPack


3-1181226878
олег2
2007-06-07 18:34
2007.10.14
Delphi+Access


15-1189932164
исследователь
2007-09-16 12:42
2007.10.14
Работа с TAdoQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский