|
Well their types do not matter that much with regards to the question, but here they are.
typedef std::pair< int, int > cartesian_type;
typedef std::map< std::string, cartesian_type > cart_map_type;
cart_map_type coord_cart_conv_;
Cartesian is probably not a good name since I am using {row, column} instead of {X, Y}, but I am still playing with the code.
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
John R. Shaw wrote: Well their types do not matter that much with regards to the question
Sure they do. A type determines the operations you can perform on an object and your question is asking why you can't perform a certain operation on an object.
That said, I can't see why your code doesn't compile. In fact, when I tried the following code it compiled just fine:
#include "stdafx.h"
#include <utility>
#include <map>
#include <string>
typedef std::pair< int, int > cartesian_type;
typedef std::map< std::string, cartesian_type > cart_map_type;
cart_map_type coord_cart_conv_;
int main(int arvc, char* argv[])
{
using namespace std;
cartesian_type cart = coord_cart_conv_[string("Hello")];
return 0;
}
Steve
|
|
|
|
|
Your code compiles just fine because main is not a constant member function of a class. If I removed the const from the end of the function declaration my original function would compile without error, but if I tried to call it via a constant object, after that, then I would get another set of errors, because you can not call a non-constant member function from a constant object..
The question had to do with calling operator[] in a constant function.
Try this:
class TestClass
{
typedef std::map< int, int > m_test_map;
public:
TestClass()
{
for( int i=0; i<10; ++i)
m_test_map[i] = i;
}
int get_value(int i) const
{
return m_test_map[i];
}
};
I have not tested the above, but it will generate the error in get_value . The reason for this is that no constant operator[] function is defined for maps.
The following should generate the same error for the same reason, because the same thing applies to strings:
class TestClass2
{
std::string m_str;
public:
TestClass() { m_str = "Hello"; }
int get_char(int i) const
{
return m_str[i];
}
};
This is an STL design issue, they have a reason for this behavior and I was just wondering what the logic behind it was.
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
As you mentioned, std::map<...>::operator [...] is a non-const function. This by design. operator [] returns a reference to the element based on a key and you can't have a reference to nothing. If you pass a key to operator [] that doesn't exist in the map it is added and a reference to the newly created element is returned; thus it can't be const .
Steve
|
|
|
|
|
|
When I create a CTreeCtrl with the TVS_CHECKBOXES property and then destroy it, it leaks the GDI objects for the TVSIL_STATE image list. I have tried adding the following code to the OnDestroy function of the CTreeCtrl's parent window. It is called but it doesn't have any affect.
// Delete the state image list so it doesn't leak GDI objects
//
CImageList *pStateImageList = m_Tree.GetImageList(TVSIL_STATE);
if (pStateImageList)
{
m_Tree.SetImageList(NULL, TVSIL_STATE);
pStateImageList->DeleteImageList();
}
CWnd::OnDestroy();
}
Any suggestions on how to fix this GDI leak?
|
|
|
|
|
Usually the image list is created as a member variable of some class, so it won't go out of scope. Why are you using pStateImageList?
|
|
|
|
|
The TVSIL_STATE image list is created automatically when the TVS_CHECKBOXES property is set on CTreeCtrl. The image lists contain the images of the checked and unchecked checkboxes.
|
|
|
|
|
This should do the same thing....does it work?
HIMAGELIST hImgList = TreeView_SetImageList(m_Tree.GetSafeHwnd(), NULL, TVSIL_STATE);
if (hImgList)
ImageList_Destroy(hImgList);
If not, is there a TVSIL_NORMAL imagelist that's not getting destroyed?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
This episode brought to you by the number 3
|
|
|
|
|
Thanks for the suggestion. I tried it and it did not fix the problem. There is a TVSIL_NORMAL imagelist and it is being destroyed. Also, I used a GDI leak detection program and I could see that it is the checkbox images that are being leaked.
|
|
|
|
|
Bummer.
I don't have a GDI leak detector but testing with task manager, I get:
// Adds 4 GDI Objects
m_TreeCtl.ModifyStyle(0, TVS_CHECKBOXES);
...
...
// Removes 4 GDI Objects
HIMAGELIST hImgList = TreeView_SetImageList(m_TreeCtl.GetSafeHwnd(), NULL, TVSIL_STATE);
if (hImgList)
ImageList_Destroy(hImgList);
I can't find any info documenting a leak.
Good luck!
Mark
Mark Salsbery
Microsoft MVP - Visual C++
This episode brought to you by the number 3
|
|
|
|
|
Please Help.
I am using Visual Studio 6 and have just moved my VC6 project into Rational ClearCase.
When I open the project I get a dialog box "Cannot access ClassView information file. ClassView information not available".
What file is Visual Studio looking for?.
|
|
|
|
|
cgb143 wrote: What file is Visual Studio looking for?.
Possibly one with a .clw extension.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
|
You should not put files with these extensions under source control.
.ncb
.aps
.clw
The .ncb file contains your Class View information, and if it read-only, you'll get the message you see.
The .aps file is your "apstudio" resources and also need to be read/write.
The .clw file is the class wizard file.
In fact, I recommend that you delete those files on a regular basis - they will all be recreated when needed automatically.
Hope that helps.
Karl - WK5M
PP-ASEL-IA (N43CS)
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
|
|
|
|
|
|
You could add the following to that list:
.pch
.mdp
.obj
.exe
.cpl
.awk
.exp
.lib
.idb
.opt
.pdb
.map
.res
.ilk
.bsc
.sbr
.dll
.tlb
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Thanks again,
However, most of these are in the Release / Debug folders which I had already excluded from ClearCase as I knew their contents were re-created during compilation.
|
|
|
|
|
Hi,
I have two CEdit controls in a dialog.
In Change() event handler of first control, I'm using first control's value and setting another random value of second control and finally calling UpdateData(FALSE);
But the text in first control remains same (old - whatever it was set in InitDialog()) and the caret is repositioned at first character.
Why isn't text if first control changing and caret is being positioned at first character again and again?
Can anyone help me out?
Regards,
Abhijeet
|
|
|
|
|
a_b_pathak wrote: Why isn't text if first control changing
You stated "I'm using first control's value and setting another random value of second control".
Why would that change the first control's text?
Can you post the code for your "Change() event handler"?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
This episode brought to you by the number 3
|
|
|
|
|
a_b_pathak wrote: ...and finally calling UpdateData(FALSE);
Why are you using UpdateData() for this? Just use a CEdit member variable for each edit control, and call the SetWindowText() method. For example:
void CDlg::OnChangeEdit1( LPNMHDR, LRESULT* )
{
CString strEdit1;
m_edit1.GetWindowText(strEdit1);
m_edit2.SetWindowText("Hello " + strEdit1);
}
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I found it....
I forgot to call UpdateData(TRUE); at the start of function so the text of first
control wasn't changing! stupid mistake though...
I'm not using Set/GetWindowText because i'm using Control Variable (value).
|
|
|
|
|
a_b_pathak wrote: I'm not using Set/GetWindowText because i'm using Control Variable
Then you can use the CWnd::GetWindowText/CWnd::SetWindowText methods, as DavidCrow stated.
FYI - You don't always need to use UpdateData()...see Avoiding UpdateData[^]
Mark
Mark Salsbery
Microsoft MVP - Visual C++
This episode brought to you by the number 3
|
|
|
|
|
Background:
I have two streams, one that writes to a text file called replay.txt, and one that reads from replay.txt. Both events occur while my app is running. So the basic architecture is that while I am simulating something, the app is writing to replay.txt keep track of position of objects and sensors and isDone is false. When the simulation is complete, isDone is true, and the app reads from replay.txt and uses the data in the file to replicate the simulation (like a replay video). dg_replay is the stream that reads from the file. Following the the text file data:
replay.txt
---------
dg_bead
-15
5
5
1
0
dg_grasper
0
0
0
0
Problem: In line marked (A), the values read into x,y,z,d,ts are -15,5,5,1,0 respectively. Then i++ which means that that (i=0) stuff is not going to be processed again. The next process is going to be in the else clause which reads in x,y,z,ss. Now logically, as i would think, the next four numbers should be 0,0,0,0 respectively in those variables. However the data read in to x,y,z,ss is also -15,5,5,1,0!! The same data is read twice..WHY??!
code:
(note #1: i have initialized all variables in the beginning of the file - not shown)
(note #2: this code snippet is part of a function that is called every 1/30th of a second which basically makes this part of a loop)
-----
if (isDone) {
cerr << "eof: " << dg_replay.eof() << "\n";
if (!dg_replay.eof()) {
if (i == 0) { // signals the app to read in the initial states in the file
dg_scenario::dg_video.close();
dg_scenario::video = 1;
if (dg_replay.is_open()) dg_replay.getline(tool_name,256);
(A) dg_replay >> x >> y >> z >> d >> ts;
universe->findObject(tool_name)->CenterObject();
universe->findObject(tool_name)->Translate(x,y,z);
universe->findObject(tool_name)->setDynamicsInt(d);
universe->findObject(tool_name)->being_grabbed = ts;
dg_replay.getline(tool_name,256);
} else {
// process sensor stuff - PROBLEM: reading in the same #s (-15,5,5,) everytime...
(B) dg_replay >> x >> y >> z >> ss;
xyz.x = x; xyz.y = y; xyz.z = z;
left_down = ss; // mouse sensor state - if left_down is 0, then its false and forcep is open etc..
}
i++;
} else {
i = -1;
dg_replay.close();
}
}
--
dg
|
|
|
|
|
Are you reopening the file every time this is called? If so, you may need to keep track of the
file pointer so you can seek past the last read data each time.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
This episode brought to you by the number 3
|
|
|
|