Why does a variable size struct not compile in the Arduino IDE?Why can't the new Arduino IDE 1.6.7 compile extern “C”?How can Arduino know that the number in a variable is a pin number and not something else?Advice for checking integrity of serial char strings?Arduino: put string through variable in arrayHow does Arduino IDE 'Get Board Info'?Transfer serial data to struct variable in ArduinoArduino not adding decimals correctly on double variableWhy does this array have stored values in it even though I have not put any values in it?Arduino OTA port not updating in Arduino IDEGlobal Variable does not Change when Value is set within Boolean Function

How do I compare the result of "1d20+x, with advantage" to "1d20+y, without advantage", assuming x < y?

What does this quote in Small Gods refer to?

How did Thanos not realise this had happened at the end of Endgame?

Why does it take longer to fly from London to Xi'an than to Beijing

How to find the tex encoding of specific fonts?

How to get a ellipse shaped node in Tikz Network?

How does the Time Stop spell work when being grappled?

Why are low spin tetrahedral complexes so rare?

What's the difference between const array and static const array in C/C++

Was there a contingency plan in place if Little Boy failed to detonate?

Why is the Sun made of light elements only?

Is ‘despite that’ right?

Why does a variable size struct not compile in the Arduino IDE?

Would encrypting a database protect against a compromised admin account?

Succinct and gender-neutral Russian word for "writer"

Why should password hash verification be time constant?

Should I pay on student loans in deferment or continue to snowball other debts?

Improving Sati-Sampajañña (situative wisdom)

Pre-1993 comic in which Wolverine's claws were turned to rubber?

Has magnetic core memory been used beyond the Moon?

How to efficiently lower your karma

Why does the Earth follow an elliptical trajectory rather than a parabolic one?

Is there a need for better software for writers?

Company stopped paying my salary. What are my options?



Why does a variable size struct not compile in the Arduino IDE?


Why can't the new Arduino IDE 1.6.7 compile extern “C”?How can Arduino know that the number in a variable is a pin number and not something else?Advice for checking integrity of serial char strings?Arduino: put string through variable in arrayHow does Arduino IDE 'Get Board Info'?Transfer serial data to struct variable in ArduinoArduino not adding decimals correctly on double variableWhy does this array have stored values in it even though I have not put any values in it?Arduino OTA port not updating in Arduino IDEGlobal Variable does not Change when Value is set within Boolean Function













1















This sketch does not compile in the Arduino IDE



void setup() 
// put your setup code here, to run once:



struct test
int i;
char variable[];
;

typedef struct test test;

test t =
0, "hi"
;

void loop()
// put your main code here, to run repeatedly:




Arduino throws



sketch_may09a:16: error: initializer-string for array of chars is too long [-fpermissive]

};

^

exit status 1
initializer-string for array of chars is too long [-fpermissive]


However compiling with g++ works just fine. How can I fix it? Or is there a principle reason why flexible array members are not supported?










share|improve this question









New contributor



the_architect is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.














  • 1





    It hurts to see that code, so it must be wrong. A struct is a definition of a variable (wich contains other variables). How would you create an array of those structs when they have different lengths?

    – Jot
    9 hours ago











  • @Jot: The struct type itself is declared correctly. There's nothing wrong with an [] array as the last member of a struct. However, in standard C language the only way to make such structs to "have different lengths" is to malloc them individually. This is what this [] feature is designed for. In all other contexts the [] array simply "disappears" (i.e. it is an array of size 0). So, the issue simply does not exist in situations when one'd try to create an array of such structs.

    – AnT
    8 hours ago












  • @AnT I know that it is set to zero size and I have read your answer with the correct type definition and declaration of the structs. the_architect tries to put the characters into the struct itself. That is not possible.

    – Jot
    8 hours ago











  • @Jot Not sure what answer you are talking about. Placing the characters into the struct itself, as the OP is trying to, is possible through GNU-specific extension. As I said already, the OP code is perfectly correct from GNU point of view.

    – AnT
    8 hours ago
















1















This sketch does not compile in the Arduino IDE



