|
This worked great, thanks!
Now i have a new trick lool, why didnt i think of that: cast it as a pointer of the type i know it is and then deference it =D...
|
|
|
|
|
Assuming your code is managed and you're in the right forum, have a look at BitConverter.ToSingle()
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that. [The QA section does it automatically now, I hope we soon get it on regular forums as well]
|
|
|
|
|
One caveat to the BitConverter class is the endianness it uses is based on the architecture of the machine the program is running on. So if you're interfacing to a piece of hardware and its endianness doesn't match the endian-ness of the computer, or you're reading a binary file created on a computer with a different endianness and using BitConverter, then BitConverter will not give the correct result.
DybsThe shout of progress is not "Eureka!" it's "Strange... that's not what i expected". - peterchen
|
|
|
|
|
Sure, whatever method is used, one better is aware of all applying conventions; endianness being the most relevant one here.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that. All Toronto weekends should be extremely wet until we get it automated in regular forums, not just QA.
|
|
|
|
|
The CLSCompliant attribute does not work in C++/CLI. You can see my report on this some time ago at https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=431084&wa=wsignin1.0[^] and Microsoft's refusal to fix this.
Is there any other way to check for CLS compliance in C++/CLI code ?
I have tried to use FxCop but there is no subset of FxCop rules which I have ever found which checks only for CLS compliance. I have no interest in trying to either spend days figuring out which subset of FxCop rules is CLS compliant or of trying to change my code to satisfy all of FxCop, many of whose rules I find way too finicky for my own .Net programming practice.
Hopefully there is some way to check for CLS compliance in C++/CLI now that Microsoft refuses to support this for C++/CLI programmers.Edward Diener
|
|
|
|
|
Edward Diener wrote: Hopefully there is some way to check for CLS compliance in C++/CLI now that Microsoft refuses to support this for C++/CLI programmers.
I am not sure about alternative methods to enforce this. And AFAIK, MS is not supporting C++/CLI much.
Following is my explanation about why compiler can't enforce this,
As Jonathan Caves said, C++'s compilation model is making this difficult to implement. Each source file will be compiled into object files independently and it is hard for the compiler to check for the attribute defined in another translation unit. If you apply this attribute for the assembly, then it will be in AssemblyInfo.obj file. Compiler cares only about the current translation unit and don't know anything about other translation units. This makes it hard to find the attribute usage which is on another translation unit.
Best wishes,
Navaneeth
|
|
|
|
|
I do not believe that the C++ compilation model is any different from the C# compilation model in respect to checking for CLS-compliance. This is because CLS-compliance only refers to public CLR types and a CLR class's public/protected methods, properties, and events, not to the actual code being written. In this sense I do not see why CLS-compliance could not be enforced in C++/CLI.
I do realize that C++/CLI allows for non-CLR types to be mixed with CLR types. But if CLS-compliance is truly only about checking CLR types, then I really do not see what is the big deal for enforcing CLS-compliance in C++/CLI since what needs to be done is a matter of the C++/CLI compiler checking only the CLR types and not the actual code, which may be mixed mode C++/CLI programming.
Is not the C++/CLI compiler already able to distinguish what is a CLR type from a native C++ type in C++/CLI ? Obviously it can, in which case just checking that the signatures of those types are CLS-compliant should not be hard for the C++/CLI compiler.
It is just sheer laziness on the part of the C++/CLI programmers at Microsoft which keeps them from supporting the CLS-compliant attribute in C++/CLI. And of course without that support is is nearly impossible for C++/CLI to create CLR assemblies which are guaranteed to be CLS-compliant and therefore will be interoperable with other CLR languages.
I already know that Microsoft's support for C++/CLI is subpar. See my post at http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/bfe69a25-8973-4d41-8064-a7153dc1580b[^] for my own opinion. But if C++/CLI programmers simply acquiesce to Microsoft's nonsense about why they can not do anything about it, such as the reply I got to my bug report regarding CLS-compliance, it can not get any better.Edward Diener
|
|
|
|
|
Hi,
I am calling a C# function CreateService() from C++/CLI, but It is taking as CreateServiceW() and showing compile error, method not found. So I am unable to compile. Anybody knowing why it is behaving like that.
regards,
Charan.
|
|
|
|
|
Member 4386569 wrote: I am calling a C# function CreateService() from C++/CLI, but It is taking as CreateServiceW()
This is the Unicode version of the function, which the compiler automatically calls if your project is compiling for Unicode rather than ASCII.
MVP 2010 - are they mad?
|
|
|
|
|
Yeah, I am compiling for Unicode, Thanks for your reply. I write the following preprocessor directive.
#ifdef UNICODE
#define CreateServiceW CreateService
Now it is successfully compiled.
regards,
Charan.
|
|
|
|
|
Also be aware that if it is not Unicode, the name will become CreateServiceA .
MVP 2010 - are they mad?
|
|
|
|
|
In the MSDN article on "C++ Stack Semantics for Reference Types" it says that:
"A compiler-generated assignment operator will follow the usual standard C++ rules with the following additions:
*
Any non-static data members whose type is a handle to a reference type will be shallow copied (treated like a non-static data member whose type is a pointer).
*
Any non-static data member whose type is a value type will be shallow copied.
*
Any non-static data member whose type is an instance of a reference type will invoke a call to the reference type’s copy-constructor."
Regarding the last item:
1) First it implies that a CLR reference type can be a non-static data member of a native C++ class since, unless I am mistaken, a compiler-generated assignment operator never occurs for CLR classes. Yet elsewhere I also read that a native C++ class having a member that is a ref class type is ill-formed.
2) Secondly, given that 1) is allowable I would have intuited that the assignment operator for the instance of the reference type would calll the user-defined assignment operator for the reference type and not the user-defined copy constructor for the reference type.
It seems I am misreading badly something in this topic, even though I understand what C++ stack semantics for reference types are about, or else the explanation above is badly mangled. I hope somebody can straighten me out on the wording above.
Edward Diener
|
|
|
|
|
|
The topic just finishes saying that the compiler will not generate a default copy constructor or assignment operator for a reference type and then it starts in on what I quoted in my OP. That entire section seems out of place in the topic and I have never been able to understand what it means, whether it is referring to a an assignment operator or, as you suppose, a copy constructor. If it is referring to a native C++ class, as I suppose, I was under the strong impression that a native C++ class can not have a data member which is an instance of a CLR class so I can not understand what it means. Edward Diener
|
|
|
|
|
I have some problem in this simple passage:
String ^string_num="9,99";
double d_num1=Double::Parse(string_num);
double d_num2=System::Convert::ToDouble(string_num);
i expect d_num1 and d_num2 to be 9,99....but from the watcher i clearly see they both are 9.9900000000000002
any help?
|
|
|
|
|
Floating point (and by extension double) numbers in computers can only ever be approximations of their decimal value, as the number is stored in binary scientific notation, i.e. exponent and mantissa, rather than decimal numeric. If you want accuracy then you need to stick to integers.
See here[^] for a full description.
MVP 2010 - are they mad?
|
|
|
|
|
ok this make sense , what i'll do is truncate after 2 decimal unit when visualizing the data to video
thank to both of you
|
|
|
|
|
barbetto80 wrote: what i'll do is truncate after 2 decimal unit when visualizing the data
Before taking this decision, make sure this will give you the results you need. For example using float/double for financial data is not a good idea as the roundings may cause loss of accuracy. This may not seem important with an example such as you showed above but it gets worse if you use the data in calculations and you can end up with significant errors in your results.
MVP 2010 - are they mad?
|
|
|
|
|
i know...but that is only a simple representation of a zoom factor application on an image....so i think i can show a truncated value because the user don't need the full value.
But thanks for the advice
|
|
|
|
|
... or use the Decimal type.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that. [The QA section does it automatically now, I hope we soon get it on regular forums as well]
|
|
|
|
|
try as following:
String ^str="9.99";
System::Single d=Single::Parse(str);
|
|
|
|
|
This won't help, it will still have the accuracy problem.
MVP 2010 - are they mad?
|
|
|
|
|
The following code is from a Visual C++ app to copy a file from one directory to another. It has been simplified, so I can get it working, from the objective where button and textbox controls will populate the String^ variables. I think its pretty clear what the code is trying to do, however I can't get it to work. I would appreciate any help in fixing it, any suggestions of a better approach if this one seems wrong or even some code/advice on how to trap and read any errorcodes that the CopyFile function is trowing instead of the simple messagebox I'm using.
Thanks in advance,
<br />
String^ source = "C:\Temp\Firefox.pcv";<br />
String^ dest = "E:\Test\Firefox.pcv";<br />
char* file1 = (char*)(Marshal::StringToHGlobalAnsi(source + "\0")).ToPointer();<br />
char* file2 = (char*)(Marshal::StringToHGlobalAnsi(dest + "\0")).ToPointer();<br />
<br />
if(CopyFile((LPCTSTR)file1, (LPCTSTR)file2, TRUE) == 0){<br />
MessageBox::Show("ERROR");<br />
}else{<br />
MessageBox::Show("OKAY");<br />
}<br />
<br />
Marshal::FreeHGlobal(IntPtr((void*)file1));<br />
Marshal::FreeHGlobal(IntPtr((void*)file2));<br />
|
|
|
|
|
Because you are using managed code why don't you just use:
File::Copy( path, path2 );
Here is the MSDN article.
Greetings
Covean
|
|
|
|
|
"I can't get it to work" isn't real helpful to us.
Did you check the error code?
Also, for what it's worth, your casts of char* to LPCTSTR in
the CopyFile() call are wrong.
I always recommend, if you're going to use a cast,
ask yourself why you need a cast. Because it won't
compile without it? If so, why?
Then if you do really need the cast, use the right types.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|