|
Ah C++, it seems so archaic these days. The snippet you provide is presumably a set of methods in a class. Where is the data these methods operate on? Presumably you've got to translate the arrays or chunk of memory to C# as well?
In which case, a character array is best represented as a string .
Am I right in thinking that ivector() creates a vector and free_ivector releases it? Same with imatrix?
Presumably you know that header files (thank the maker) do no exist in C#...?
Regards,
Rob Philpott.
|
|
|
|
|
Hi,
not sure what it is you need.
if you want to create a classic DLL, callable by unmanaged code, then I would not do that in a CLR language...
if you want to create a class with some functionality and methods, forget the header file, and create the class from scratch; you can build a DLL from it, it will be callable in .NET by any managed language (C#, VB.NET, C++/CLI, ...) but not (or not easily) by unmanaged code (C, C++, ...).
if you want to keep existing native code and provide a managed wrapper for it, so it can more easily be used by an app in a managed language, then you would need P/Invoke (google it, and visit www.pinvoke.net), and use accurate prototypes; if so, all pointers should be implemented through the IntPtr type.
|
|
|
|
|
i'll update my needs wit u in mail
thanks for the website friend
|
|
|
|
|
I am searching for a fast string to integer conversion algorithm. Int32.Parse is too slow for my purposes. I implemented an algorithm that was faster by orders of magnitude, but I was hoping someone could point me to an existing library that includes such functions, or at least to a paper to make sure I'm working correctly.
Thank you.
|
|
|
|
|
HosamAly wrote: Int32.Parse is too slow for my purposes
Interesting! Can you give more information about your application type where minor things like this is affected?
|
|
|
|
|
I am parsing a live feed that contains many numbers. The feed comes from a trusted source (i.e. format is guaranteed to be correct), and the numbers are simple ASCII integers (no localization, no thousands separator, etc). Int32.Parse is simply too slow for such "simple" operations. In my benchmarks, it's taking 5-16 times more than some of my implementations.
|
|
|
|
|
So you say you've written a fast implementation of int parsing, that performs better than int.Parse - so what exactly are you asking? If you've done it right? You've not posted your code if so!
|
|
|
|
|
I am asking whether there exists a library that includes such functions, in hope that it would be better tested and optimized than my own implementation. If there isn't, I was hoping to get some links to papers or algorithms for how to convert a string to a number efficiently.
|
|
|
|
|
Ok, I see.
The performance issue with Int32.Parse is because, like alot of things in the framework, it tries to cater for every man's needs and therefore includes the ability, and logic (therefore overhead) to parse lots of different types of string (eg, currency, hex etc).
If you are satisfied that you are only receiving decimal-formatted numbers, without any other markup (such as separators) you could look at Int32.Parse in reflector and follow the trail to the unmanaged code that does the actual parsing - this will lead you into an internal class called Number which has an unsafe method ParseNumber that does the bulk of the work. Your job would be to identify the bit that parses a decimal-formatted number and just extract that portion into your own library.
|
|
|
|
|
For my experience, sometimes you do not need to Parse the string object to int. we can detect the type of the data, and convert it constrainedly. For example:
object o;
int i = 10;
o = i;
if(o is int)
{
int j = (int)o;
Console.WriteLine(j);
}
Otherwise, we can use TryParse to avoid throw some exception. Afterall, Parse is already a time-consuming method.
Tan Li
I Love KongFu~
|
|
|
|
|
I'm not trying to cast a boxed object. I'm trying to parse a string.
There is no noticable difference between Int32.Parse and Int32.TryParse when the input is known to be correct. Actually, if you open both using Reflector, they use the same implementation, except that one of them throws exceptions for error conditions, while the other just returns false .
|
|
|
|
|
Yes, I did not say the TryParse is more effective. But we can check the parameter before convertion. Surely, if you can ensure the string is correct format, no need to do this.
Tan Li
I Love KongFu~
|
|
|
|
|
Parsing a string is not very hard. I put together this code, it should cover the basics:
public static int ParseInt32(string text) {
long value = 0;
long sign = 1;
bool first = true;
foreach (char c in text) {
if (c >= '0' && c <= '9') {
value = value * 10 + c - '0';
} else if (c == '-' && first) {
sign = -1;
} else {
throw new FormatException();
}
first = false;
}
value *= sign;
if (value < int.MinValue || value > int.MaxValue) throw new OverflowException();
return (int)value;
}
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
That was brilliant and simple. 5ed
|
|
|
|
|
You could also disable array bound checking, which could be even faster. Check the documentation for "unsafe" and "fixed" C# keywords.
|
|
|
|
|
Sometimes yes, sometimes no. According to my measurements, sometimes the cost of using fixed is almost the same as bounds checking (especially for small arrays), because it calls a function to pin the referred object and return a pointer to it. (You can check it with IL DASM.)
|
|
|
|
|
Absolutely. One must choose the solution that fits best, that is why testing more than one way to achieve this is the best way to find out.
|
|
|
|
|
N a v a n e e t h wrote: That was brilliant and simple.
Thanks a lot.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks. I was actually asking whether such functionality initially existed. Meanwhile, I wrote some functions (similar to yours but not exactly the same), which you can check here[^].
|
|
|
|
|
Hi,
How can i call C# managed code in VB? , Will it allow me to access all CLR properties?
Thanks
|
|
|
|
|
you can reference the C# dll from your VB project and I have no idea what you mean by CLR properties. Whatever you expose in your code is available.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
|
VB or VB.net?
If it is VB, you need to realize the COM object.
If it is VB.net, just add the reference to project.
Tan Li
I Love KongFu~
|
|
|
|
|
The .Net compiler produces "intermediate language code" from the higher-level language, which is for example C# or VB.Net. This intermediate language code is common to all languages, and this is the code that actually gets executed by the framework. Therefore, if you compile a C# project, it just becomes a .Net assembly; it is almost an executable, it is not your text source file anymore. From the moment that you reference it in your VB.Net project, it becomes available to your VB.Net code as if it was written in VB.Net.
Jean-Christophe Grégoire
|
|
|
|
|
public int MyFunction( int a, int b)
{
if (a<= 0)
return (0);
---------------
Other codes
---------------
return (0)
}
Since a=0, the first return(0) is executed, and then it move to second return(0). Why other function inside "Other code" is skipped?
Thanks
|
|
|
|