Forth
http://www.fforum.winglion.ru/

конвертирование флагов
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2310
Страница 1 из 2

Автор:  mOleg [ Чт ноя 12, 2009 17:46 ]
Заголовок сообщения:  конвертирование флагов

уже отмечалось, что флаговые значения в представлении Форта отличаются от общепринятых (к примеру в Сях)
преобразование Форт-флагов в Сишные и обратно:
<pre>
\ конвертировать сишный флаг в Форт-представление
: >flag ( f --> flag ) 1 - INVERT ;

\ конвертировать Фот-флаг в сишный
: flag> ( flag --> f ) 0 <> 1 AND ;
</pre>

Автор:  _Harry [ Чт ноя 12, 2009 19:14 ]
Заголовок сообщения: 

Что в форте появились флаги???
Это имеется в виду Fаlse и True.
Только мне сдается что любое значение отличное от 0 в Си будет True.
Так что конвертировать нет необходимости.
Или я не прав? :roll:

Автор:  mOleg [ Чт ноя 12, 2009 19:24 ]
Заголовок сообщения: 

эм, флаги в Форте всегда были, только их значения отличаются от привычных для других ээ, языков.
в Форте значение TRUE = -1 (то есть все биты уставновлены в 1)
значение FALSE = 0 (все биты сброшены).

Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).

Автор:  _Harry [ Чт ноя 12, 2009 19:27 ]
Заголовок сообщения: 

mOleg писал(а):
Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).

Хм ни разу с таким не сталкивался. Это скорее особености виндовых функций а не Си.
Что скажут знатоки стандартов??? :<

Автор:  Ilya [ Чт ноя 12, 2009 19:33 ]
Заголовок сообщения: 

_Harry писал(а):
mOleg писал(а):
Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).

Хм ни разу с таким не сталкивался. Это скорее особености виндовых функций а не Си.
Что скажут знатоки стандартов??? :<

Хоть я и не знаток стандартов, но столкнулся в именно с тем, что вызов API с произвольным значением <>0 не давало требуемого эффекта. Но это скорее "частный" (либа user32.dll ф-ции связанные с DDE) случай.
Взял справочник по Сям и увидел там что TRUE = 1 (а не любое значение >0 как в Форте)!!!

Автор:  VoidVolker [ Чт ноя 12, 2009 20:48 ]
Заголовок сообщения: 

mOleg писал(а):
в Форте значение TRUE = -1

А разве не TRUE = "не ноль" ?

Автор:  вопрос [ Чт ноя 12, 2009 23:11 ]
Заголовок сообщения: 

Цитата:
А разве не TRUE = "не ноль" ?
так должно быть, но бывает и иначе, по крайней мере ввиду индивидуальности каждого форта

Автор:  mOleg [ Пт ноя 13, 2009 07:55 ]
Заголовок сообщения: 

VoidVolker писал(а):
А разве не TRUE = "не ноль" ?

все операции, возвращающие флаги во всех Фортах возвращают в качестве TRUE значение -1 (все биты установлены).
однако, все операции анализирующие флаги (IF WHILE и т.п.) считают за TRUE отличное от нуля значение.

Автор:  chess [ Пт ноя 13, 2009 12:02 ]
Заголовок сообщения: 

mOleg писал(а):
преобразование Форт-флагов в Сишные и обратно:
\ конвертировать сишный флаг в Форт-представление
: >flag ( f --> flag ) 1 - INVERT ;

\ конвертировать Фот-флаг в сишный
: flag> ( flag --> f ) 0 <> 1 AND ;

Можно попроще:
Код:
\ конвертировать сишный флаг в Форт-представление
: >flag ( f --> flag ) NEGATE ;

\ конвертировать Форт-флаг в сишный
: flag> ( flag --> f ) 0<> NEGATE ;

Автор:  _Harry [ Пт ноя 13, 2009 18:06 ]
Заголовок сообщения: 

Ilya писал(а):
Взял справочник по Сям и увидел там что TRUE = 1 (а не любое значение >0 как в Форте)!!!

А вот я в википедии нашел.
Код:
typedef int bool;
#define FALSE 0
#define TRUE (-1)

Похоже у сишников тоже "..... порядку нет как нет" :dmad;

Автор:  mOleg [ Пт ноя 13, 2009 18:11 ]
Заголовок сообщения: 

скорее википедия глючит.
вообще, я так понимаю, проблема будет везде, где будет встречаться что-то подобное:
<pre>
if(value=true){someting};
</pre>
если же будет что-то вроде:
<pre>
if(value){someting};
</pre>
проблем быть вроде как не должно, хотя опять же как там будет преобразование типов в конкретном компиляторе проходить не известно.

в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си 8)

Автор:  _Harry [ Пт ноя 13, 2009 18:21 ]
Заголовок сообщения: 

mOleg писал(а):
скорее википедия глючит.

Вполне может быть, но я уже не раз встречал именно такой расклад.
Да и вполне известный факт что разработчики Си компиляторов не так уж
жестко придерживаются стандарта.
т.е. некотрые тоже поступают
mOleg писал(а):
вполне логично и удобно

Автор:  _Harry [ Пт ноя 13, 2009 18:35 ]
Заголовок сообщения: 

А вот еще чего нашел
The C99 version of C provides a built-in _Bool data type. It is large enough to store the values 0 and 1.
И вот еще....
During its standardization process, the C++ programming language introduced the bool, true and false keywords, adding a native data type to support Boolean data. Its size is implementation-defined.[3] bool was introduced in 1993[4].

Values of type bool are either true or false.[5] Implicit conversions exist between bool and other integral types, floating point types, pointer types, and pointer-to-member types.[6] In addition, user-defined types can be converted to bool via a user-defined conversion operator. In general, a zero or null-pointer value is converted to false, any other value is converted to true.

Автор:  dynamic-wind [ Чт ноя 19, 2009 16:29 ]
Заголовок сообщения: 

mOleg писал(а):
в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си 8)


Просто то, что называется каноническим значением истины, различается: 1 и -1.
Если каноническое значение 1, канонический способ инверсии есть операция "1 XOR"
Если каноническое значение -1, канонический способ инверсии есть операция "NOT"
У каждого выбора свои преимущества и недостатки.
В 4те, например, менее удобно прибавлять булеву величину к целому, чем в С:
sum += cond;
против
cond @ 1 AND sum +!

Автор:  вопрос [ Чт ноя 19, 2009 17:49 ]
Заголовок сообщения: 

Цитата:
в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си

Вот всегда ли хорошо критиковать промышленный стандарт? Может :wink: там не всё так нелогично?
Цитата:
if(value=true){someting};

если внутри if() действие вместо сравнения ( = вместо ==) то компилятор проглотит, но результаты непредсказуемы -
хотя GCC должен отловить как ошибку

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/