Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Вниз

"-1" vs "NOT(0)"   Найти похожие ветки 

 
Пробегал2...   (2008-05-13 20:32) [0]

Зачем в исходниках WinSock объявление сделали так:

INVALID_SOCKET    = TSocket(NOT(0));

Если можно было бы просто:

INVALID_SOCKET    = -1 ;

Как например следом объявленный:

SOCKET_ERROR      = -1;


 
Ketmar ©   (2008-05-13 21:02) [1]

потому что TSocket не обязан быть со знаком?


 
Renegat   (2008-05-13 21:09) [2]

> потому что TSocket не обязан быть со знаком?


 {$EXTERNALSYM u_int}
 u_int = Integer;
 {$EXTERNALSYM u_long}
 u_long = Longint;

{ The new type to be used in all
 instances which refer to sockets. }
 {$EXTERNALSYM TSocket}
 TSocket = u_int;

winSock.pas


 
Ketmar ©   (2008-05-13 21:11) [3]

> Renegat   (13.05.08 21:09) [2]
то, что в ранних Delphi не было u_int — не причина корёжить объявление. помедитируй на тему «что есть u_int в C» и «откуда взялся winsock.pas».

алсо, гугл по «автоматическая трансляция заголовков».


 
Renegat   (2008-05-13 21:15) [4]

Впрочем, а какая разница?


 
Renegat   (2008-05-13 21:16) [5]

TSocket(NOT(0)) = 0FFFFFFFFh = -1...


 
Игорь Шевченко ©   (2008-05-13 21:16) [6]

winsock.h

/*
* This is used instead of -1, since the
* SOCKET type is unsigned.
*/
#define INVALID_SOCKET  (SOCKET)(~0)
#define SOCKET_ERROR            (-1)


 
Ketmar ©   (2008-05-13 21:17) [7]

да никакой. к тому же делание дескриптора сокета беззнаковым — это опять m$-way. в нормальных системах оно знаковое, потому что при ошибке открытия принято возвращать -1. но то в нормальных системах, а то m$, которая даже bsd-код толком украсть не может.


 
Palladin ©   (2008-05-13 21:23) [8]


> Ketmar ©   (13.05.08 21:17) [7]

ну, скажем, не вся ms, а отдельные ее представители иногда радуют своим видением )


 
Ketmar ©   (2008-05-13 21:28) [9]

ничего, в связи с перспективами, открывающимися от sua (или как там *nix-запускалка в виста ынтерпрайз зовётся?) со страхом жду m$ posix.


 
Пробегал2...   (2008-05-13 21:32) [10]

Игорь Шевченко ©   (13.05.08 21:16) [6]
#define INVALID_SOCKET  (SOCKET)(~0)


ммм... Тогда у меня вопрос - а почему в winsock.h объвлено именно так, а не просто:

#define INVALID_SOCKET -1

Или в Define нельзя использовать отрицательные числа? А приведение:

(socket)(-1)

вызвало бы ошибку... Так?


 
Игорь Шевченко ©   (2008-05-13 21:35) [11]


> Тогда у меня вопрос - а почему в winsock.h объвлено именно
> так, а не просто:


наверное надо в оригинальный код BSD смотреть


 
Ketmar ©   (2008-05-13 21:36) [12]

> Пробегал2…   (13.05.08 21:32) [10]
медитируем: «This is used instead of -1, since the SOCKET type is unsigned.»
что неясно? (-1) не определено для unsigned типов.


 
Ketmar ©   (2008-05-13 21:39) [13]

> наверное надо в оригинальный код BSD смотреть
есть мнение, что там нет отдельного типа, оно там вовсе даже int. потому что все fd типа int.


 
Пробегал2...   (2008-05-13 22:04) [14]

Ketmar ©   (13.05.08 21:36) [12]
что неясно? (-1) не определено для unsigned типов


ну и что. Ведь там стоит приведение типов:

(SOCKET)(~0)

ты хочешь сказать, что такое объявление:

(SOCKET)(-1)

не сработало бы?


 
Ketmar ©   (2008-05-13 22:24) [15]

> ты хочешь сказать, что такое объявление:(SOCKET)(-1)не сработало
> бы?