void setup() 
// put your setup code here, to run once:



struct test
int i;
char variable[];
;

typedef struct test test;

test t =
0, "hi"
;

void loop()
// put your main code here, to run repeatedly:




Arduino throws



sketch_may09a:16: error: initializer-string for array of chars is too long [-fpermissive]

};

^

exit status 1
initializer-string for array of chars is too long [-fpermissive]


However compiling with g++ works just fine. How can I fix it? Or is there a principle reason why flexible array members are not supported?










share|improve this question









New contributor



the_architect is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.














  • 1





    It hurts to see that code, so it must be wrong. A struct is a definition of a variable (wich contains other variables). How would you create an array of those structs when they have different lengths?

    – Jot
    9 hours ago











  • @Jot: The struct type itself is declared correctly. There's nothing wrong with an [] array as the last member of a struct. However, in standard C language the only way to make such structs to "have different lengths" is to malloc them individually. This is what this [] feature is designed for. In all other contexts the [] array simply "disappears" (i.e. it is an array of size 0). So, the issue simply does not exist in situations when one'd try to create an array of such structs.

    – AnT
    8 hours ago












  • @AnT I know that it is set to zero size and I have read your answer with the correct type definition and declaration of the structs. the_architect tries to put the characters into the struct itself. That is not possible.

    – Jot
    8 hours ago











  • @Jot Not sure what answer you are talking about. Placing the characters into the struct itself, as the OP is trying to, is possible through GNU-specific extension. As I said already, the OP code is perfectly correct from GNU point of view.

    – AnT
    8 hours ago














1












1








1








This sketch does not compile in the Arduino IDE



void setup() 
// put your setup code here, to run once:



struct test
int i;
char variable[];
;

typedef struct test test;

test t =
0, "hi"
;

void loop()
// put your main code here, to run repeatedly:




Arduino throws



sketch_may09a:16: error: initializer-string for array of chars is too long [-fpermissive]

};

^

exit status 1
initializer-string for array of chars is too long [-fpermissive]


However compiling with g++ works just fine. How can I fix it? Or is there a principle reason why flexible array members are not supported?










share|improve this question









New contributor



the_architect is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











This sketch does not compile in the Arduino IDE



void setup() 
// put your setup code here, to run once:



struct test
int i;
char variable[];
;

typedef struct test test;

test t =
0, "hi"
;

void loop()
// put your main code here, to run repeatedly:




Arduino throws



sketch_may09a:16: error: initializer-string for array of chars is too long [-fpermissive]

};

^

exit status 1
initializer-string for array of chars is too long [-fpermissive]


However compiling with g++ works just fine. How can I fix it? Or is there a principle reason why flexible array members are not supported?







programming array struct






share|improve this question









New contributor



the_architect is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.










share|improve this question









New contributor



the_architect is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








share|improve this question




share|improve this question








edited 7 hours ago









Glorfindel

4331512




4331512






New contributor



the_architect is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








asked 9 hours ago









the_architectthe_architect

1062




1062




New contributor



the_architect is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




New contributor




