Mike Westerfield's "Toolbox Programming in C" contains a routine:
void HandleControl (void)
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
I'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.
Mike Westerfield's "Toolbox Programming in C" contains a routine:
void HandleControl (void)
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
I'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.
On Wednesday, May 31, 2023 at 3:17:30 PM UTC-4, Tom Thumb wrote:
Mike Westerfield's "Toolbox Programming in C" contains a routine:
void HandleControl (void)
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
I'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.Oh, it's checking to see if wmTaskData4 is less than 32768
On Thursday, June 1, 2023 at 11:25:59 AM UTC-5, Tom Thumb wrote:IDs of interest via the "switch".
On Wednesday, May 31, 2023 at 3:17:30 PM UTC-4, Tom Thumb wrote:
Mike Westerfield's "Toolbox Programming in C" contains a routine:
void HandleControl (void)
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
Yes, that's correct. In this case wmTaskData4 holds a control ID value, and all the control IDs that the code wants to check for are less than 32768. The "if" check is OK, but it's not really necessary, since the code could just check for the controlI'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.Oh, it's checking to see if wmTaskData4 is less than 32768
I suspect the "if" check is there because the code was originally written in Pascal for the Toolbox Programming in Pascal course and then later translated to C. The "case" statement in ORCA/Pascal can only handle values up to 32767, making a check likethis necessary, but the "switch" statement in C does not have the same limitation.
--
Stephen Heumann
On Thursday, June 1, 2023 at 2:05:06 PM UTC-4, [email protected] wrote:IDs of interest via the "switch".
On Thursday, June 1, 2023 at 11:25:59 AM UTC-5, Tom Thumb wrote:
On Wednesday, May 31, 2023 at 3:17:30 PM UTC-4, Tom Thumb wrote:
Mike Westerfield's "Toolbox Programming in C" contains a routine:
void HandleControl (void)
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
Yes, that's correct. In this case wmTaskData4 holds a control ID value, and all the control IDs that the code wants to check for are less than 32768. The "if" check is OK, but it's not really necessary, since the code could just check for the controlI'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.Oh, it's checking to see if wmTaskData4 is less than 32768
like this necessary, but the "switch" statement in C does not have the same limitation.I suspect the "if" check is there because the code was originally written in Pascal for the Toolbox Programming in Pascal course and then later translated to C. The "case" statement in ORCA/Pascal can only handle values up to 32767, making a check
--Ahh, thank you very much.
Stephen Heumann
May I ask though; why go about it this way: if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0) rather than: if(myEvent.wmTaskData4 <= 32767) ?
is there a reason? or just a choice?
On Thursday, June 1, 2023 at 8:33:08 PM UTC-4, Tom Thumb wrote:IDs of interest via the "switch".
On Thursday, June 1, 2023 at 2:05:06 PM UTC-4, [email protected] wrote: >>> On Thursday, June 1, 2023 at 11:25:59 AM UTC-5, Tom Thumb wrote:
On Wednesday, May 31, 2023 at 3:17:30 PM UTC-4, Tom Thumb wrote:Yes, that's correct. In this case wmTaskData4 holds a control ID value, and all the control IDs that the code wants to check for are less than 32768. The "if" check is OK, but it's not really necessary, since the code could just check for the control
Mike Westerfield's "Toolbox Programming in C" contains a routine:Oh, it's checking to see if wmTaskData4 is less than 32768
void HandleControl (void)
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
I'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.
like this necessary, but the "switch" statement in C does not have the same limitation.
I suspect the "if" check is there because the code was originally written in Pascal for the Toolbox Programming in Pascal course and then later translated to C. The "case" statement in ORCA/Pascal can only handle values up to 32767, making a check
Ahh, thank you very much.
--
Stephen Heumann
May I ask though; why go about it this way: if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0) rather than: if(myEvent.wmTaskData4 <= 32767) ?
is there a reason? or just a choice?
Am 02.06.23 um 19:15 schrieb Tom Thumb:control IDs of interest via the "switch".
On Thursday, June 1, 2023 at 8:33:08 PM UTC-4, Tom Thumb wrote:
On Thursday, June 1, 2023 at 2:05:06 PM UTC-4, [email protected] wrote:
On Thursday, June 1, 2023 at 11:25:59 AM UTC-5, Tom Thumb wrote:
On Wednesday, May 31, 2023 at 3:17:30 PM UTC-4, Tom Thumb wrote: >>>>> Mike Westerfield's "Toolbox Programming in C" contains a routine: >>>>>Yes, that's correct. In this case wmTaskData4 holds a control ID value, and all the control IDs that the code wants to check for are less than 32768. The "if" check is OK, but it's not really necessary, since the code could just check for the
void HandleControl (void)Oh, it's checking to see if wmTaskData4 is less than 32768
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
I'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.
like this necessary, but the "switch" statement in C does not have the same limitation.
I suspect the "if" check is there because the code was originally written in Pascal for the Toolbox Programming in Pascal course and then later translated to C. The "case" statement in ORCA/Pascal can only handle values up to 32767, making a check
Ahh, thank you very much.
--
Stephen Heumann
May I ask though; why go about it this way: if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0) rather than: if(myEvent.wmTaskData4 <= 32767) ?
is there a reason? or just a choice?
It is easier to read. :)
No, really. 32767 is meaningless in that context. wmTaskData4 contains a bunch of seperate settings coded as bits, not a single number.
0xFFFF8000 is 1111 1111 1111 1111 1000 0000 0000 0000 in binary form,
and by ANDing wmTaskData4 with this number, you say "I am only
interested in the upper 17 bits, ignore the lower bits."
The IF condition then means "If none of the settings in the upper 17
bits is set, do the following."
Dirk
On Thursday, June 8, 2023 at 7:17:06 AM UTC-4, Dirk Froehling wrote:control IDs of interest via the "switch".
Am 02.06.23 um 19:15 schrieb Tom Thumb:
On Thursday, June 1, 2023 at 8:33:08 PM UTC-4, Tom Thumb wrote:
On Thursday, June 1, 2023 at 2:05:06 PM UTC-4, [email protected] wrote:
On Thursday, June 1, 2023 at 11:25:59 AM UTC-5, Tom Thumb wrote: >>>> On Wednesday, May 31, 2023 at 3:17:30 PM UTC-4, Tom Thumb wrote: >>>>> Mike Westerfield's "Toolbox Programming in C" contains a routine: >>>>>
Yes, that's correct. In this case wmTaskData4 holds a control ID value, and all the control IDs that the code wants to check for are less than 32768. The "if" check is OK, but it's not really necessary, since the code could just check for thevoid HandleControl (void)Oh, it's checking to see if wmTaskData4 is less than 32768
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
I'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.
check like this necessary, but the "switch" statement in C does not have the same limitation.
I suspect the "if" check is there because the code was originally written in Pascal for the Toolbox Programming in Pascal course and then later translated to C. The "case" statement in ORCA/Pascal can only handle values up to 32767, making a
00000000000000001111111111111111, 0x7FFF, 32768 triggers that condition <shrug>Ahh, thank you very much.
--
Stephen Heumann
May I ask though; why go about it this way: if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0) rather than: if(myEvent.wmTaskData4 <= 32767) ?
is there a reason? or just a choice?
It is easier to read. :)
No, really. 32767 is meaningless in that context. wmTaskData4 contains a bunch of seperate settings coded as bits, not a single number.
0xFFFF8000 is 1111 1111 1111 1111 1000 0000 0000 0000 in binary form,
and by ANDing wmTaskData4 with this number, you say "I am only
interested in the upper 17 bits, ignore the lower bits."
The IF condition then means "If none of the settings in the upper 17
bits is set, do the following."
DirkI get the ANDing to test if bits are set and that's what I thought first too but as far as I've read the only thing wmTaskData4 ever contains is a zero or a control id; it, wmTaskData4, isn't flags bits. Only after playing ANDing that I stumbled upon
Was just wondering why.
On Thursday, June 8, 2023 at 8:59:21 PM UTC-4, Tom Thumb wrote:
On Thursday, June 8, 2023 at 7:17:06 AM UTC-4, Dirk Froehling wrote:
Am 02.06.23 um 19:15 schrieb Tom Thumb:I get the ANDing to test if bits are set and that's what I thought first too but as far
On Thursday, June 1, 2023 at 8:33:08 PM UTC-4, Tom Thumb wrote:It is easier to read. :)
On Thursday, June 1, 2023 at 2:05:06 PM UTC-4, [email protected] wrote:
On Thursday, June 1, 2023 at 11:25:59 AM UTC-5, Tom Thumb wrote:Ahh, thank you very much.
On Wednesday, May 31, 2023 at 3:17:30 PM UTC-4, Tom Thumb wrote:Yes, that's correct. In this case wmTaskData4 holds a control ID value, and all
Mike Westerfield's "Toolbox Programming in C" contains a routine:Oh, it's checking to see if wmTaskData4 is less than 32768
void HandleControl (void)
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of
the bits 17 - 31 have been set to one?
I'd be grateful if someone would explain why this is being done. I imagine I've
missed something there or the IIgs Reference Manuals.
the control IDs that the code wants to check for are less than 32768. The "if"
check is OK, but it's not really necessary, since the code could just check for
the control IDs of interest via the "switch".
I suspect the "if" check is there because the code was originally written in
Pascal for the Toolbox Programming in Pascal course and then later translated to
C. The "case" statement in ORCA/Pascal can only handle values up to 32767, making
a check like this necessary, but the "switch" statement in C does not have the
same limitation.
--
Stephen Heumann
May I ask though; why go about it this way: if ((myEvent.wmTaskData4 & 0xFFFF8000)
== 0) rather than: if(myEvent.wmTaskData4 <= 32767) ?
is there a reason? or just a choice?
No, really. 32767 is meaningless in that context. wmTaskData4 contains a >> > bunch of seperate settings coded as bits, not a single number.
0xFFFF8000 is 1111 1111 1111 1111 1000 0000 0000 0000 in binary form,
and by ANDing wmTaskData4 with this number, you say "I am only
interested in the upper 17 bits, ignore the lower bits."
The IF condition then means "If none of the settings in the upper 17
bits is set, do the following."
Dirk
as I've read the only thing wmTaskData4 ever contains is a zero or a control id; it,
wmTaskData4, isn't flags bits. Only after playing ANDing that I stumbled upon
00000000000000001111111111111111, 0x7FFF, 32768 triggers that condition <shrug>
Was just wondering why.
He has a sense of humor. I think he was just messing with me.
On Thursday, June 8, 2023 at 8:59:21 PM UTC-4, Tom Thumb wrote:control IDs of interest via the "switch".
On Thursday, June 8, 2023 at 7:17:06 AM UTC-4, Dirk Froehling wrote:
Am 02.06.23 um 19:15 schrieb Tom Thumb:
On Thursday, June 1, 2023 at 8:33:08 PM UTC-4, Tom Thumb wrote:
On Thursday, June 1, 2023 at 2:05:06 PM UTC-4, [email protected] wrote:
On Thursday, June 1, 2023 at 11:25:59 AM UTC-5, Tom Thumb wrote: >>>>>>> On Wednesday, May 31, 2023 at 3:17:30 PM UTC-4, Tom Thumb wrote: >>>>>>>> Mike Westerfield's "Toolbox Programming in C" contains a routine: >>>>>>>>
Yes, that's correct. In this case wmTaskData4 holds a control ID value, and all the control IDs that the code wants to check for are less than 32768. The "if" check is OK, but it's not really necessary, since the code could just check for thevoid HandleControl (void)Oh, it's checking to see if wmTaskData4 is less than 32768
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
I'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.
like this necessary, but the "switch" statement in C does not have the same limitation.
I suspect the "if" check is there because the code was originally written in Pascal for the Toolbox Programming in Pascal course and then later translated to C. The "case" statement in ORCA/Pascal can only handle values up to 32767, making a check
00000000000000001111111111111111, 0x7FFF, 32768 triggers that condition <shrug> >>I get the ANDing to test if bits are set and that's what I thought first too but as far as I've read the only thing wmTaskData4 ever contains is a zero or a control id; it, wmTaskData4, isn't flags bits. Only after playing ANDing that I stumbled uponIt is easier to read. :)Ahh, thank you very much.
--
Stephen Heumann
May I ask though; why go about it this way: if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0) rather than: if(myEvent.wmTaskData4 <= 32767) ?
is there a reason? or just a choice?
No, really. 32767 is meaningless in that context. wmTaskData4 contains a >>> bunch of seperate settings coded as bits, not a single number.
0xFFFF8000 is 1111 1111 1111 1111 1000 0000 0000 0000 in binary form,
and by ANDing wmTaskData4 with this number, you say "I am only
interested in the upper 17 bits, ignore the lower bits."
The IF condition then means "If none of the settings in the upper 17
bits is set, do the following."
Dirk
Was just wondering why.
He has a sense of humor. I think he was just messing with me.
Am 09.06.23 um 03:02 schrieb Tom Thumb:control IDs of interest via the "switch".
On Thursday, June 8, 2023 at 8:59:21 PM UTC-4, Tom Thumb wrote:
On Thursday, June 8, 2023 at 7:17:06 AM UTC-4, Dirk Froehling wrote: >>> Am 02.06.23 um 19:15 schrieb Tom Thumb:
On Thursday, June 1, 2023 at 8:33:08 PM UTC-4, Tom Thumb wrote:
On Thursday, June 1, 2023 at 2:05:06 PM UTC-4, [email protected] wrote:
On Thursday, June 1, 2023 at 11:25:59 AM UTC-5, Tom Thumb wrote: >>>>>>> On Wednesday, May 31, 2023 at 3:17:30 PM UTC-4, Tom Thumb wrote: >>>>>>>> Mike Westerfield's "Toolbox Programming in C" contains a routine: >>>>>>>>
Yes, that's correct. In this case wmTaskData4 holds a control ID value, and all the control IDs that the code wants to check for are less than 32768. The "if" check is OK, but it's not really necessary, since the code could just check for thevoid HandleControl (void)Oh, it's checking to see if wmTaskData4 is less than 32768
{
if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0)
switch (myEvent.wmTaskData4) {
...
I can find no explanation for doing this. I believe it's just testing if any of the bits 17 - 31 have been set to one?
I'd be grateful if someone would explain why this is being done. I imagine I've missed something there or the IIgs Reference Manuals.
check like this necessary, but the "switch" statement in C does not have the same limitation.
I suspect the "if" check is there because the code was originally written in Pascal for the Toolbox Programming in Pascal course and then later translated to C. The "case" statement in ORCA/Pascal can only handle values up to 32767, making a
upon 00000000000000001111111111111111, 0x7FFF, 32768 triggers that condition <shrug>I get the ANDing to test if bits are set and that's what I thought first too but as far as I've read the only thing wmTaskData4 ever contains is a zero or a control id; it, wmTaskData4, isn't flags bits. Only after playing ANDing that I stumbledIt is easier to read. :)Ahh, thank you very much.
--
Stephen Heumann
May I ask though; why go about it this way: if ((myEvent.wmTaskData4 & 0xFFFF8000) == 0) rather than: if(myEvent.wmTaskData4 <= 32767) ?
is there a reason? or just a choice?
No, really. 32767 is meaningless in that context. wmTaskData4 contains a >>> bunch of seperate settings coded as bits, not a single number.
0xFFFF8000 is 1111 1111 1111 1111 1000 0000 0000 0000 in binary form, >>> and by ANDing wmTaskData4 with this number, you say "I am only
interested in the upper 17 bits, ignore the lower bits."
The IF condition then means "If none of the settings in the upper 17
bits is set, do the following."
Dirk
Was just wondering why.
He has a sense of humor. I think he was just messing with me.I have to admit that I didn't really check what kind of values
wmTaskData4 can contain. You and Stephen are correct, it should contain
the ID of a control in your dialog.
But maybe it contains other things in certain conditions. Otherwise that check would not be needed (if you only have controls with small ID
numbers). If the event handling is done for a modeless dialog, for
example, it would be useful to ignore all unknown events.
I just tried to explain the hex form in the statement. You don't need to play with values to find out the meaning if you write a constant that
way. It is like a mask for specific bits.
No, I don't have a sense of humor.
;)
Dirk
| Sysop: | Keyop |
|---|---|
| Location: | Huddersfield, West Yorkshire, UK |
| Users: | 715 |
| Nodes: | 16 (0 / 16) |
| Uptime: | 163:07:17 |
| Calls: | 12,095 |
| Calls today: | 3 |
| Files: | 15,000 |
| Messages: | 6,517,783 |