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. [SOLVED] QMAP
Forum Updated to NodeBB v4.3 + New Features

[SOLVED] QMAP

Scheduled Pinned Locked Moved General and Desktop
12 Posts 2 Posters 4.2k Views 2 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.
  • K Offline
    K Offline
    koahnig
    wrote on last edited by
    #2

    Are you sure that the map is not empty when print the first time?

    Vote the answer(s) that helped you to solve your issue(s)

    gian71G 1 Reply Last reply
    0
    • K koahnig

      Are you sure that the map is not empty when print the first time?

      gian71G Offline
      gian71G Offline
      gian71
      wrote on last edited by koahnig
      #3

      @koahnig
      yes you are write the MAP is empty.
      Let me explain better the issue. I have an object that contains a list of objects2 that contains a list of object3. The objects3 has as member the Map.

      In my algorithm I need to find a specific Object3 and initialize the map.
      The object/objects2/objects3 are already created (maps are empty).

      so...I am able to find the Object3 and the pointer to the Object3. I do update the Object3 with the map, then I use a function cal Object3.print()...to verify the contents is correct(It Is). I do that in a for(for(for))) loop...for all the maps/Objects3. When I finish I ask to print all the Object3 and the result is empty...

      for(int j=0;j<(Object.getDbcMessages(i))->msgSignals.size();j++){
      	if((Object.getDbcMessages(i))->getSignalsRef(j)->getSigName() == sigName){
      		QMap<quint64,QString> myMap;
      		CANSignal *s = (Object.getDbcMessages(i))->getSignalsRef(j);
      		for(int k=0; k<(stringL.length()-1);k=k+2){
      			myMap.insert(stringL.at(k).toLongLong(),stringL.at(k+1));
      		}
      		s->mappedValues = myMap;
      		s->printMap();   // this prints the correct Map
      		break;
      	}
      }
      

      ....
      // if I print the map here...it is empty.

      [edit, koahnig] Markdown tags added for code

      1 Reply Last reply
      0
      • K Offline
        K Offline
        koahnig
        wrote on last edited by
        #4

        I have added markdown tags to your code to make it more readable. Please check out the markdown tags at the end of the thread.
        You pull a pointer from somewhere with CANSignal *s = (Object.getDbcMessages(i))->getSignalsRef(j);
        You create a map and fill it with information :

                QMap<quint64,QString> myMap;
                for(int k=0; k<(stringL.length()-1);k=k+2){
                    myMap.insert(stringL.at(k).toLongLong(),stringL.at(k+1));
                }
        

        You assign the map to an instance of a structure you have a pointer to s->mappedValues = myMap;
        Since you can print immediately after the assignment, so far all is most likely ok.

        The question is what the pointer is?
        My guess is that you are pulling a new pointer when you print again. Obviously you obtain the pointer for information from a DB. However, most likely your pointer is a simple pointer for an assembly of the information, but not to the content of the DB.
        Therefore, you assign the information to the structure, but this is immediately destroyed. Probably you need to have an update to the DB for storing the information also in the DB.

        Note: This is a bit crystal ball reading and may not be vary accurate.

        Vote the answer(s) that helped you to solve your issue(s)

        1 Reply Last reply
        0
        • gian71G Offline
          gian71G Offline
          gian71
          wrote on last edited by
          #5

          Thanks, I will add markdown tags next time, sorry about that.

          I understand it is difficult without the complete code, but there are too many lines...

          I am trying to debug more in deep, there is something basic I am missing for sure...I will post updates, thanks for now.

          1 Reply Last reply
          0
          • K Offline
            K Offline
            koahnig
            wrote on last edited by
            #6

            Try this one

            for(int j=0;j<(Object.getDbcMessages(i))->msgSignals.size();j++){
                if((Object.getDbcMessages(i))->getSignalsRef(j)->getSigName() == sigName){
                    QMap<quint64,QString> myMap;
                    for(int k=0; k<(stringL.length()-1);k=k+2){
                        myMap.insert(stringL.at(k).toLongLong(),stringL.at(k+1));
                    }
                    CANSignal *s = (Object.getDbcMessages(i))->getSignalsRef(j);
                    s->mappedValues = myMap;
                    s->printMap();   // this prints the correct Map
                    CANSignal *s_another = (Object.getDbcMessages(i))->getSignalsRef(j);
                    s_another->printMap();   // this prints the correct Map
                    break;
                }
            }
            

            when my assumption is correct, the first printMap will work, but the second will not.

            Vote the answer(s) that helped you to solve your issue(s)

            gian71G 1 Reply Last reply
            0
            • K koahnig

              Try this one

              for(int j=0;j<(Object.getDbcMessages(i))->msgSignals.size();j++){
                  if((Object.getDbcMessages(i))->getSignalsRef(j)->getSigName() == sigName){
                      QMap<quint64,QString> myMap;
                      for(int k=0; k<(stringL.length()-1);k=k+2){
                          myMap.insert(stringL.at(k).toLongLong(),stringL.at(k+1));
                      }
                      CANSignal *s = (Object.getDbcMessages(i))->getSignalsRef(j);
                      s->mappedValues = myMap;
                      s->printMap();   // this prints the correct Map
                      CANSignal *s_another = (Object.getDbcMessages(i))->getSignalsRef(j);
                      s_another->printMap();   // this prints the correct Map
                      break;
                  }
              }
              

              when my assumption is correct, the first printMap will work, but the second will not.

              gian71G Offline
              gian71G Offline
              gian71
              wrote on last edited by
              #7

              @koahnig

              Thanks for taking the time to look into this.
              I tried your code, both prints work fine.
              Now, I use this functions to get the pointer...

              CANSignal* CANMsg::getSignalsRef(int i) {
                  return &(msgSignals[i]);
              }
              

              msgSignals is a QList<CANSignal>

              Is there anything wrong to get the pointer to a QList element in this way? I do not have compilation errors.

              Thanks

              1 Reply Last reply
              0
              • K Offline
                K Offline
                koahnig
                wrote on last edited by
                #8

                I think there is the issue.
                First question why are you using a pointer there? You could do the same with a reference.
                However, also the reference may fail later on. This depends completely on what has been implemented in order obtain the pointer to the list. When the list respectively its location is different from call to call. For whatever reason it seems to be identical when you call it immediately twice.

                I am still thinking that you do not update the original structure, but only a copy somewhere. However, it is hard for me to prove without seeing the whole.

                Another possible check for you might be:

                for(int j=0;j<(Object.getDbcMessages(i))->msgSignals.size();j++){
                    if((Object.getDbcMessages(i))->getSignalsRef(j)->getSigName() == sigName){
                        QMap<quint64,QString> myMap;
                        for(int k=0; k<(stringL.length()-1);k=k+2){
                            myMap.insert(stringL.at(k).toLongLong(),stringL.at(k+1));
                        }
                        CANSignal *s = (Object.getDbcMessages(i))->getSignalsRef(j);
                        s->mappedValues = myMap;
                        s->printMap();   // this prints the correct Map
                    }
                }`
                for(int j=0;j<(Object.getDbcMessages(i))->msgSignals.size();j++){
                    if((Object.getDbcMessages(i))->getSignalsRef(j)->getSigName() == sigName){
                        CANSignal *s_another = (Object.getDbcMessages(i))->getSignalsRef(j);
                        s_another->printMap();   // this may not print the correct Map
                        break;
                    }
                }
                

                Vote the answer(s) that helped you to solve your issue(s)

                1 Reply Last reply
                0
                • gian71G Offline
                  gian71G Offline
                  gian71
                  wrote on last edited by
                  #9

                  I am totally with you, I am sure I do not update the original structure. Originally I was not using the pointers...I changed the code just because I had this problem and I wanted to make sure I was pointing to the right structure...which seems not to be the case even using the pointers..

                  I think there is something more fundamental that I am missing...and understand you can't help more without the project...I will try other solutions and update this post...

                  thanks for now.

                  1 Reply Last reply
                  0
                  • K Offline
                    K Offline
                    koahnig
                    wrote on last edited by
                    #10

                    You are the only one who should be in the perfect position to understand your code.

                    You probably have to go through your code line by line with the debugger to get hold of the issue. Or you have to comment out things between working and not working sections. Unfortunately, both methods are rather painful.

                    Good luck anyway.

                    Vote the answer(s) that helped you to solve your issue(s)

                    gian71G 1 Reply Last reply
                    0
                    • K koahnig

                      You are the only one who should be in the perfect position to understand your code.

                      You probably have to go through your code line by line with the debugger to get hold of the issue. Or you have to comment out things between working and not working sections. Unfortunately, both methods are rather painful.

                      Good luck anyway.

                      gian71G Offline
                      gian71G Offline
                      gian71
                      wrote on last edited by
                      #11

                      @koahnig

                      Ok , sometimes I feel really stupid...all the functions implemented were working correctly. The map has always been stored into the structure but...the second print function was not working in the right way...Still trying to understand why...

                      1 Reply Last reply
                      0
                      • K Offline
                        K Offline
                        koahnig
                        wrote on last edited by
                        #12

                        Unfortunately such things are happening to everyone too often ;)

                        Obviously, you do the access to the second print not correctly at all respectively the framework has changed when you arrive there.

                        Vote the answer(s) that helped you to solve your issue(s)

                        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