the_architect is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









  • 1





    It hurts to see that code, so it must be wrong. A struct is a definition of a variable (wich contains other variables). How would you create an array of those structs when they have different lengths?

    – Jot
    9 hours ago











  • @Jot: The struct type itself is declared correctly. There's nothing wrong with an [] array as the last member of a struct. However, in standard C language the only way to make such structs to "have different lengths" is to malloc them individually. This is what this [] feature is designed for. In all other contexts the [] array simply "disappears" (i.e. it is an array of size 0). So, the issue simply does not exist in situations when one'd try to create an array of such structs.

    – AnT
    8 hours ago












  • @AnT I know that it is set to zero size and I have read your answer with the correct type definition and declaration of the structs. the_architect tries to put the characters into the struct itself. That is not possible.

    – Jot
    8 hours ago











  • @Jot Not sure what answer you are talking about. Placing the characters into the struct itself, as the OP is trying to, is possible through GNU-specific extension. As I said already, the OP code is perfectly correct from GNU point of view.

    – AnT
    8 hours ago













  • 1





    It hurts to see that code, so it must be wrong. A struct is a definition of a variable (wich contains other variables). How would you create an array of those structs when they have different lengths?

    – Jot
    9 hours ago











  • @Jot: The struct type itself is declared correctly. There's nothing wrong with an [] array as the last member of a struct. However, in standard C language the only way to make such structs to "have different lengths" is to malloc them individually. This is what this [] feature is designed for. In all other contexts the [] array simply "disappears" (i.e. it is an array of size 0). So, the issue simply does not exist in situations when one'd try to create an array of such structs.

    – AnT
    8 hours ago












  • @AnT I know that it is set to zero size and I have read your answer with the correct type definition and declaration of the structs. the_architect tries to put the characters into the struct itself. That is not possible.

    – Jot
    8 hours ago











  • @Jot Not sure what answer you are talking about. Placing the characters into the struct itself, as the OP is trying to, is possible through GNU-specific extension. As I said already, the OP code is perfectly correct from GNU point of view.

    – AnT
    8 hours ago








1




1





It hurts to see that code, so it must be wrong. A struct is a definition of a variable (wich contains other variables). How would you create an array of those structs when they have different lengths?

– Jot
9 hours ago





It hurts to see that code, so it must be wrong. A struct is a definition of a variable (wich contains other variables). How would you create an array of those structs when they have different lengths?

– Jot
9 hours ago













@Jot: The struct type itself is declared correctly. There's nothing wrong with an [] array as the last member of a struct. However, in standard C language the only way to make such structs to "have different lengths" is to malloc them individually. This is what this [] feature is designed for. In all other contexts the [] array simply "disappears" (i.e. it is an array of size 0). So, the issue simply does not exist in situations when one'd try to create an array of such structs.

– AnT
8 hours ago






@Jot: The struct type itself is declared correctly. There's nothing wrong with an [] array as the last member of a struct. However, in standard C language the only way to make such structs to "have different lengths" is to malloc them individually. This is what this [] feature is designed for. In all other contexts the [] array simply "disappears" (i.e. it is an array of size 0). So, the issue simply does not exist in situations when one'd try to create an array of such structs.

– AnT
8 hours ago














@AnT I know that it is set to zero size and I have read your answer with the correct type definition and declaration of the structs. the_architect tries to put the characters into the struct itself. That is not possible.

– Jot
8 hours ago





@AnT I know that it is set to zero size and I have read your answer with the correct type definition and declaration of the structs. the_architect tries to put the characters into the struct itself. That is not possible.

– Jot
8 hours ago













@Jot Not sure what answer you are talking about. Placing the characters into the struct itself, as the OP is trying to, is possible through GNU-specific extension. As I said already, the OP code is perfectly correct from GNU point of view.

– AnT
8 hours ago






@Jot Not sure what answer you are talking about. Placing the characters into the struct itself, as the OP is trying to, is possible through GNU-specific extension. As I said already, the OP code is perfectly correct from GNU point of view.

– AnT
8 hours ago











3 Answers
3






active

oldest

votes


















3














Maybe you've compiled it in g++ without any warnings enabled (or maybe it yeld warnings but was compiled). The arduino uses flags to consider all warnings as an error, so it won't compile. It may wary for different platforms, I've got -fpermissive used (and I don't like it at all).



That's because size of struct must be known compile time and if you provide char variable[]; you'll get zero sized array. Therefore anything biiger than nothing you'll try to initialize for is too long.



Maybe you're looking for something like this:



struct test 
int a;
const char * ptr;
;

test paramx 1, "some string";
test paramy 2, "another string";

test array[] = 3,"three", 4, "four", 5,"five";





