|
Using C-runtime functions in a thread created by a method other than calling _beginthread, _beginthreadex[^] is bad form and a recipe for disaster. The reason the CRT has these functions is that some features of the CRT require thread specific initialisation, which your code is bypassing. The following is quoted from the documentation on CreateThread[^]:
A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multi-threaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions.
Steve
|
|
|
|
|
You're right, thanks for pointing out.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Hi,
I want to call a templated function with template parameters chosen at runtime.
for example something like this
func(int x)
{
if( x == 0)
templatedFunction <<int>> y = new templatedFunc<<int>>();
else
templatedFunction <<double>> y = new templatedFunc<<double>>();
}
is this possible in C++?
thx in advance
|
|
|
|
|
You answered your own question i believe. It is possible with switch cases or using if-else.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Life: great graphics, but the gameplay sux. <
|
|
|
|
|
I tried the code below
switch (pType)
{
case itk::ImageIOBase::IOComponentType::CHAR:
otb::VectorImage<char, 2>::Pointer p = otb::VectorImage<char, 2>::New();
break;
case itk::ImageIOBase::IOComponentType::UCHAR:
otb::VectorImage<unsigned char, 2>::Pointer p = otb::VectorImage<unsigned char, 2>::New();
break;
}
when this code compiles it gives errors
Error 4 error C2360: initialization of 'p' is skipped by 'case' label d:\otb\imageeditorapp\imagetoolbox\imageio.h 44
Error 5 error C2371: 'p' : redefinition; different basic types d:\otb\imageeditorapp\imagetoolbox\imageio.h 45
Error 9 error C2360: initialization of 'p' is skipped by 'case' label d:\otb\imageeditorapp\imagetoolbox\imageio.h 44
Error 10 error C2371: 'p' : redefinition; different basic types d:\otb\imageeditorapp\imagetoolbox\imageio.h 45
I did not understand the mistake, if this is possible :/
|
|
|
|
|
Read this[^], and when you get errors, you can click on them in your output window, on the part after the error word, for example C2360 and press F1 to see what that error means, assuming you are using VS.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Life: great graphics, but the gameplay sux. <
|
|
|
|
|
I tried with the code below and it compied without errors
if(pType == itk::ImageIOBase::IOComponentType::CHAR)
otb::VectorImage<char,2>::Pointer p = otb::VectorImage<char,2>::New();
else if(pType == itk::ImageIOBase::IOComponentType::UCHAR)
otb::VectorImage<unsigned>::Pointer p = otb::VectorImage<unsigned>::New();
</unsigned></unsigned>
bu I could not understand why, is there a problem with my switch statement code in the previous message
|
|
|
|
|
You need to define a scope for the memory allocation in the switch statement.
Put the object creation code with parenthesis.
switch (pType)
{
case itk::ImageIOBase::IOComponentType::CHAR:
{
otb::VectorImage<char, 2>::Pointer p = otb::VectorImage<char, 2>::New();
}
break;
case itk::ImageIOBase::IOComponentType::UCHAR:
{
otb::VectorImage<unsigned char, 2>::Pointer p = otb::VectorImage<unsigned char, 2>::New();
}
break;
}
This also means you can use the object only within the parenthesis.
The new lambda functions available in the new C++ standards is what you need.
But unfortunately it is not currently available.
It will be available in VS 2010.
«_Superman_»
|
|
|
|
|
So you mean I can not use this new variable after the switch or if statement
if (x==0)
double y;
else
int y;
y = 0; ERROR // 'y' undeclared identifier
So any of you have a solution for this kind of problem?
What I want to do is this.
I have a parameter, and I want to declare a templated variable according to this parameter(if parameter is 1, it is char, if 2, int etc). and I will use it till the end of the scope of the program.
|
|
|
|
|
Why don't do all processing there itself.
switch (pType)
{
case itk::ImageIOBase::IOComponentType::CHAR:
{
otb::VectorImage<char, 2>::Pointer p = otb::VectorImage<char, 2>::New();
DoAllProcessing(p);
}
break;
case itk::ImageIOBase::IOComponentType::UCHAR:
{
otb::VectorImage<unsigned char, 2>::Pointer p = otb::VectorImage<unsigned char, 2>::New();
DoAllProcessing(p);
}
break;
}
OR
otb::VectorImage&lt;char, 2>::Pointer p1;
otb::VectorImage&lt;unsigned char, 2>::Pointer p2;
int flag = 0;
switch (pType)
{
case itk::ImageIOBase::IOComponentType::CHAR:
{
p1 = otb::VectorImage<char, 2>::New();
flag = 1;
}
break;
case itk::ImageIOBase::IOComponentType::UCHAR:
{
p2 = otb::VectorImage<unsigned char, 2>::New();
flag = 2;
}
break;
}
if (1 == flag)
DoAllProcessing(p1);
else if (2 == flag)
DoAllProcessing(p2);
«_Superman_»
|
|
|
|
|
I'll continue with one of the possibilities, thx for your help, but it is a disappointment not being able to code in a straight manner
|
|
|
|
|
Write a wrapper class (maybe a template) that can hold whatever type of value you wish to use. OR maybe use template methods, am not completely sure what you want to do exactly. You can't declare a variable without explicitly stating a type, so this doesn't work:
if (whatever_condition_is_true) make Y an int;
else make Y a double;
return Y;
BUT you could make a wrapper, something like this, for example:
class CWrapperBase
{
...
};
template <typename typename="">
class CWrapper: public CWrapperBase
{
public:
TypeName m_value;
CWrapper(const TypeName &value)
{
m_value = value;
}
operator =(const TypeName &other)
{
m_value = other;
}
operator TypeName &()
{
return m_value;
}
};
CWrapperBase GetValue(int x)
{
if (x == 0) return CWrapper<double>(1.0);
else return CWrapper<int>(2);
}
</int></double></typename>
This above is far from complete, just a starting point...
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Life: great graphics, but the gameplay sux. <
|
|
|
|
|
hhhakan wrote: bu I could not understand why, is there a problem with my switch statement code in the previous message Confused
Quote Selected Text
Yes and no, I believe.
The following code fails to compile:
1. void func1(int input)
2. {
3. switch(input)
4. {
5. case 0:
6. int g = 0;
7. break;
8. case 1:
9. int h = 0;
10 break;
11 }
12 }
With the following error:
line 8 error: jump to case label
line 6 error: crosses initialization of 'int g'
(MinGW gcc)
This code on the other hand works fine:
void func1(int input)
{
switch(input)
{
case 0:
int g;
g = 0;
break;
case 1:
int h;
h = 0;
break;
}
}
I'm far too lazy right now to look it up, but I guess you can't declare and initialize a variable inside a switch statement.
|
|
|
|
|
Hi All
I have a dialog based application(MFC) and application is running in background(through startup).But at the time of system boot my application has blocked by windows defender.I have attached application.exe.manifest.How can i remove the Windows defender is blocking application?Plz help me
|
|
|
|
|
Hello everyone,
I have a problem with adding event handlers to my dynamically created RichEdit Controls.
Depending on the user between 1 and 4 controls are created.
My intention is that the user can right click somewhere in one of the controls, then i try to figure out what the content is at that place. In the menu, that should pop up at that place, there should be an entry like 'more information' and by clicking on it a new dialog opens with the detailed description of whatever the user clicked on.
But I really don't know how to set the WM_RButtonDown for the individual number of Controls.
Any help would be appreciated...
|
|
|
|
|
How would you achieve this if you were using only one rich edit? Would you create your own class inheriting from CRichEditCtrl and define your own handler code for WM_RBUTTONDOWN? If so, where's the problem? If you have 4 instances of that class then your WM_RBUTTONDOWN will be handled in the instance that belongs to the control that was right-clicked. Am i missing your point here?
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Life: great graphics, but the gameplay sux. <
|
|
|
|
|
Hi Code-o-mat,
no, you are not missing the point. I didn't think about deriving my own class, I really had no clue how to solve this problem. Currently I'm using CRichEditCtrl and I if i only had one control to create I would do this statically and would use the Wizard to add an EventHandler.
Could you perhaps give me another hint how to write my handler code?
Thanks for your help.
|
|
|
|
|
Okay, I figured it out in the meantime.
Thanks again for pointing me the way.
|
|
|
|
|
I don't know by heart what (if any) notification you get from a rich edit control when the user right-clicks smething, but if you give different IDs to your dynamically-created edit controls then this should pose no problem.
Ok, i did a little digging, here[^] it says that if you give your rich edit control the NM_MOUSEEVENTS notification flag then it will send you EN_MSGFILTER[^] notifications for mouse events. The wParam of this notification is the handle to the control so you can use this to find out which control sending the event. Does this help?
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Life: great graphics, but the gameplay sux. <
|
|
|
|
|
After deriving my own class from CRichEditCtrl I was able to use the Wizard again and add the event handler WM_RBUTTONDOWN to it.
Now I "only" have to figure out how I can get the word where I click the mouse from the control.
|
|
|
|
|
Check out ChatFromPos[^], once you have the character position you can use FindWordBreak [^] to get the word it is in. I never used these so i am not sure it will work.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Life: great graphics, but the gameplay sux. <
|
|
|
|
|
Hi,
it was a good hint, I solved it now. First I used 'CharFromPos' and then 'LineFromChar' so I knew which line was clicked. I read out this one by using 'GetLine' (all three functions from class CRichEditCtrl). Because all the lines are formatted dependant on their content I can figure out where the name is I'm looking for. Then I only have to go through an array to compare the names and I get the information I want.
Thanks code-o-mat, but also thanks to the people from code project for providing such a great site!
|
|
|
|
|
I pass the full path of the file to the save function. returns "Unspecified error". What might be the problem?
|
|
|
|
|
Has the path string the right object type? Use the correct string type!!!
What is the return code? (Access rights of the writing process to target location?)
Greetings from Germany
|
|
|
|
|
What about dopcumentation?
You should check the returned HRESULT value.
This page [^] contains the following nice C++ example:
BOOL DOMDocSaveLocation()
{
BOOL bResult = FALSE;
IXMLDOMDocument *pIXMLDOMDocument = NULL;
HRESULT hr;
try
{
_variant_t varString = _T("D:\\sample.xml");
hr = pIXMLDOMDocument->save(varString);
if(SUCCEEDED(hr))
bResult = TRUE;
}
catch(...)
{
DisplayErrorToUser();
}
return bResult;
}
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|