Discussion about software development for the old-school Gameboys, ranging from the "Gray brick" to Gameboy Color
(Launched in 2008)
You are not logged in.
I'm trying to make my first GameBoy game. I have the variable pvx (player's x velocity). When I print pvx > 0, the result is 28673 (which I think is true), although pvx == 0. I have this issue, where comparisons don't work correctly and some other point in the code too. Anyone has an idea what the problem could be and how to fix it?
Edit: If I cast pvx to a char, everything works. But still, why??
Last edited by 1Dr490n (2022-10-23 09:36:08)
Offline
In c, zero is false and any non-zero value is true in an if statement, but a comparison like pvx > 0 should normally always be exactly 1 if true.
I couldn't tell you exactly why it happens, but note that 28673==0x7001 in hexadecimal. One possibility is that the code somehow set the lower half of a 16-byte register to 1 for true, and left the upper half untouched so it contains whatever junk was in that register previously. However, this still shouldn't happen. I tried reproducing it and couldn't.
Could you post some of your code?
Are you using GBDK-2020 or some older version. Upgrading to GBDK-2020 is probably recommended for both this reason (in case that fixes it) and other reasons.
Offline
If you are using GBDK-2020 and printf (or anything else which takes a variable number of arguments), then the info below applies and may be related. In particular if you are using an 8 bit type and it is not explicitly cast then it may get re-cast to a different variable type (without conversion) when making a variadic function call.
https://gbdk-2020.github.io/gbdk-2020/d … 4cde306fea
Warning: to correctly pass parameters (such as chars, ints, etc) all of them should always be explicitly cast as when calling the function. See docs_chars_varargs for more details.
https://gbdk-2020.github.io/gbdk-2020/d … rs_varargs
Parameters (chars, ints, etc) to printf / sprintf should always be explicitly cast to avoid type related parameter passing issues.
For example, below will result in the likely unintended output:
sprintf(str_temp, "%u, %d, %x\n", UINT16_MAX, INT16_MIN, UINT16_MAX); printf("%s",str_temp); // Will output: "65535, 0, 8000"
Instead this will give the intended output:
sprintf(str_temp, "%u, %d, %x\n", (uint16_t)UINT16_MAX, (int16_t)INT16_MIN, (uint16_t)UINT16_MAX); printf("%s",str_temp); // Will output: "65535, -32768, FFFF"
Offline