Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Qt analog to C struct?
Forum Updated to NodeBB v4.3 + New Features

Qt analog to C struct?

Scheduled Pinned Locked Moved Solved General and Desktop
29 Posts 4 Posters 8.3k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ? A Former User

    As a replacement for the QByteArrays and the C-style array:

    struct MsgHeader
    {
        std::array<uint8_t, 32> hmac = {};
        // ...
        std::array<uint8_t, 23> timestamp = {};
    };
    
    mzimmersM Offline
    mzimmersM Offline
    mzimmers
    wrote on last edited by
    #6

    @Wieland OK. What is the advantage of this -- automatic range checking or some other safeties?

    kshegunovK 1 Reply Last reply
    0
    • mzimmersM mzimmers

      @Wieland OK. What is the advantage of this -- automatic range checking or some other safeties?

      kshegunovK Offline
      kshegunovK Offline
      kshegunov
      Moderators
      wrote on last edited by
      #7

      yes, also somewhat more type-safe as it does not decay readily to void *, is a C++ object ... and, well, the cool kids are using it (not that I approve, but that's whole other rant) ... ;)

      Read and abide by the Qt Code of Conduct

      1 Reply Last reply
      2
      • ? Offline
        ? Offline
        A Former User
        wrote on last edited by
        #8

        Yes, automatic range checking, increased safety against unintentional pointer mistakes, and compared to QByteArray, increased performance.

        JonBJ 1 Reply Last reply
        2
        • mzimmersM Offline
          mzimmersM Offline
          mzimmers
          wrote on last edited by
          #9

          OK, thank you both.

          1 Reply Last reply
          1
          • ? Offline
            ? Offline
            A Former User
            wrote on last edited by
            #10

            Lot of cross-posting going on here ^_^

            kshegunovK 1 Reply Last reply
            1
            • ? A Former User

              Lot of cross-posting going on here ^_^

              kshegunovK Offline
              kshegunovK Offline
              kshegunov
              Moderators
              wrote on last edited by
              #11

              Twice in less than 10 minutes, must be a forum record or something.

              Read and abide by the Qt Code of Conduct

              1 Reply Last reply
              0
              • mzimmersM Offline
                mzimmersM Offline
                mzimmers
                wrote on last edited by
                #12

                Just to pursue this a little further, if I do use the std::array template, can I still do a memcpy, or do I have to assign the elements individually? I couldn't see anything in the cPPreference page on this.

                Also, would it be better just to create one large QByteArray and use pointers to access delimited areas within it? (I'm still a little surprised that Qt doesn't have some construct to handle this).

                ? kshegunovK 3 Replies Last reply
                0
                • mzimmersM mzimmers

                  Just to pursue this a little further, if I do use the std::array template, can I still do a memcpy, or do I have to assign the elements individually? I couldn't see anything in the cPPreference page on this.

                  Also, would it be better just to create one large QByteArray and use pointers to access delimited areas within it? (I'm still a little surprised that Qt doesn't have some construct to handle this).

                  ? Offline
                  ? Offline
                  A Former User
                  wrote on last edited by
                  #13

                  @mzimmers said in Qt analog to C struct?:

                  can I still do a memcpy

                  The correct way to copy the array is to use std::copy. It's up to the implementation of your standard library to then find the fastest way to copy your data.

                  1 Reply Last reply
                  0
                  • mzimmersM mzimmers

                    Just to pursue this a little further, if I do use the std::array template, can I still do a memcpy, or do I have to assign the elements individually? I couldn't see anything in the cPPreference page on this.

                    Also, would it be better just to create one large QByteArray and use pointers to access delimited areas within it? (I'm still a little surprised that Qt doesn't have some construct to handle this).

                    kshegunovK Offline
                    kshegunovK Offline
                    kshegunov
                    Moderators
                    wrote on last edited by kshegunov
                    #14

                    @mzimmers said in Qt analog to C struct?:

                    if I do use the std::array template, can I still do a memcpy

                    Yes, std::array is an aggregate (means it has only one member that is your regular type[] array). Although(!), you should copy it like any other object - it is an object after all.

                    Also, would it be better just to create one large QByteArray and use pointers to access delimited areas within it?

                    And throw away type safety? Why? There's no significant difference between that and having a struct containing fixed sized arrays.

                    I'm still a little surprised that Qt doesn't have some construct to handle this

                    To handle what exactly?

                    Read and abide by the Qt Code of Conduct

                    1 Reply Last reply
                    0
                    • mzimmersM mzimmers

                      Just to pursue this a little further, if I do use the std::array template, can I still do a memcpy, or do I have to assign the elements individually? I couldn't see anything in the cPPreference page on this.

                      Also, would it be better just to create one large QByteArray and use pointers to access delimited areas within it? (I'm still a little surprised that Qt doesn't have some construct to handle this).

                      ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by
                      #15

                      @mzimmers said in Qt analog to C struct?:

                      Also, would it be better just to create one large QByteArray and use pointers to access delimited areas within it?

                      I don't see why you would do that. Just complicates your code for no reason.

                      1 Reply Last reply
                      1
                      • mzimmersM Offline
                        mzimmersM Offline
                        mzimmers
                        wrote on last edited by
                        #16

                        I'm just looking for a clean way to handle a data structure. In all candor, both the memcpy_s and the std::array/std::copy approaches are tough on the eyes. I guess, though, that's the price you pay to avoid overrunning boundaries.

                        kshegunovK 1 Reply Last reply
                        0
                        • mzimmersM mzimmers

                          I'm just looking for a clean way to handle a data structure. In all candor, both the memcpy_s and the std::array/std::copy approaches are tough on the eyes. I guess, though, that's the price you pay to avoid overrunning boundaries.

                          kshegunovK Offline
                          kshegunovK Offline
                          kshegunov
                          Moderators
                          wrote on last edited by kshegunov
                          #17

                          I don't follow, perhaps I'm missing something. Suppose you use std::array. It'd look something like this:

                          struct X
                          {
                              std::array<int, 4> a;
                              std::array<double, 2> b;
                          };
                          

                          You use it as any POD struct.

                          X x = {
                              { 1, 2, 3, 4 }, // This is an initializer list for std::array<int, 4>
                              { 0.1, 12.3 }   // The second member's intialization
                          };
                          
                          X y = x; // This is all, copying of the arrays is taken care for you by the STL and the compiler
                          
                          double z[2];
                          std::memcpy(z, x.b.data(), x.b.size()); // and voila, we copied the data to `z`
                          

                          Read and abide by the Qt Code of Conduct

                          1 Reply Last reply
                          0
                          • mzimmersM Offline
                            mzimmersM Offline
                            mzimmers
                            wrote on last edited by
                            #18

                            I'm probably being too fussy, but given how easily one can assign/copy QByteArray and QString objects, it's a shame IMO that there's no way to aggregate them as in a C struct. But it's probably their very flexibility that makes such use unfeasible.

                            It's OK...I'm content to use memcpy_s, but it's just not attractive code.

                            kshegunovK 1 Reply Last reply
                            0
                            • ? A Former User

                              Yes, automatic range checking, increased safety against unintentional pointer mistakes, and compared to QByteArray, increased performance.

                              JonBJ Offline
                              JonBJ Offline
                              JonB
                              wrote on last edited by JonB
                              #19

                              @Wieland said in Qt analog to C struct?:

                              Yes, automatic range checking,

                              You said this in response to why std::array should be used/preferred. What "automatic range checking" are you saying it provides, under what circumstances?

                              1 Reply Last reply
                              0
                              • mzimmersM mzimmers

                                I'm probably being too fussy, but given how easily one can assign/copy QByteArray and QString objects, it's a shame IMO that there's no way to aggregate them as in a C struct. But it's probably their very flexibility that makes such use unfeasible.

                                It's OK...I'm content to use memcpy_s, but it's just not attractive code.

                                kshegunovK Offline
                                kshegunovK Offline
                                kshegunov
                                Moderators
                                wrote on last edited by kshegunov
                                #20

                                @mzimmers said in Qt analog to C struct?:

                                I'm probably being too fussy,

                                Not really, but it would help to know what you dislike about the above example and why you think you need to use memcpy?

                                @JNBarchan said in Qt analog to C struct?:

                                What "automatic range checking" are you saying it provides, under what circumstances?

                                std::array<int, 3> x;
                                int z = x[3]; //< Regular arrays allow this (generally)
                                x[3] = 0;     //< Regular arrays mostly allow this too
                                

                                e.g. run this through your debugger:

                                int main(int argc, char ** argv)
                                {
                                    int z[2];
                                    z[2] = 0;
                                }
                                

                                Read and abide by the Qt Code of Conduct

                                JonBJ mzimmersM 2 Replies Last reply
                                0
                                • kshegunovK kshegunov

                                  @mzimmers said in Qt analog to C struct?:

                                  I'm probably being too fussy,

                                  Not really, but it would help to know what you dislike about the above example and why you think you need to use memcpy?

                                  @JNBarchan said in Qt analog to C struct?:

                                  What "automatic range checking" are you saying it provides, under what circumstances?

                                  std::array<int, 3> x;
                                  int z = x[3]; //< Regular arrays allow this (generally)
                                  x[3] = 0;     //< Regular arrays mostly allow this too
                                  

                                  e.g. run this through your debugger:

                                  int main(int argc, char ** argv)
                                  {
                                      int z[2];
                                      z[2] = 0;
                                  }
                                  
                                  JonBJ Offline
                                  JonBJ Offline
                                  JonB
                                  wrote on last edited by JonB
                                  #21

                                  @kshegunov said in Qt analog to C struct?:

                                  @JNBarchan said in Qt analog to C struct?:
                                  What "automatic range checking" are you saying it provides, under what circumstances?

                                  std::array<int, 3> x;
                                  int z = x[3]; //< Regular arrays allow this (generally)
                                  x[3] = 0;     //< Regular arrays mostly allow this too
                                  

                                  I'm not understanding you. If you are saying with std::array<int, 3> x; then x[3] will be range checked, then I say it will not (that's why I asked)! Only x.at(3) will be. See docs. If your x[3] is range checked, that is a compiler-specific behaviour and/or you have to pass flags to compiler to ask it to do that.

                                  kshegunovK 1 Reply Last reply
                                  2
                                  • JonBJ JonB

                                    @kshegunov said in Qt analog to C struct?:

                                    @JNBarchan said in Qt analog to C struct?:
                                    What "automatic range checking" are you saying it provides, under what circumstances?

                                    std::array<int, 3> x;
                                    int z = x[3]; //< Regular arrays allow this (generally)
                                    x[3] = 0;     //< Regular arrays mostly allow this too
                                    

                                    I'm not understanding you. If you are saying with std::array<int, 3> x; then x[3] will be range checked, then I say it will not (that's why I asked)! Only x.at(3) will be. See docs. If your x[3] is range checked, that is a compiler-specific behaviour and/or you have to pass flags to compiler to ask it to do that.

                                    kshegunovK Offline
                                    kshegunovK Offline
                                    kshegunov
                                    Moderators
                                    wrote on last edited by kshegunov
                                    #22

                                    @JNBarchan said in Qt analog to C struct?:

                                    I say it will not

                                    Indeed, I'm in error.
                                    PS.
                                    My STL (g++ 7.2.x) doesn't even have an assertion there ... :|
                                    .at will throw an exception if out of bounds on the other hand.

                                    Read and abide by the Qt Code of Conduct

                                    JonBJ 1 Reply Last reply
                                    1
                                    • kshegunovK kshegunov

                                      @JNBarchan said in Qt analog to C struct?:

                                      I say it will not

                                      Indeed, I'm in error.
                                      PS.
                                      My STL (g++ 7.2.x) doesn't even have an assertion there ... :|
                                      .at will throw an exception if out of bounds on the other hand.

                                      JonBJ Offline
                                      JonBJ Offline
                                      JonB
                                      wrote on last edited by
                                      #23

                                      @kshegunov said in Qt analog to C struct?:

                                      PS.
                                      My STL (g++ 7.2.x) doesn't even have an assertion there ... :|
                                      .at will throw an exception if out of bounds on the other hand.

                                      Yup! But some places suggest "Enable the flag _GLIBCXX_DEBUG to do bounds checking on STL containers", though others claim that was still not the case for std::array. Might depend on compiler release. Also see https://stackoverflow.com/a/1290488/489865 for how Visual C++ does have explicit range checking, and https://stackoverflow.com/a/8375312/489865 using __glibcxx_check_subscript(), which you might put into your own code without tampering with the supplied libraries!

                                      kshegunovK 1 Reply Last reply
                                      0
                                      • JonBJ JonB

                                        @kshegunov said in Qt analog to C struct?:

                                        PS.
                                        My STL (g++ 7.2.x) doesn't even have an assertion there ... :|
                                        .at will throw an exception if out of bounds on the other hand.

                                        Yup! But some places suggest "Enable the flag _GLIBCXX_DEBUG to do bounds checking on STL containers", though others claim that was still not the case for std::array. Might depend on compiler release. Also see https://stackoverflow.com/a/1290488/489865 for how Visual C++ does have explicit range checking, and https://stackoverflow.com/a/8375312/489865 using __glibcxx_check_subscript(), which you might put into your own code without tampering with the supplied libraries!

                                        kshegunovK Offline
                                        kshegunovK Offline
                                        kshegunov
                                        Moderators
                                        wrote on last edited by kshegunov
                                        #24

                                        Well, as I mentioned in my first third post I'm not big on the new standards. Honestly, if it were me, I'd use the regular old statically sized arrays and leave the compiler to generate the copy constructor. Always has worked for me, and I don't see any good reason to use templates endlessly and unnecessarily, but that's me, the standards committee doesn't agree ...

                                        Read and abide by the Qt Code of Conduct

                                        JonBJ 1 Reply Last reply
                                        1
                                        • kshegunovK kshegunov

                                          Well, as I mentioned in my first third post I'm not big on the new standards. Honestly, if it were me, I'd use the regular old statically sized arrays and leave the compiler to generate the copy constructor. Always has worked for me, and I don't see any good reason to use templates endlessly and unnecessarily, but that's me, the standards committee doesn't agree ...

                                          JonBJ Offline
                                          JonBJ Offline
                                          JonB
                                          wrote on last edited by JonB
                                          #25

                                          @kshegunov
                                          Again, agree with you totally!

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved