|
The error has to do with your Unicode settings. You can use _stscanf() which will work with both MBCS and Unicode.
"Love people and use things, not love things and use people." - Unknown
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
You can convert from CString to char* in two steps:
CString str1;
char* str2;
...
str2 = (char *) (const char *) str1;
If I have to do this a lot, I define:
#define STOC(X) ((char *) (const char *) (X))
Where STOC stands for "String to char*".
|
|
|
|
|
OOps Alan,
CString csValue;
GetDlgItem(IDC_OpNo_EDIT)->GetWindowText( csValue );
char* str2;
str2 = (char*) (const char*)csValue;
char* stopString;
long l = strtol(str2, &stopString, 9);
int i = (int)l;
: error C2440: 'type cast' : cannot convert from 'class CString' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Error executing cl.exe.
Can't understand what is the solution for a simple task.
_stscanf() provided by a helpful member is also not supported by eVC++ in CE platform.
The main reason for doing this conversion is the application throws "Assertion Failure" message followed by "An unsupported operation was attempted" on UpdateData. Their is no scope to debug or find the actual error line. On commenting UpdataData, the error/message doesn't come. So am loking some way to do casting by getting the text via GetWindowText() which by default returns CString only.
I appreciate everybody's help, but still need help to get rid of error messages & make it working one way or the other. Hope to get help.
Thanks
Terry
|
|
|
|
|
You probably have UNICODE defined, so substitute wchar_t for char in the example and it will work perfectly.
|
|
|
|
|
UNICODE is not in the picture at all.
Got it working as expected. None of the above worked. The correct solution found is :
CString csValue;
GetDlgItem(IDC_OpNo_EDIT)->GetWindowText( csValue );
int no = atoi((char*)(LPCTSTR)csValue);
Thanks to all of you for all of your support & efforts.
Thanks
Terry
|
|
|
|
|
|
several ways.
either you get the full content as a string, then you cast it to an integer youself, or you can also map an integer variable to your edit control.
|
|
|
|
|
See GetDlgItemInt()[^] and GetWindowText()[^]
Or use a member variable and call UpdateData(true) (The last thing you should be doing, if you know what it does).
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
Attach int variable with edit control with the help of class Wizard.
-@SuDhIrKuMaR@-
|
|
|
|
|
You can also attach double variable for DDX.
-@SuDhIrKuMaR@-
|
|
|
|
|
If you are not filtering the allowable characters in the edit control, you may have cases where users enter data that cannot be converted to a double. For example, 12345.65a , abc123 , 123..4 , etc.
While I would suggest getting the text from the control and then converting it to a double, I would use strtod(...) /_tcstod(...) /wcstod(...) instead. It provides a way to tell you what character causes conversion to fail, which can be used to provide automatic error handling (i.e. ignore any invalid characters), or to provide a more helpful error message to the user.
Peace!
-=- James Please rate this message - let me know if I helped or not!<hr></hr> If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! See DeleteFXPFiles
|
|
|
|
|
Thanks James. But still not to the mark. Actually I want to convert CString to int. So, based on your hint, I opted to use strtol and then cast it to int, as i didn't find any method that converts strtoi.
CString csValue;
GetDlgItem(IDC_OpNo_EDIT)->GetWindowText( csValue );
LPTSTR p = csValue.GetBuffer(10);
char* stopString;
long l = strtol(p, stopString, 9);
csValue.ReleaseBuffer();
double d = atof((LPCTSTR)csValue);
The error is :
: error C2664: 'strtol' : cannot convert parameter 1 from 'unsigned short *' to 'const char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
atof also gives the same error.
aNY WAY to convert LPTSTR ot CString to char*, TCHAR* or wCHAR*.
Thanks
Terry
|
|
|
|
|
Change the function to wcstod or _tcstod, if you are straight Unicode or TCHAR-based building as Unicode, respectively.
PEace!
-=- James Please rate this message - let me know if I helped or not!<hr></hr> If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! See DeleteFXPFiles
|
|
|
|
|
See here.
"Love people and use things, not love things and use people." - Unknown
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
#include "iostream.h"
int x = 10;
int main()
{
int x = 8;
{
int x = 5;
cout << x << ::x ;
}
return 0;
}
|
|
|
|
|
yes, that's what cout << x does you updated your post, so now, the answer is no.
you can only access a most inner variable (by using its name) or accessing the global variable by prepending its name with the global scope operator ( :: ).
|
|
|
|
|
As posted you question is ambiguous.
Anyway the following one is clear
Super Hornet wrote: //can we access the value of x which is defined as int x = 8 here?
and the answer is (AFAIK ) no: the inner x hides the outer one.
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
|
|
|
|
|
No you Can't the value with ::x will be the value from the global namespace.
-@SuDhIrKuMaR@-
|
|
|
|
|
Super Hornet wrote: //can we access the value of x which is defined as int x = 8 here?
If you badly need it then rename inner x to something else or store the previous x(main) in some variable before you declare the most inner x and use that variable.
This is not the optimal way for naming variables. You can easily give different names. Or is this an interview question?
Nibu thomas
Microsoft MVP for VC++
Code must be written to be read, not by the compiler, but by another human being.
Programming Blog: http://nibuthomas.wordpress.com
|
|
|
|
|
#include "iostream.h"
int x = 10;
int y;
int main()
{
int x = 8;
y = x;
{
int x = 5;
cout << x << ::x ;
USE Y! ;)
}
return 0;
}
In other words, NO. You cannot do it.
OK,. what country just started work for the day ? The ASP.NET forum is flooded with retarded questions. -Christian Graus
Best wishes to Rexx[^]
|
|
|
|
|
You may use namespaces to avoid collisions.
#include<iostream>
namespace Global
{
int x = 0;
namespace inner
{
int x = 2;
}
}
int main()
{
int x = 1;
{
int x = 4; cout<<"This is from within a brace "<<x<<endl;
}
cout<<"Global::x"<<Global::x<<endl;
cout<<"x"<<x<<endl;
cout<<"Global::inner"<<Global::inner::x<<endl;
return true;
}
<div class="ForumSig"> <font size="1.5" face="verdana" color="blue<br" />
<font face="Verdana" color="burgundy" size="1.4">Nobody can give you wiser advice than yourself. - Cicero</font>
<font color="navy" size="1.4">.·´¯`·->Rajesh<-·´¯`·.</font>
<font color="maroon">Codeproject.com: Visual C++ MVP</font></div>
|
|
|
|
|
Its an interview question by Microsoft and thank you for the answers
|
|
|
|
|
I created a Dialog box in that i want to create 3 pages
|
|
|
|
|
you mean tabs ?
create a PropertySheet with 3 PropertyPages...
|
|
|
|
|
can u please give sample code i am new to VC
|
|
|
|