share|improve this answer

























  • char variable[]; is not a zero-sized array. It is a flexible array. In standard C its size depends on how much memory was allocated by the user for the whole struct object. And in extended GNU-C the extra memory can be requested the way the OP requests it: by using an initializer. As far as GNU-C is concerned, the code is perfectly fine.

    – AnT
    9 hours ago







  • 1





    And it works like it's zero size array pointing after the end of struct, so you have to allocate more than sizeof(struct) to use it without "buffer overflow". But as it was noted, it can't work on statically allocated struct instance. And in C++ it has to be struct containing POD's only.

    – KIIV
    8 hours ago












  • Well, it can't work for non-dynamic struct object in pedantic standard C. But the OP is apparently not trying to use pedantic standard C. And yes, it can and will work in extended GNU-C (and in GNU-C++ after version 6 of the compiler). The original code is perfectly fine as far as GNU-extended versions of these languages are concerned. The code will compile and work as intended in Arduino IDE once it is placed into a .c file, as I clearly stated in my answer. Once Arduino IDE moves to a later version of AVR-GCC, this code will compile and work as intended right away.

    – AnT
    8 hours ago












  • Hower I'm not sure he really wanted to use FAM. It might be just coincidence. Maybe he wanted just const char * variable; That should be perfectly legal in this case (or flash string helpers / progmem pointers)

    – KIIV
    8 hours ago












  • The title of the question seems to suggest that the OP did actually want to use a variable-size struct. Whether they meant it literally, as a reference to this specific language feature - I don't know.

    – AnT
    8 hours ago



















3














Flexible array member is a C feature. It does not exist in C++. On top of that, the way you use it to declare and initialize a static struct of flexible size is non-standard even for C.



However, GNU-C language supports it as an extension. Also, newer versions of GCC (6 and higher) allow this in GNU-C++ code as an extension as well. But GCC 5.4.0 used by Arduino IDE doesn't support this non-standard feature in C++ code.



