PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Помогите перевести с СИ одну строку


Помогите перевести с СИ одну строку

Сообщений 1 страница 12 из 12

1

вот что винда пишет
Можно протестировать элемент для значения флага #MF_ENABLED, #MF_STRING, #MF_UNCHECKED или #MF_UNHILITE.
Однако, поскольку эти значения равны нулю, необходимо использовать выражение для их проверки.

Flag Выражение для проверки флага
#MF_ENABLED ! (Flag&(#MF_DISABLED | #MF_GRAYED))
#MF_STRING ! (Flag&(#MF_BITMAP | #MF_OWNERDRAW))
#MF_UNCHECKED ! (Flag&#MF_CHECKED)
#MF_UNHILITE ! (Flag&#HILITE)

не могу понять как оно должно работать, может в СИ ! и & что то другое означают?
что они под флагом имеют ввиду?
пробовал то что возвращает структура MENUITEMINFO

0

2

newJS написал(а):

не могу понять как оно должно работать, может в СИ ! и & что то другое означают?

То же что в PB.
Попробуйте.

Код:
Flag=0

Debug Bool(#MF_ENABLED ! (Flag&(#MF_DISABLED | #MF_GRAYED)))
Debug Bool(#MF_STRING ! (Flag&(#MF_BITMAP | #MF_OWNERDRAW)))
Debug Bool(#MF_UNCHECKED ! (Flag&#MF_CHECKED))
Debug Bool(#MF_UNHILITE ! (Flag&#HILITE))

0

3

не, так возвращает для всех элементов одно и тоже, есть константа или нет константы
пару часов развлекался по разному и функцию пробовал и напрямую со структурой, одно и тоже возвращает

0

4

Как выглядит код на Си?

0

5

Есть один бестолковый способ - https://godbolt.org/

0

6

Поразрядные операции
Поразрядные операции также проводятся только над разрядами целочисленных операндов:

&: поразрядная конъюнкция (операция И или поразрядное умножение). Возвращает 1, если оба из соответствующих разрядов обоих чисел равны 1

|: поразрядная дизъюнкция (операция ИЛИ или поразрядное сложение). Возвращает 1, если хотя бы один из соответствующих разрядов обоих чисел равен 1

^: поразрядное исключающее ИЛИ. Возвращает 1, если только один из соответствующих разрядов обоих чисел равен 1

~: поразрядное отрицание. Инвертирует все разряды операнда. Если разряд равен 1, то он становится равен 0, а если он равен 0, то он получает значение 1.
===============
Логические операторы: «И», «ИЛИ» и «НЕ»:

AND (&&). Возвращает истину, только если оба операнда ненулевые. В противном случае он возвращает ложь (0).
OR (||). Если любой из двух операндов ненулевой, то условие становится истинным.
NOT (!). Используется для преобразования в обратное логическое состояние своего операнда. Если условие истинно, то оператор NOT сделает его ложным, и наоборот.
===========
Чувствую, что ! меня смущает в соседстве с & и |

Смотреть детально по битно ...
Если нужно именно побитно, а не логически???
0000000000000000 - 0000- ENABLED
0000000000000010 - 0002- DISABLED
0000000000000001 - 0001- GRAYED
0000000000000000 - 0000- STRING
0000000000000100 - 0004- BITMAP
0000000100000000 - 0256- OWNERDRAW
0000000000000000 - 0000- UNCHECKED
0000000000001000 - 0008- CHECKED
0000000000000000 - 0000- UNHILITE
0000000010000000 - 0128- HILITE

Код:
Debug RSet(Bin(#MF_ENABLED   ), 16, "0") + " - " + RSet(Str(#MF_ENABLED   ), 4, "0") + "- ENABLED"
Debug RSet(Bin(#MF_DISABLED  ), 16, "0") + " - " + RSet(Str(#MF_DISABLED  ), 4, "0") + "- DISABLED"
Debug RSet(Bin(#MF_GRAYED    ), 16, "0") + " - " + RSet(Str(#MF_GRAYED    ), 4, "0") + "- GRAYED"
Debug RSet(Bin(#MF_STRING    ), 16, "0") + " - " + RSet(Str(#MF_STRING    ), 4, "0") + "- STRING"
Debug RSet(Bin(#MF_BITMAP    ), 16, "0") + " - " + RSet(Str(#MF_BITMAP    ), 4, "0") + "- BITMAP"
Debug RSet(Bin(#MF_OWNERDRAW ), 16, "0") + " - " + RSet(Str(#MF_OWNERDRAW ), 4, "0") + "- OWNERDRAW"
Debug RSet(Bin(#MF_UNCHECKED ), 16, "0") + " - " + RSet(Str(#MF_UNCHECKED ), 4, "0") + "- UNCHECKED"
Debug RSet(Bin(#MF_CHECKED   ), 16, "0") + " - " + RSet(Str(#MF_CHECKED   ), 4, "0") + "- CHECKED"
Debug RSet(Bin(#MF_UNHILITE  ), 16, "0") + " - " + RSet(Str(#MF_UNHILITE  ), 4, "0") + "- UNHILITE"
Debug RSet(Bin(#MF_HILITE    ), 16, "0") + " - " + RSet(Str(#MF_HILITE    ), 4, "0") + "- HILITE"

Отредактировано useful (24.04.2025 14:33:03)

0

7

newJS
Может я чего не понимаю но мне код изначально выглядит бредом
Из флага #MF_ENABLED убираются флаги #MF_DISABLED и #MF_GRAYED. На сколько я понимаю флаги бинарные 1-2-4-8-16 и т.д. Как из бинарного флага не являющегося суммой флагов можно исключить другие флаги, если он содержит всего один флаг - сам себя? Ну это гепотетически, а в реальности:

Код:
Debug #MF_ENABLED ; 0
Debug #MF_GRAYED ; 1
Debug #MF_DISABLED ; 2

#MF_ENABLED как бы не содержит вообще флага, так как нет флагов, дефолтное состояние, поэтому вычесть из него флаги не получится.

0

8

взято здесь
https://learn.microsoft.com/en-us/windo … tmenustate
может скопировал не правильно

0

9

Там просто таблица, где энэйбле показан как откюченные стили грэй и дизабле.

0

10

Попробуйте

Код:
Flag=0

Debug Bool(Not (Flag&(#MF_DISABLED | #MF_GRAYED)))
Debug Bool(Not (Flag&(#MF_BITMAP | #MF_OWNERDRAW)))
Debug Bool(Not (Flag&#MF_CHECKED))
Debug Bool(Not (Flag&#MF_HILITE))

0

11

Я только не понял какая альтернатива у MF_STRING
А у остальных просто предлагается способ проверить 0 или 1 в соответствующем бите

Код:
If Not Bool(#MF_ENABLED   & (#MF_DISABLED | #MF_GRAYED)) : Debug "ok" : EndIf
If Not Bool(#MF_STRING    & (#MF_BITMAP   | #MF_OWNERDRAW)) : Debug "ok" : EndIf
If Not Bool(#MF_UNCHECKED & #MF_CHECKED) : Debug "ok" : EndIf       
If Not Bool(#MF_UNHILITE  & #MF_HILITE)  : Debug "ok" : EndIf 

p.s. но способ точно не единственный

0

12

w32.inc из пакета Борман TASM 5. А если почитать справку win32.hlp, то вопросы отпадут

Код:
MF_SEPARATOR    	equ	00000800h
;
MF_ENABLED    	equ	00000000h
MF_GRAYED    	equ	00000001h
MF_DISABLED    	equ	00000002h
;
MF_UNCHECKED    	equ	00000000h
MF_CHECKED    	equ	00000008h
MF_USECHECKBITMAPS    equ	00000200h
;
MF_STRING    	equ	00000000h
MF_BITMAP    	equ	00000004h
MF_OWNERDRAW    	equ	00000100h
;
MF_POPUP    	equ	00000010h
MF_MENUBARBREAK    	equ	00000020h
MF_MENUBREAK    	equ	00000040h
;
MF_UNHILITE    	equ	00000000h
MF_HILITE    	equ	00000080h

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Помогите перевести с СИ одну строку