какая размернсть у -1? приведение -1 к беззнаковому типу не расширяет знаковый бит. и если -1 было внутри компилятора размером shortint, например, то получится полная фигня. ку?


 
Ketmar ©   (2008-05-13 22:25) [16]

вдогон: таки гуглим про автоматическую трансляци. заголовков. сишный #define — вовсе не то же самое, что дельфийский const.


 
Пробегал2...   (2008-05-14 01:37) [17]

Ketmar ©   (13.05.08 22:24) [15]
приведение -1 к беззнаковому типу не расширяет знаковый бит. и если -1 было внутри компилятора размером shortint, например, то получится полная фигня. ку?


а если ноль был внутри компилятора размером shortint, то NOT(0) также не расширяет знаковый бит. Ку?


 
ketmar ©   (2008-05-14 01:41) [18]

> Пробегал2…   (14.05.08 01:37) [17]
ты моё «вдогон» прочёл? ты настолько наивен и считаешь, что в борланде всю ёту фиготень руками настукивали? #define там было, #define. а в Delphi аналога #define нет.


 
Пробегал2...   (2008-05-14 02:26) [19]

ketmar ©   (14.05.08 1:41) [18]
ты моё «вдогон» прочёл?


прочитал. Причем здесь транслятор? разговор уже пошел, почему в Си заголовках объявлено так:

#define INVALID_SOCKET  (SOCKET)(~0)

ведь можно было так:

#define INVALID_SOCKET  (SOCKET)(-1)


 
ketmar ©   (2008-05-14 02:33) [20]

> Пробегал2…   (14.05.08 02:26) [19]
нельзя. ну не определено -1 на беззнаковых. потому ~0 — это любой тип со всеми инвертированными битами (ибо явная операция). а (uint)(-1) — это запросто может быть байтовое -1, растянутое по правилам до uint (ибо приведение типов) — как компилятор захочет.

в первом случае имеем type tagging, во втором — type conversion. как конвертировать отрицательные в беззнаковые — не ясно.


 
Пробегал2...   (2008-05-14 02:56) [21]

ketmar ©   (14.05.08 2:33) [20]
нельзя. ну не определено -1 на беззнаковых


погодь... Так не будет такое определение работать в Си:

#define INVALID_SOCKET  (SOCKET)(-1)

компилятор C+ реально выдаст ошибку?

ketmar ©   (14.05.08 2:33) [20]
как конвертировать отрицательные в беззнаковые — не ясно


ну например в Delphi ясно как. А про Си я не знаю просто...

Или ты говоришь о том, что заголовочный файл он для всех C+ компиляторов, а интерпретация такого define зависит от компилятора, и например на VC++ это будет работать, а где-то может и не сработать. Поэтому сделали через ~0?


 
ketmar ©   (2008-05-14 03:24) [22]

> компилятор C+ реально выдаст ошибку?
не знаю, бредни страуса не использую.

> ну например в Delphi ясно как.
цитату, плиз, где это написано. я вот не знаю. и не имею гарантии, что реализация компилятора не поменяется.

> Или ты говоришь о том, что заголовочный файл он для всех
> C+ компиляторов, а интерпретация такого define зависит от
> компилятора, и например на VC++ это будет работать, а где-
> то может и не сработать. Поэтому сделали через ~0?

примерно так. поскольку операция не определена, то отработать может как угодно, вплоть до ошибки компиляции.


 
Anatoly Podgoretsky ©   (2008-05-14 08:57) [23]

> Пробегал2...  (14.05.2008 02:26:19)  [19]

Потому что не ламеры


 
Palladin ©   (2008-05-14 09:03) [24]

в D6,D7 константа
INVALID_SOCKET    = -1 ;
будет интерпретирована компилятором, как shortint и, позже, приведена к типу в контексте которого использована, не думаю, что ситуация изменилась и в более поздних версиях...



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.041 c
2-1212044089
pirks
2008-05-29 10:54
2008.06.22
Каскадные прокси


8-1182311899
Ryden
2007-06-20 07:58
2008.06.22
mp3 player


2-1211656476
SiAVeL
2008-05-24 23:14
2008.06.22
Вообще не знаю Delphi помогите пожалуйста.


2-1211998877
deled
2008-05-28 22:21
2008.06.22
узнать цвет пикселя в Image


2-1212055341
Сергей
2008-05-29 14:02
2008.06.22
WinAPI





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский