Search code examples
arraysstaticarduinointuint8t

Int variable input error for static uint8_t array


This is an extension from Input process and type for static uint8_t array regarding issues experienced from the suggested solution.

Currently, I am trying to create both a int variable and a string variable with is inputted into a static uint8_t array and then is printed using Serial.println.

I am using:

#include <U8x8lib.h>

Int Variable Code (Has Error):

int world = 1;
static uint8_t hello[sizeof(world)];
memcpy(hello, &world, sizeof(hello));

If I copy this directly and paste it into the IDE outside of both loop() or setup(), I get the following error:

    memcpy(hello, &world, sizeof(hello));
       ^
exit status 1
expected constructor, destructor, or type conversion before '(' token

After doing some reading about this issue, I discovered that this must be put in loop(), so I did. The result was that no issues were present when compiling and uploading, however it was printing the value 1073488876 when I added the line:

Serial.println(int((uint8_t*)hello));

I also did:

Serial.println(sizeof(hello));

And it printed 4, which means the code is detecting the variable "hello" as being an int (as an int is 4 bytes).

Interestingly enough, if I comment out the memcpy line I get the same result, being 1073488876, so the code is somehow "ignoring" the line when placed in the loop() function.

String Variable Code

String world = "Hello"; // 6 chars including \0
static uint8_t hello[6];
world.toCharArray((char *)hello, sizeof(hello));

If I copy this directly and paste it into the IDE outside of both loop() or setup(), I get the following error:

 world.toCharArray((char *)hello, sizeof(hello));
 ^
exit status 1
'world' does not name a type

If I put the line world.toCharArray((char *)hello, sizeof(hello)); in loop(), it works.

Serial print also works with the line:

  Serial.println(String((char *)hello));

I don't know if this has any relationship to my issue with the Int Variable code, but thought I might as well show it.


Solution

  • If I copy this directly and paste it into the IDE outside of both loop() or setup(), I get the following error:

    The space outside functions could be used for declaration of functions, variables and classes but not for the execution of the code, it has to go inside functions. loop() and setup() are functions called from main function, this is why it works and doesn't work outside of them.

    it was printing the value 1073488876 when I added the line:

    hello was declared as an array hello[sizeof(int)]. Arrays have tendency to decay to the pointer to its first element. When you pass (uint8_t *)hello to the functional cast expression int(...) and converting the array hello to the pointer to its first element explicitly with (uint8_t *) casting, it could have been done for you automatically. int(hello) or int((uint8_t *)hello) are basically the same. int(...) is a cast, as mentioned above, that turns your pointer uint8_t * into int so the value you see is memory address of the first element presented as int.

    If you want println to print 1 you could convert the array of bytes back into int the same way you converted it to array:

    int world = 1;
    static uint8_t hello[sizeof(world)];
    memcpy(hello, &world, sizeof(hello));
    
    //convert back
    int world2;
    memcpy(&world2, hello, sizeof(world2));
    
    //print
    Serial.println(world2);