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. I have a problem to translate a C program to QT GUI.
Forum Updated to NodeBB v4.3 + New Features

I have a problem to translate a C program to QT GUI.

Scheduled Pinned Locked Moved General and Desktop
18 Posts 5 Posters 3.7k Views 1 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.
  • X Offline
    X Offline
    xmaze
    wrote on last edited by
    #1

    Hi, i have a problem with a C program when i try to translate as a GUI with QT.
    I made the following the main() function from C , with a while(1) {} loop inside, it is named mainloopC() function and i call this one at the Constructor, the program works but the GUI it is not setuped, that means i dont have a GUI.

    Then i tried to put a PushButton to call the function mainloopC(), now i have the GUI but if i push the button i have a segmentation error in this line @if((data = ((unsigned char *) malloc(data_len)))== NULL) exit(1);@
    I know that malloc() it is not good in C++, but why in Constructor the program runs and if i use a push button the program corrupts?
    The code it's huge, and i didnot post it but if you have a suggestion i can post parts of the program.

    1 Reply Last reply
    0
    • JKSHJ Offline
      JKSHJ Offline
      JKSH
      Moderators
      wrote on last edited by
      #2

      Hi,

      [quote author="xmaze" date="1422978617"]I made the following the main() function from C , with a while(1) {} loop inside, it is named mainloopC() function[/quote]To use a GUI, you need an event loop. You cannot have an infinite while(1) loop in the same thread as the GUI, because it will block the event loop.

      @
      int main(int argc, char *argv[])
      {
      QApplication a(argc, argv);
      QWidget w;
      w.show();

      // exec() runs the event loop which drives the GUI. It will not return until you stop the event loop.
      int i = a.exec();
      
      // Your main() function can't return until you stop your event loop.
      return i;
      

      }
      @

      [quote author="xmaze" date="1422978617"]i have a segmentation error in this line @if((data = ((unsigned char *) malloc(data_len)))== NULL) exit(1);@
      I know that malloc() it is not good in C++, but why in Constructor the program runs and if i use a push button the program corrupts?[/quote]Run a debugger. Is the segmentation fault caused by malloc() or exit()?

      Anyway, even if you don't get a segmentation fault, your GUI will stop responding when you start the infinite loop in mainloopC().

      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

      1 Reply Last reply
      0
      • X Offline
        X Offline
        xmaze
        wrote on last edited by
        #3

        [quote author="JKSH" date="1422980371"]Hi,

        Run a debugger. Is the segmentation fault caused by malloc() or exit()?

        Anyway, even if you don't get a segmentation fault, your GUI will stop responding when you start the infinite loop in mainloopC().[/quote]

        The malloc has the problem, i tried also the following : @data=new char[data_len]; @ but it also returns a segmentation fault.
        Why in constructor works and the GUI also don't return a segmentation fault?

        1 Reply Last reply
        0
        • JKSHJ Offline
          JKSHJ Offline
          JKSH
          Moderators
          wrote on last edited by
          #4

          [quote author="xmaze" date="1422981305"]Why in constructor works and the GUI also don't return a segmentation fault? [/quote]I don't know. What is the value of data_len?

          Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

          1 Reply Last reply
          0
          • X Offline
            X Offline
            xmaze
            wrote on last edited by
            #5

            [quote author="JKSH" date="1422981695"][quote author="xmaze" date="1422981305"]Why in constructor works and the GUI also don't return a segmentation fault? [/quote]I don't know. What is the value of data_len?[/quote]

            262620

            1 Reply Last reply
            0
            • R Offline
              R Offline
              Rondog
              wrote on last edited by
              #6

              There isn't enough information to suggest anything useful.

              Since the original program had this in the main() function I assume that 'data' is global and is used globally by other modules. Moving this to a point further in the program means that 'data' might be created too late. The original program might have required this to be created and properly initialized before anything else (?).

              If you create another variable and use malloc() does the program still crash on malloc()? If it does maybe malloc() has been re-defined or overloaded somehow.

              1 Reply Last reply
              0
              • X Offline
                X Offline
                xmaze
                wrote on last edited by
                #7

                I found what is wrong but i dont know why!!

                If i try to allocate the memory with malloc in constructor everything its ok.
                if i try to allocate memory with malloc in an other section of the program i receive NULL pointer and segmentation fault.

                1 Reply Last reply
                0
                • A Offline
                  A Offline
                  andreyc
                  wrote on last edited by
                  #8

                  It is hard to tell what is wrong without a code.
                  Could you post simplified example of not-working code.

                  1 Reply Last reply
                  0
                  • X Offline
                    X Offline
                    xmaze
                    wrote on last edited by
                    #9

                    !http://i58.tinypic.com/s1pzdk.jpg!


                    !http://i62.tinypic.com/1053821.jpg!

                    This is the screen shots, the code is this one
                    @data = ((unsigned char *) malloc(data_len);@

                    If i put this line on Constructor i have the above results, it is successful,
                    if i put the code for example in a function like On_pushButton_clicked,
                    then i have the results in the second scree shot with a null pointer.

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      andreyc
                      wrote on last edited by
                      #10

                      Here is a simple example that works.
                      Could you try it and tell if it works in your environment.

                      @
                      #include <stdlib.h>
                      #include <iostream>

                      class Foo
                      {
                      public:
                      Foo()
                      {
                      data_len = 262620;
                      data = (unsigned char )malloc(data_len);
                      }
                      ~Foo()
                      {
                      if (data) {
                      free((void
                      )data);
                      }
                      }

                          unsigned char* getData() { return data; }
                          u_int32_t getDataLen() { return data_len; }
                      
                      private:
                          unsigned char* data;
                          u_int32_t data_len;
                      

                      };

                      int main(int, char **)
                      {
                      Foo a_foo;

                      std::cout << "Foo: data = " << std::hex << static_cast<void*>(a_foo.getData())
                                << " data_len = " << std::dec << a_foo.getDataLen() << std::endl;
                      
                      unsigned char* data;
                      u_int32_t data_len;
                      data_len = 262620;
                      data = (unsigned char *)malloc(data_len);
                      std::cout << "Local: data = " << std::hex << static_cast<void*>(a_foo.getData())
                                << " data_len = " << std::dec << a_foo.getDataLen() << std::endl;
                      if (data) {
                          free((void*)data);
                      }
                      
                      return 0;
                      

                      }
                      @

                      1 Reply Last reply
                      0
                      • X Offline
                        X Offline
                        xmaze
                        wrote on last edited by
                        #11

                        yes its working

                        1 Reply Last reply
                        0
                        • A Offline
                          A Offline
                          andreyc
                          wrote on last edited by
                          #12

                          It means that the problem is not in the location of this particular line but something else.

                          1 Reply Last reply
                          0
                          • X Offline
                            X Offline
                            xmaze
                            wrote on last edited by
                            #13

                            ok, i worked around and i think it's ok.

                            Do you have a suggestion how can i use the while(1) {} with the GUI ?
                            without corruption ?

                            if i use in while() a function like addWidgetItem in a TreeWidget then will be ok ?

                            1 Reply Last reply
                            0
                            • A Offline
                              A Offline
                              andreyc
                              wrote on last edited by
                              #14

                              If you have a code that requires to run its own loop then I suggest to put it into a separate thread and run the code using QThread::run().
                              Take a look on this "article":http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/ for an example.

                              1 Reply Last reply
                              0
                              • C Offline
                                C Offline
                                Chrisw01
                                wrote on last edited by
                                #15

                                Hi, not that this would fix your problem, however, the most common mistake I've ever seen in ANSI C coding is uninitialized pointers before use. Make it a good habit to always delcare, then initialize, and then use. I use malloc all over the place in QT without problems, however, I always initalize it in the constructor. Example in your Foo constructor place data = NULL; also do not forget to test and free then in your destructor or you may get memory leakage, example if(data != NULL) free(data); (which I see you have done). May not be your problem but it is good practice.

                                1 Reply Last reply
                                0
                                • JKSHJ Offline
                                  JKSHJ Offline
                                  JKSH
                                  Moderators
                                  wrote on last edited by
                                  #16

                                  [quote author="xmaze" date="1423001212"]if i use in while() a function like addWidgetItem in a TreeWidget then will be ok ?[/quote]Your GUI will freeze until your while-loop exits.

                                  So, if the loop runs for a very short time only, then it's ok. If the loop runs for a long time, then your GUI will stop responding.

                                  Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                                  1 Reply Last reply
                                  0
                                  • X Offline
                                    X Offline
                                    xmaze
                                    wrote on last edited by
                                    #17

                                    [quote author="JKSH" date="1423013834"][quote author="xmaze" date="1423001212"]if i use in while() a function like addWidgetItem in a TreeWidget then will be ok ?[/quote]Your GUI will freeze until your while-loop exits.

                                    So, if the loop runs for a very short time only, then it's ok. If the loop runs for a long time, then your GUI will stop responding.[/quote]

                                    QThread is it better or can i use also the pthread libs ?

                                    1 Reply Last reply
                                    0
                                    • JKSHJ Offline
                                      JKSHJ Offline
                                      JKSH
                                      Moderators
                                      wrote on last edited by
                                      #18

                                      QThread is more portable.

                                      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                                      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