If you flip through different GCC versions on Godbolt (https://godbolt.org/z/Iul7hD) you'll see that support for this feature has always been present in C code, but for C++ code it first appeared in GCC 6.



This is why you were able to compile it with your standalone g++ compiler (which is apparently a much later version), but were unable to compile it in Arduino IDE.



It means that if you really want this non-standard code to compile in the current version of Arduino IDE, you have to place it into a .c file. Or just specify the array size explicitly.






share|improve this answer
































    -1














    What the range voltage to supply arduino?






    share|improve this answer








    New contributor



    Mechatronics club is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.



















    • This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

      – VE7JRO
      6 hours ago











    Your Answer






    StackExchange.ifUsing("editor", function ()
    return StackExchange.using("schematics", function ()
    StackExchange.schematics.init();
    );
    , "cicuitlab");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "540"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );






    the_architect is a new contributor. Be nice, and check out our Code of Conduct.









    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2farduino.stackexchange.com%2fquestions%2f65267%2fwhy-does-a-variable-size-struct-not-compile-in-the-arduino-ide%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    Maybe you've compiled it in g++ without any warnings enabled (or maybe it yeld warnings but was compiled). The arduino uses flags to consider all warnings as an error, so it won't compile. It may wary for different platforms, I've got -fpermissive used (and I don't like it at all).



    That's because size of struct must be known compile time and if you provide char variable[]; you'll get zero sized array. Therefore anything biiger than nothing you'll try to initialize for is too long.



    Maybe you're looking for something like this:



    struct test 
    int a;
    const char * ptr;
    ;

    test paramx 1, "some string";
    test paramy 2, "another string";

    test array[] = 3,"three", 4, "four", 5,"five";





    share|improve this answer

























    • char variable[]; is not a zero-sized array. It is a flexible array. In standard C its size depends on how much memory was allocated by the user for the whole struct object. And in extended GNU-C the extra memory can be requested the way the OP requests it: by using an initializer. As far as GNU-C is concerned, the code is perfectly fine.

      – AnT
      9 hours ago







    • 1





      And it works like it's zero size array pointing after the end of struct, so you have to allocate more than sizeof(struct) to use it without "buffer overflow". But as it was noted, it can't work on statically allocated struct instance. And in C++ it has to be struct containing POD's only.

      – KIIV
      8 hours ago












    • Well, it can't work for non-dynamic struct object in pedantic standard C. But the OP is apparently not trying to use pedantic standard C. And yes, it can and will work in extended GNU-C (and in GNU-C++ after version 6 of the compiler). The original code is perfectly fine as far as GNU-extended versions of these languages are concerned. The code will compile and work as intended in Arduino IDE once it is placed into a .c file, as I clearly stated in my answer. Once Arduino IDE moves to a later version of AVR-GCC, this code will compile and work as intended right away.

      – AnT
      8 hours ago












    • Hower I'm not sure he really wanted to use FAM. It might be just coincidence. Maybe he wanted just const char * variable; That should be perfectly legal in this case (or flash string helpers / progmem pointers)

      – KIIV
      8 hours ago












    • The title of the question seems to suggest that the OP did actually want to use a variable-size struct. Whether they meant it literally, as a reference to this specific language feature - I don't know.

      – AnT
      8 hours ago
















    3














    Maybe you've compiled it in g++ without any warnings enabled (or maybe it yeld warnings but was compiled). The arduino uses flags to consider all warnings as an error, so it won't compile. It may wary for different platforms, I've got -fpermissive used (and I don't like it at all).



    That's because size of struct must be known compile time and if you provide char variable[]; you'll get zero sized array. Therefore anything biiger than nothing you'll try to initialize for is too long.



    Maybe you're looking for something like this:



    struct test 
    int a;
    const char * ptr;
    ;

    test paramx 1, "some string";
    test paramy 2, "another string";

    test array[] = 3,"three", 4, "four", 5,"five";





    share|improve this answer

























    • char variable[]; is not a zero-sized array. It is a flexible array. In standard C its size depends on how much memory was allocated by the user for the whole struct object. And in extended GNU-C the extra memory can be requested the way the OP requests it: by using an initializer. As far as GNU-C is concerned, the code is perfectly fine.

      – AnT
      9 hours ago







    • 1





      And it works like it's zero size array pointing after the end of struct, so you have to allocate more than sizeof(struct) to use it without "buffer overflow". But as it was noted, it can't work on statically allocated struct instance. And in C++ it has to be struct containing POD's only.

      – KIIV
      8 hours ago












    • Well, it can't work for non-dynamic struct object in pedantic standard C. But the OP is apparently not trying to use pedantic standard C. And yes, it can and will work in extended GNU-C (and in GNU-C++ after version 6 of the compiler). The original code is perfectly fine as far as GNU-extended versions of these languages are concerned. The code will compile and work as intended in Arduino IDE once it is placed into a .c file, as I clearly stated in my answer. Once Arduino IDE moves to a later version of AVR-GCC, this code will compile and work as intended right away.

      – AnT
      8 hours ago












    • Hower I'm not sure he really wanted to use FAM. It might be just coincidence. Maybe he wanted just const char * variable; That should be perfectly legal in this case (or flash string helpers / progmem pointers)

      – KIIV
      8 hours ago












    • The title of the question seems to suggest that the OP did actually want to use a variable-size struct. Whether they meant it literally, as a reference to this specific language feature - I don't know.

      – AnT
      8 hours ago














    3












    3








    3







    Maybe you've compiled it in g++ without any warnings enabled (or maybe it yeld warnings but was compiled). The arduino uses flags to consider all warnings as an error, so it won't compile. It may wary for different platforms, I've got -fpermissive used (and I don't like it at all).



    That's because size of struct must be known compile time and if you provide char variable[]; you'll get zero sized array. Therefore anything biiger than nothing you'll try to initialize for is too long.



    Maybe you're looking for something like this:



    struct test 
    int a;
    const char * ptr;
    ;

    test paramx 1, "some string";
    test paramy 2, "another string";

    test array[] = 3,"three", 4, "four", 5,"five";





    share|improve this answer















    Maybe you've compiled it in g++ without any warnings enabled (or maybe it yeld warnings but was compiled). The arduino uses flags to consider all warnings as an error, so it won't compile. It may wary for different platforms, I've got -fpermissive used (and I don't like it at all).



    That's because size of struct must be known compile time and if you provide char variable[]; you'll get zero sized array. Therefore anything biiger than nothing you'll try to initialize for is too long.



    Maybe you're looking for something like this:



    struct test 
    int a;
    const char * ptr;
    ;

    test paramx 1, "some string";
    test paramy 2, "another string";

    test array[] = 3,"three", 4, "four", 5,"five";






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 8 hours ago

























    answered 9 hours ago









    KIIVKIIV

    3,7321617




    3,7321617












    • char variable[]; is not a zero-sized array. It is a flexible array. In standard C its size depends on how much memory was allocated by the user for the whole struct object. And in extended GNU-C the extra memory can be requested the way the OP requests it: by using an initializer. As far as GNU-C is concerned, the code is perfectly fine.

      – AnT
      9 hours ago







    • 1





      And it works like it's zero size array pointing after the end of struct, so you have to allocate more than sizeof(struct) to use it without "buffer overflow". But as it was noted, it can't work on statically allocated struct instance. And in C++ it has to be struct containing POD's only.

      – KIIV
      8 hours ago












    • Well, it can't work for non-dynamic struct object in pedantic standard C. But the OP is apparently not trying to use pedantic standard C. And yes, it can and will work in extended GNU-C (and in GNU-C++ after version 6 of the compiler). The original code is perfectly fine as far as GNU-extended versions of these languages are concerned. The code will compile and work as intended in Arduino IDE once it is placed into a .c file, as I clearly stated in my answer. Once Arduino IDE moves to a later version of AVR-GCC, this code will compile and work as intended right away.

      – AnT
      8 hours ago












    • Hower I'm not sure he really wanted to use FAM. It might be just coincidence. Maybe he wanted just const char * variable; That should be perfectly legal in this case (or flash string helpers / progmem pointers)

      – KIIV
      8 hours ago












    • The title of the question seems to suggest that the OP did actually want to use a variable-size struct. Whether they meant it literally, as a reference to this specific language feature - I don't know.

      – AnT
      8 hours ago


















    • char variable[]; is not a zero-sized array. It is a flexible array. In standard C its size depends on how much memory was allocated by the user for the whole struct object. And in extended GNU-C the extra memory can be requested the way the OP requests it: by using an initializer. As far as GNU-C is concerned, the code is perfectly fine.

      – AnT
      9 hours ago







    • 1





      And it works like it's zero size array pointing after the end of struct, so you have to allocate more than sizeof(struct) to use it without "buffer overflow". But as it was noted, it can't work on statically allocated struct instance. And in C++ it has to be struct containing POD's only.

      – KIIV
      8 hours ago












    • Well, it can't work for non-dynamic struct object in pedantic standard C. But the OP is apparently not trying to use pedantic standard C. And yes, it can and will work in extended GNU-C (and in GNU-C++ after version 6 of the compiler). The original code is perfectly fine as far as GNU-extended versions of these languages are concerned. The code will compile and work as intended in Arduino IDE once it is placed into a .c file, as I clearly stated in my answer. Once Arduino IDE moves to a later version of AVR-GCC, this code will compile and work as intended right away.

      – AnT
      8 hours ago












    • Hower I'm not sure he really wanted to use FAM. It might be just coincidence. Maybe he wanted just const char * variable; That should be perfectly legal in this case (or flash string helpers / progmem pointers)

      – KIIV
      8 hours ago












    • The title of the question seems to suggest that the OP did actually want to use a variable-size struct. Whether they meant it literally, as a reference to this specific language feature - I don't know.

      – AnT
      8 hours ago

















    char variable[]; is not a zero-sized array. It is a flexible array. In standard C its size depends on how much memory was allocated by the user for the whole struct object. And in extended GNU-C the extra memory can be requested the way the OP requests it: by using an initializer. As far as GNU-C is concerned, the code is perfectly fine.

    – AnT
    9 hours ago






    char variable[]; is not a zero-sized array. It is a flexible array. In standard C its size depends on how much memory was allocated by the user for the whole struct object. And in extended GNU-C the extra memory can be requested the way the OP requests it: by using an initializer. As far as GNU-C is concerned, the code is perfectly fine.

    – AnT
    9 hours ago





    1




    1





    And it works like it's zero size array pointing after the end of struct, so you have to allocate more than sizeof(struct) to use it without "buffer overflow". But as it was noted, it can't work on statically allocated struct instance. And in C++ it has to be struct containing POD's only.

    – KIIV
    8 hours ago






    And it works like it's zero size array pointing after the end of struct, so you have to allocate more than sizeof(struct) to use it without "buffer overflow". But as it was noted, it can't work on statically allocated struct instance. And in C++ it has to be struct containing POD's only.

    – KIIV
    8 hours ago














    Well, it can't work for non-dynamic struct object in pedantic standard C. But the OP is apparently not trying to use pedantic standard C. And yes, it can and will work in extended GNU-C (and in GNU-C++ after version 6 of the compiler). The original code is perfectly fine as far as GNU-extended versions of these languages are concerned. The code will compile and work as intended in Arduino IDE once it is placed into a .c file, as I clearly stated in my answer. Once Arduino IDE moves to a later version of AVR-GCC, this code will compile and work as intended right away.

    – AnT
    8 hours ago






    Well, it can't work for non-dynamic struct object in pedantic standard C. But the OP is apparently not trying to use pedantic standard C. And yes, it can and will work in extended GNU-C (and in GNU-C++ after version 6 of the compiler). The original code is perfectly fine as far as GNU-extended versions of these languages are concerned. The code will compile and work as intended in Arduino IDE once it is placed into a .c file, as I clearly stated in my answer. Once Arduino IDE moves to a later version of AVR-GCC, this code will compile and work as intended right away.

    – AnT
    8 hours ago














    Hower I'm not sure he really wanted to use FAM. It might be just coincidence. Maybe he wanted just const char * variable; That should be perfectly legal in this case (or flash string helpers / progmem pointers)

    – KIIV
    8 hours ago






    Hower I'm not sure he really wanted to use FAM. It might be just coincidence. Maybe he wanted just const char * variable; That should be perfectly legal in this case (or flash string helpers / progmem pointers)

    – KIIV
    8 hours ago














    The title of the question seems to suggest that the OP did actually want to use a variable-size struct. Whether they meant it literally, as a reference to this specific language feature - I don't know.

    – AnT
    8 hours ago






    The title of the question seems to suggest that the OP did actually want to use a variable-size struct. Whether they meant it literally, as a reference to this specific language feature - I don't know.

    – AnT
    8 hours ago












    3














    Flexible array member is a C feature. It does not exist in C++. On top of that, the way you use it to declare and initialize a static struct of flexible size is non-standard even for C.



    However, GNU-C language supports it as an extension. Also, newer versions of GCC (6 and higher) allow this in GNU-C++ code as an extension as well. But GCC 5.4.0 used by Arduino IDE doesn't support this non-standard feature in C++ code.



    If you flip through different GCC versions on Godbolt (https://godbolt.org/z/Iul7hD) you'll see that support for this feature has always been present in C code, but for C++ code it first appeared in GCC 6.



    This is why you were able to compile it with your standalone g++ compiler (which is apparently a much later version), but were unable to compile it in Arduino IDE.



    It means that if you really want this non-standard code to compile in the current version of Arduino IDE, you have to place it into a .c file. Or just specify the array size explicitly.






    share|improve this answer





























      3














      Flexible array member is a C feature. It does not exist in C++. On top of that, the way you use it to declare and initialize a static struct of flexible size is non-standard even for C.



      However, GNU-C language supports it as an extension. Also, newer versions of GCC (6 and higher) allow this in GNU-C++ code as an extension as well. But GCC 5.4.0 used by Arduino IDE doesn't support this non-standard feature in C++ code.



      If you flip through different GCC versions on Godbolt (https://godbolt.org/z/Iul7hD) you'll see that support for this feature has always been present in C code, but for C++ code it first appeared in GCC 6.



      This is why you were able to compile it with your standalone g++ compiler (which is apparently a much later version), but were unable to compile it in Arduino IDE.



      It means that if you really want this non-standard code to compile in the current version of Arduino IDE, you have to place it into a .c file. Or just specify the array size explicitly.






      share|improve this answer



























        3












        3








        3







        Flexible array member is a C feature. It does not exist in C++. On top of that, the way you use it to declare and initialize a static struct of flexible size is non-standard even for C.



        However, GNU-C language supports it as an extension. Also, newer versions of GCC (6 and higher) allow this in GNU-C++ code as an extension as well. But GCC 5.4.0 used by Arduino IDE doesn't support this non-standard feature in C++ code.



        If you flip through different GCC versions on Godbolt (https://godbolt.org/z/Iul7hD) you'll see that support for this feature has always been present in C code, but for C++ code it first appeared in GCC 6.



        This is why you were able to compile it with your standalone g++ compiler (which is apparently a much later version), but were unable to compile it in Arduino IDE.



        It means that if you really want this non-standard code to compile in the current version of Arduino IDE, you have to place it into a .c file. Or just specify the array size explicitly.






        share|improve this answer















        Flexible array member is a C feature. It does not exist in C++. On top of that, the way you use it to declare and initialize a static struct of flexible size is non-standard even for C.



        However, GNU-C language supports it as an extension. Also, newer versions of GCC (6 and higher) allow this in GNU-C++ code as an extension as well. But GCC 5.4.0 used by Arduino IDE doesn't support this non-standard feature in C++ code.



        If you flip through different GCC versions on Godbolt (https://godbolt.org/z/Iul7hD) you'll see that support for this feature has always been present in C code, but for C++ code it first appeared in GCC 6.



        This is why you were able to compile it with your standalone g++ compiler (which is apparently a much later version), but were unable to compile it in Arduino IDE.



        It means that if you really want this non-standard code to compile in the current version of Arduino IDE, you have to place it into a .c file. Or just specify the array size explicitly.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 4 hours ago

























        answered 9 hours ago









        AnTAnT

        4088




        4088





















            -1














            What the range voltage to supply arduino?






            share|improve this answer








            New contributor



            Mechatronics club is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.



















            • This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

              – VE7JRO
              6 hours ago















            -1














            What the range voltage to supply arduino?






            share|improve this answer








            New contributor



            Mechatronics club is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.



















            • This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

              – VE7JRO
              6 hours ago













            -1












            -1








            -1







            What the range voltage to supply arduino?






            share|improve this answer








            New contributor



            Mechatronics club is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.









            What the range voltage to supply arduino?







            share|improve this answer








            New contributor



            Mechatronics club is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.








            share|improve this answer



            share|improve this answer






            New contributor



            Mechatronics club is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.








            answered 7 hours ago









            Mechatronics clubMechatronics club

            1




            1




            New contributor



            Mechatronics club is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.




            New contributor




            Mechatronics club is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.














            • This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

              – VE7JRO
              6 hours ago

















            • This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

              – VE7JRO
              6 hours ago
















            This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

            – VE7JRO
            6 hours ago





            This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

            – VE7JRO
            6 hours ago










            the_architect is a new contributor. Be nice, and check out our Code of Conduct.









            draft saved

            draft discarded


















            the_architect is a new contributor. Be nice, and check out our Code of Conduct.












            the_architect is a new contributor. Be nice, and check out our Code of Conduct.











            the_architect is a new contributor. Be nice, and check out our Code of Conduct.














            Thanks for contributing an answer to Arduino Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2farduino.stackexchange.com%2fquestions%2f65267%2fwhy-does-a-variable-size-struct-not-compile-in-the-arduino-ide%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

            Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

            Ласкавець круглолистий Зміст Опис | Поширення | Галерея | Примітки | Посилання | Навігаційне меню58171138361-22960890446Bupleurum rotundifoliumEuro+Med PlantbasePlants of the World Online — Kew ScienceGermplasm Resources Information Network (GRIN)Ласкавецькн. VI : Літери Ком — Левиправивши або дописавши її