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] QHash's insert() wrong use? --> VS-Debugger showed botch data due to missing Qt-Addon for VS

[solved] QHash's insert() wrong use? --> VS-Debugger showed botch data due to missing Qt-Addon for VS

Scheduled Pinned Locked Moved General and Desktop
45 Posts 7 Posters 18.0k Views
  • 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.
  • Z Offline
    Z Offline
    ZapB
    wrote on last edited by
    #19

    I could not see a main() function in what you posted.

    Nokia Certified Qt Specialist
    Interested in hearing about Qt related work

    1 Reply Last reply
    0
    • L Offline
      L Offline
      ludde
      wrote on last edited by
      #20

      The main function is inside the MyDockWidget class - looks really weird to me... Does the main function not have to be global?

      Regarding the link errors, which IDE are you using to build your project?

      1 Reply Last reply
      0
      • H Offline
        H Offline
        huckfinn
        wrote on last edited by
        #21

        ah ok. without MyDockWidget:: in front?

        just:
        @int main(int p_argsc, char *p_argsv[] ) {
        myDataController.addNew(2511, "Heim", 20481, 1272923);
        myDataController.addNew(2512, "Work", 20482, 1272963);
        // Breakpoint here
        return 1;
        }
        @

        1 Reply Last reply
        0
        • L Offline
          L Offline
          ludde
          wrote on last edited by
          #22

          Yeah, but then you cannot use myDataController, you have to create it first.
          And remove the declaration of main() in the .h file.

          1 Reply Last reply
          0
          • H Offline
            H Offline
            huckfinn
            wrote on last edited by
            #23

            [quote author="ludde" date="1309856111"]Regarding the link errors, which IDE are you using to build your project?[/quote]
            Visual Studio 2008 Version 9

            1 Reply Last reply
            0
            • H Offline
              H Offline
              huckfinn
              wrote on last edited by
              #24

              [quote author="ludde" date="1309856111"]The main function is inside the MyDockWidget class - looks really weird to me... Does the main function not have to be global?[/quote]

              This project is in real a *.dll. I just extracted the required methods and classes to reproduce my QHash problem.

              Hint: The original projects were generated by cmake, which should add corresponding libs correctly.

              1 Reply Last reply
              0
              • G Offline
                G Offline
                giesbert
                wrote on last edited by
                #25

                huckfinn,

                are you using MSDEV for building?
                If yes, please post your vcproj file via pastebin ort similar shares. I'm sure, the problem is located there.

                Nokia Certified Qt Specialist.
                Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                1 Reply Last reply
                0
                • H Offline
                  H Offline
                  huckfinn
                  wrote on last edited by
                  #26

                  Here is my vproj file:

                  @
                  <?xml version="1.0" encoding="Windows-1252"?>
                  <VisualStudioProject
                  ProjectType="Visual C++"
                  Version="9,00"
                  Name="deldel3"
                  ProjectGUID="{19DD986F-AEBE-4C05-8309-B174DE1C1C3F}"
                  RootNamespace="deldel3"
                  TargetFrameworkVersion="196613"

                  <Platforms>
                  <Platform
                  Name="Win32"
                  />
                  </Platforms>
                  <ToolFiles>
                  </ToolFiles>
                  <Configurations>
                  <Configuration
                  Name="Debug|Win32"
                  OutputDirectory="$(SolutionDir)$(ConfigurationName)"
                  IntermediateDirectory="$(ConfigurationName)"
                  ConfigurationType="1"
                  UseOfMFC="0"
                  CharacterSet="2"

                  <Tool
                  Name="VCPreBuildEventTool"
                  />
                  <Tool
                  Name="VCCustomBuildTool"
                  />
                  <Tool
                  Name="VCXMLDataGeneratorTool"
                  />
                  <Tool
                  Name="VCWebServiceProxyGeneratorTool"
                  />
                  <Tool
                  Name="VCMIDLTool"
                  />
                  <Tool
                  Name="VCCLCompilerTool"
                  Optimization="0"
                  AdditionalIncludeDirectories=""C:\\Qt\\qt-win-opensource-src-4.5.0\\include\\QtGui";"C:\\Qt\\qt-win-opensource-src-4.5.0\\include\\QtCore";"C:\\Qt\\qt-win-opensource-src-4.5.0\\include""
                  MinimalRebuild="true"
                  BasicRuntimeChecks="3"
                  RuntimeLibrary="2"
                  WarningLevel="3"
                  DebugInformationFormat="4"
                  />
                  <Tool
                  Name="VCManagedResourceCompilerTool"
                  />
                  <Tool
                  Name="VCResourceCompilerTool"
                  />
                  <Tool
                  Name="VCPreLinkEventTool"
                  />
                  <Tool
                  Name="VCLinkerTool"
                  LinkLibraryDependencies="false"
                  UseUnicodeResponseFiles="false"
                  AdditionalLibraryDirectories=""C:\\Qt\\qt-win-opensource-src-4.5.0\\lib\\QtCored4.lib";"C:\\Qt\\qt-win-opensource-src-4.5.0\\lib\\QtCore4.lib""
                  GenerateDebugInformation="true"
                  EntryPointSymbol="main"
                  TargetMachine="1"
                  />
                  <Tool
                  Name="VCALinkTool"
                  />
                  <Tool
                  Name="VCManifestTool"
                  />
                  <Tool
                  Name="VCXDCMakeTool"
                  />
                  <Tool
                  Name="VCBscMakeTool"
                  />
                  <Tool
                  Name="VCFxCopTool"
                  />
                  <Tool
                  Name="VCAppVerifierTool"
                  />
                  <Tool
                  Name="VCPostBuildEventTool"
                  />
                  </Configuration>
                  <Configuration
                  Name="Release|Win32"
                  OutputDirectory="$(SolutionDir)$(ConfigurationName)"
                  IntermediateDirectory="$(ConfigurationName)"
                  ConfigurationType="1"
                  CharacterSet="2"
                  WholeProgramOptimization="1"

                  <Tool
                  Name="VCPreBuildEventTool"
                  />
                  <Tool
                  Name="VCCustomBuildTool"
                  />
                  <Tool
                  Name="VCXMLDataGeneratorTool"
                  />
                  <Tool
                  Name="VCWebServiceProxyGeneratorTool"
                  />
                  <Tool
                  Name="VCMIDLTool"
                  />
                  <Tool
                  Name="VCCLCompilerTool"
                  Optimization="2"
                  EnableIntrinsicFunctions="true"
                  RuntimeLibrary="2"
                  EnableFunctionLevelLinking="true"
                  WarningLevel="3"
                  DebugInformationFormat="3"
                  />
                  <Tool
                  Name="VCManagedResourceCompilerTool"
                  />
                  <Tool
                  Name="VCResourceCompilerTool"
                  />
                  <Tool
                  Name="VCPreLinkEventTool"
                  />
                  <Tool
                  Name="VCLinkerTool"
                  GenerateDebugInformation="true"
                  OptimizeReferences="2"
                  EnableCOMDATFolding="2"
                  TargetMachine="1"
                  />
                  <Tool
                  Name="VCALinkTool"
                  />
                  <Tool
                  Name="VCManifestTool"
                  />
                  <Tool
                  Name="VCXDCMakeTool"
                  />
                  <Tool
                  Name="VCBscMakeTool"
                  />
                  <Tool
                  Name="VCFxCopTool"
                  />
                  <Tool
                  Name="VCAppVerifierTool"
                  />
                  <Tool
                  Name="VCPostBuildEventTool"
                  />
                  </Configuration>
                  </Configurations>
                  <References>
                  </References>
                  <Files>
                  <Filter
                  Name="Source Files"
                  Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
                  UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"

                  <File
                  RelativePath=".\\DataController.cpp"
                  >
                  </File>
                  <File
                  RelativePath=".\\DataItem.cpp"
                  >
                  </File>
                  <File
                  RelativePath=".\\MyDockWidget.cpp"
                  >
                  </File>
                  </Filter>
                  <Filter
                  Name="Header Files"
                  Filter="h;hpp;hxx;hm;inl;inc;xsd"
                  UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"

                  <File
                  RelativePath=".\\DataController.h"
                  >
                  </File>
                  <File
                  RelativePath=".\\DataItem.h"
                  >
                  </File>
                  <File
                  RelativePath=".\\MyDockWidget.h"
                  >
                  </File>
                  </Filter>
                  <Filter
                  Name="Resource Files"
                  Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
                  UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"

                  </Filter>
                  </Files>
                  <Globals>
                  </Globals>
                  </VisualStudioProject>
                  @

                  Thank you for your patience. Cheers Huck

                  [EDIT: code formatting, use @-tags, not 'quote', Volker]

                  1 Reply Last reply
                  0
                  • G Offline
                    G Offline
                    giesbert
                    wrote on last edited by
                    #27

                    Hi,

                    I see two bugs in there:

                    you do not link the QtCore.lib in release mode

                    You link debug and release lib in debug mode.

                    Correct this and try again please.

                    Nokia Certified Qt Specialist.
                    Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                    1 Reply Last reply
                    0
                    • G Offline
                      G Offline
                      giesbert
                      wrote on last edited by
                      #28

                      additionally, you would typically have some stuff in the Globals section:

                      @
                      <Globals>
                      <Global
                      Name="MocDir"
                      Value=".\\GeneratedFiles\\$(ConfigurationName)"
                      />
                      <Global
                      Name="QtVersion"
                      Value="MSVS2008SP1"
                      />
                      <Global
                      Name="RccDir"
                      Value=".\\GeneratedFiles"
                      />
                      <Global
                      Name="UicDir"
                      Value=".\\GeneratedFiles"
                      />
                      </Globals>
                      </VisualStudioProject>
                      @

                      EDIT: this is used by the Qt plugin for MSVS

                      Nokia Certified Qt Specialist.
                      Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                      1 Reply Last reply
                      0
                      • H Offline
                        H Offline
                        huckfinn
                        wrote on last edited by
                        #29

                        They're empty..
                        @ <Globals>
                        </Globals>@

                        What was MSDEV? (previous post)

                        1 Reply Last reply
                        0
                        • H Offline
                          H Offline
                          huckfinn
                          wrote on last edited by
                          #30

                          [quote author="Gerolf" date="1309865412"]Hi, I see two bugs in there: # you do not link the QtCore.lib in release mode # You link debug and release lib in debug mode. Correct this and try again please.[/quote]

                          Thank you Gerolf. Now, I can compile link and run my program.
                          Project --> Properties --> Linker --> Input --> Additional dependecies --> PathToCore4Lib\QtCore4.lib

                          And I have same error with my QHash. It was reproducable.

                          Here is my sourcecode again:
                          MyDockWidget cpp and h
                          @
                          #include "MyDockWidget.h"
                          #include "DataController.h"

                          MyDockWidget::MyDockWidget( )
                          {
                          }

                          int main(int p_argsc, char *p_argsv[] )
                          {
                          DataController myDataController;
                          myDataController.addNew(2511, "Heim", 20481, 1272923);
                          myDataController.addNew(2512, "Work", 20482, 1272963);
                          // Breakpoint here
                          return 1;
                          }

                          // here header
                          #ifndef MY_DOCK_WIDGET_H
                          #define My_DOCK_WIDGET_H
                          #include <QString>
                          #include "DataController.h"

                          class MyDockWidget
                          {
                          public:
                          MyDockWidget();
                          DataController myDataController;
                          };
                          #endif // MY_DOCK_WIDGET_H
                          @

                          DataController cpp and h
                          @
                          #include <QHash>
                          #include "DataController.h"
                          #include "DataItem.h"

                          void DataController::addNew(qint32 tID, QString tName, qint32 tCat, qint32 tCon)
                          {
                          DataItem * tPI = new DataItem(tID, tName, tCat, tCon);
                          this->myQHash.insert(tID, tPI);
                          }

                          DataController::~DataController(void) {}

                          // here header
                          #pragma once

                          #include <QString>
                          #include <QHash>
                          #include "DataItem.h"

                          class DataController
                          {
                          public:
                          ~DataController(void);
                          void addNew(qint32, QString, qint32, qint32);
                          private:
                          QHash<qint32, DataItem*> myQHash;
                          };
                          @

                          DataItem cpp and h
                          @
                          #include "DataItem.h"
                          #include <QString>
                          DataItem::DataItem()
                          {
                          this->dataID = 0;
                          this->dataCon = 0;
                          this->dataCat = 0;
                          this->dataName = "defName";
                          }

                          DataItem::DataItem(qint32 tId, QString tName, qint32 tCat, qint32 tCon)
                          {
                          this->dataID = tId;
                          this->dataCon = tCon;
                          this->dataCat = tCat;
                          this->dataName = tName;
                          }

                          qint32 DataItem::getID() const { return this->dataID; }

                          QString DataItem::getName() const { return this->dataName; }

                          qint32 DataItem::getCat() const { return this->dataCat; }

                          qint32 DataItem::getCon() const { return this->dataCon; }

                          DataItem::~DataItem(void) {}

                          // here header
                          #pragma once

                          #include <QString>

                          class DataItem
                          {
                          public:
                          DataItem();
                          DataItem(qint32 tId, QString tName, qint32 tCat, qint32 tCon);
                          ~DataItem(void);

                          qint32 getID() const;
                          QString getName() const;
                          qint32 getCat() const;
                          qint32 getCon() const;

                          private:
                          qint32 dataID;
                          QString dataName;
                          qint32 dataCat;
                          qint32 dataCon;
                          };
                          @

                          Cheers Huck

                          1 Reply Last reply
                          0
                          • H Offline
                            H Offline
                            huckfinn
                            wrote on last edited by
                            #31

                            and here you have the log of my myDataController from the Watch window:

                            @- myDataController {myQHash={...} } DataController

                            • myQHash {d=0x003d35a0 e=0x003d35a0 } QHash<int,DataItem *>
                            • d 0x003d35a0 {fakeNext=0x00000000 buckets=0x003d35d8 ref={...} ...} QHashData *
                            • fakeNext 0x00000000 {next=??? h=??? } QHashData::Node *
                            • buckets 0x003d35d8 QHashData::Node * *
                            • ref {_q_value=1 } QBasicAtomicInt
                              size 2 int
                              nodeSize 12 int
                              userNumBits 4 short
                              numBits 4 short
                              numBuckets 17 int
                              sharable 1 unsigned int
                            • e 0x003d35a0 {next=0x00000000 h=4011480 key=4011480 ...} QHashNode<int,DataItem *> *
                            • next 0x00000000 {next=??? h=??? key=??? ...} QHashNode<int,DataItem *> *
                              next CXX0030: Error: expression cannot be evaluated
                              h CXX0030: Error: expression cannot be evaluated
                              key CXX0030: Error: expression cannot be evaluated
                              value CXX0030: Error: expression cannot be evaluated
                              h 4011480 unsigned int
                              key 4011480 int
                            • value 0x00000001 {dataID=??? dataName={...} dataCat=??? ...} DataItem *
                              dataID CXX0030: Error: expression cannot be evaluated
                            • dataName {d=??? } QString
                              d CXX0017: Error: symbol "" not found
                              dataCat CXX0030: Error: expression cannot be evaluated
                              dataCon CXX0030: Error: expression cannot be evaluated
                              @
                            1 Reply Last reply
                            0
                            • L Offline
                              L Offline
                              ludde
                              wrote on last edited by
                              #32

                              That log does not say much, at least not to me.
                              What is the problem now? I.e. what does the program do, and what did you expect it do?

                              1 Reply Last reply
                              0
                              • Z Offline
                                Z Offline
                                ZapB
                                wrote on last edited by
                                #33

                                Indeed. I suggest writing unit tests for your classes.

                                Nokia Certified Qt Specialist
                                Interested in hearing about Qt related work

                                1 Reply Last reply
                                0
                                • H Offline
                                  H Offline
                                  huckfinn
                                  wrote on last edited by
                                  #34

                                  Ah ok, let me make this clear:

                                  I have a in form of --> QHash<qint32, DataItem*>
                                  DataItem has a few simple attributes int, QString see class.

                                  Then I push key-value pairs on that QHash
                                  @myDataController->addNew(2512, "Work", 20482, 1272963);@
                                  by generating a new DataItemObject by those parameters and store
                                  <2512, DataItemGeneratedFrom_2512_Work_20482_1272963>

                                  Then my DataController, which contains my QHash, should store these values in there. As in the example above following values shoule be (2512, "Work", 20482, 1272963), but according to my WatchWindow in debug mode, there are other (not the one I entered above) values in there (see first post and picture in second post).

                                  1 Reply Last reply
                                  0
                                  • H Offline
                                    H Offline
                                    huckfinn
                                    wrote on last edited by
                                    #35

                                    [quote author="ZapB" date="1309869796"]Indeed. I suggest writing unit tests for your classes.[/quote]

                                    I have never done this before. VS --> Test --> New test... --> Create new
                                    then I shall insert test logic: @ [TestMethod]
                                    void TestMethod1()
                                    {
                                    //
                                    // TODO: Add test logic here
                                    //
                                    };@

                                    Any tutorials? Hints? Todos?

                                    1 Reply Last reply
                                    0
                                    • Z Offline
                                      Z Offline
                                      ZapB
                                      wrote on last edited by
                                      #36

                                      Hmmm, I am not sure of how to do it with Visual Studio. I use the QtTest framework that ships with Qt. With that you create a sub-project that gets compiled as an application that tests your particular class (you have to write the tests of course). Take a look at the "docs":http://developer.qt.nokia.com/doc/qt-4.7/qtestlib-manual.html#id-df520d0c-f4d5-40a0-a379-b016eb2962a1 for an introduction to QtTest and also a "turorial":http://developer.qt.nokia.com/doc/qt-4.7/qtestlib-tutorial.html#id-286e4ba0-d890-4d30-bb60-4e3e70f88401

                                      Nokia Certified Qt Specialist
                                      Interested in hearing about Qt related work

                                      1 Reply Last reply
                                      0
                                      • L Offline
                                        L Offline
                                        ludde
                                        wrote on last edited by
                                        #37

                                        Unit testing is great, but perhaps learning how to write unit tests for just this problem is a bit of an obstacle.
                                        I would suggest adding some debug output to your code that shows the contents of the hash table.

                                        1 Reply Last reply
                                        0
                                        • Z Offline
                                          Z Offline
                                          ZapB
                                          wrote on last edited by
                                          #38

                                          Yes unit testing is a bind and extra work but it pays dividends as your unit tests can be used to catch regressions much more easily than your production code (assuming your tests are sufficient and hat you actually run them of course).

                                          Striking the balance is up to the author.

                                          Nokia Certified Qt Specialist
                                          Interested in hearing about Qt related work

                                          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