|
It's easy, I have such a beast. Start with a console app and call the FreeConsole API call if you enter GUI mode.
|
|
|
|
|
Thanks for the replies guys, I'll look into the suggestions.
|
|
|
|
|
I have a string of the form "[1,'#000000','#ffffff'],"
I need to extract the '1' as an int, '#000000' as a System.Drawing.Color, and '#ffffff' as a System.Drawing.Color.
I don't want to do repeated IndexOf(",") calls to get them, and regex appears to be the way to do this.
I have looked on some tutorials and cannot work out how to do this.
How do I extract these 3 variables from the string with Regex?
|
|
|
|
|
Why not use String.Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries). Just remove the [ ] at the beginning and end
only two letters away from being an asset
|
|
|
|
|
Do a search for Expresso, this program was recomended to me, and helped me learn regular expressions.
|
|
|
|
|
How about \[(\d+),'#([0-9A-Fa-f]{6,6})','#([0-9A-Fa-f]{6,6})'\] ?
Tested with my RegexTester[^] .
modified on Monday, August 31, 2009 12:03 AM
|
|
|
|
|
I have been thinking about this for a while and want to be correct in how I go about this.
I have a custom struct.
struct MYSTRUCT
{
public double address;
public short datLen;
public string data;
}
I am using an array for these, and chose the List<> because of the Add method.
What I want to do is resort the list based on the Address highest to lowest.
I am pretty unfamiliar with the IComparer and Comparison option in the built in List<>Sort.
Will one of those work for me? Do I override the Sort method? Do I just create a new method to sort the list?
How would you guys go about this?
Thanks in advance.
*****************
"We need to apply 21st-century information technology to the health care field. We need to have our medical records put on the I.T." —GW
modified on Sunday, August 30, 2009 10:14 PM
|
|
|
|
|
For lots of examples of the various ways to do this, google c# sorting generic lists.
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
|
|
|
|
|
If you always want to sort on one field (i.e. address) then implement IComparable<T>
It's really simple:
struct MYSTRUCT : IComparable<MYSTRUCT>
{
public double address;
public short datLen;
public string data;
public int CompareTo(MYSTRUCT other)
{
return address.CompareTo(other.address);
}
} Now just call Sort on your collection and it will automatically use your CompareTo method.
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
|
Are you sure address is a double?
for home addresses, I'd expect a string.
for enumerable addresses (as in memory addresses), I would want an integer (probably uint/int or ulong/long) which is exact and maybe can be used as an array index, not something that needs conversions from double to int all the time.
|
|
|
|
|
This is why I love codeproject.
It should be a ulong. Thanks!
*****************
"We need to apply 21st-century information technology to the health care field. We need to have our medical records put on the I.T." —GW
|
|
|
|
|
I'm a hardware engineer trying to make my first C# program and admittedly my rusty C is only a partial help.
I do this in my form:
public partial class Form1 : Form
{
public class CUserMem
{
public UInt32 bUsed; // supposed to be a Boolean but occupies 4 bytes
public UInt32 nCFreqHz; // Center Frequency
public UInt32 nDemIdx; // demod index: 4 or 5
public UInt32 nDemBWIdx; // normally 3 for 6 kHz
public UInt32 nVBFBWHz; // user selected filter BW (3.63 is a normal choice)
public Int32 nVBFFcHz; // frequency offset of filter
public UInt32 aTime; // long (epoch time when memory was created)
public byte version; // 0 currently
public Byte[] extDC; // 3 bytes of external downconverter info
public Byte[] rsvd; // 4 bytes reserved
public char[] desc; // memory tag
}
List <cusermem> MemoryBank = new List<cusermem>(10);
public Form1()
{
InitializeComponent();
for (i = 0; i < 100; i++)
{
CUserMem TempCUserMem = new CUserMem();
MemoryBank.Add(TempCUserMem);
}
<clip the="" rest="">
I then read a file and successfully populate MemoryBank[0] to MemoryBank[99].
Later I try to pack the data by "defragging" it. Here's the code, with the problem described in the comments:
public void PackBank(decimal BankNumber)
{
for (i = 0; i < 100; i++)
{
if (MemoryBank[i].bUsed == 0)
{
for (j = i + 1; j < 100; j++)
{
if (MemoryBank[j].bUsed == 1)
{
MemoryBank[i] = MemoryBank[j];
MemoryBank[j].bUsed = 0;
// here, both the 9th and 10th memories (elements 8 and 9) are 0 while 0 to 7 are 1
MemoryBank[i].bUsed = 1;
// here, both the 9th and 10th memories are 1 and 0-7 continue to be 1
// a test using atime instead of bUsed shows the same problem
j = 100;
}
}
}
}
}
Apparently elements 8 and 9 of the array are being viewed as copies of each other. I assume this is true for any elements, not just 8 and 9.
Since I successfully populated the list with different values for those elements when I did my file I/O, why do I have a problem later when I try to write to them?
Chuck
|
|
|
|
|
Hi,
this does not look good. Please use PRE tags to publish code, and then make sure the formatting and indentation get preserved. If you need to show less-than signs use the special widget for them, it will insert a "<" which will end up looking like a < so we can see your generic list, assuming that is what you are using.
Only then, I'm afraid, will you get a decent reply.
|
|
|
|
|
Well that means that my effort to replace the < and others with the character was a big waste of time. Oddly, it appears correct for me: the correct characters are in the posting.
The FAQ doesn't mention PRE tags so hardware types like me will just gaze blankly at those words.
But let's try again. Rather than just copying and pasting the code into the Code Project window, I've saved it as a pure text file in hopes that will help. If not, I'll await instructions.
Chuck
public class CUserMem
{
public UInt32 bUsed; // supposed to be a Boolean but occupies 4 bytes
public UInt32 nCFreqHz; // Center Frequency
public UInt32 nDemIdx; // demod index: 4 or 5
public UInt32 nDemBWIdx; // normally 3 for 6 kHz
public UInt32 nVBFBWHz; // user selected filter BW (3.63 is a normal choice)
public Int32 nVBFFcHz; // frequency offset of filter
public UInt32 aTime; // long (epoch time when memory was created)
public byte version; // 0 currently
public Byte[] extDC; // 3 bytes of external downconverter info
public Byte[] rsvd; // 4 bytes reserved
public char[] desc; // memory tag
}
List <CUserMem> MemoryBank = new List<CUserMem>(10);
public Form1()
{
InitializeComponent();
for (i = 0; i < 100; i++)
{
CUserMem TempCUserMem = new CUserMem();
MemoryBank.Add(TempCUserMem);
}
<REST OF FORM1 WAS DELETED>
public void PackBank(decimal BankNumber)
{
for (i = 0; i < 100; i++)
{
if (MemoryBank[i].bUsed == 0)
{
for (j = i + 1; j < 100; j++)
{
if (MemoryBank[j].bUsed == 1)
{
MemoryBank[i] = MemoryBank[j];
MemoryBank[j].bUsed = 0;
// here, both the 9th and 10th memories (elements 8 and 9) are 0 while 0 to 7 are 1
MemoryBank[i].bUsed = 1;
// here, both the 9th and 10th memories are 1 and 0-7 continue to be 1
// a test using atime instead of bUsed shows the same problem
j = 100;
}
}
}
}
}
|
|
|
|
|
The FAQ may not discuss PRE tags, the sticky message "How to get an answer to your question" does.
And I forgot to tell you, under the edit box you'll find some checkboxes, the last one when checked, will cause whatever you paste to automatically adapt (i.e. replace < bY < and other such stuff).
You could clear and re-paste your code in your previous message...
|
|
|
|
|
Your problem is quite simple, but may take some thinking about. The reason you get the problem is because of this:
if (MemoryBank[j].bUsed == 1)
{
MemoryBank[i] = MemoryBank[j];
MemoryBank[j].bUsed = 0;
MemoryBank[i].bUsed = 1;
}
If you try the following smaller code fragment, you will get the same result:
List<cTemp> ls = new List<cTemp>(10);
int i;
cTemp ct;
for (i = 0; i < 10; i++)
{
ct = new cTemp(i.ToString(), i);
ls.Add(ct);
}
ls[5] = ls[6];
ls[6].s = "Hello";
ls[5].i = 42;
for (i = 1; i < 10; i++)
{
Console.WriteLine("{0}:{1}", ls[i].s, ls[i].i);
}
class cTemp
{
public string s;
public int i;
public cTemp(string ss, int ii)
{
s = ss;
ii = i;
}
}
Why? Because the elements of the List are references rather than the specific variables. By assigning a different reference via the line
MemoryBank[i] = MemoryBank[j]; you are "throwing away" the previous reference to the instance of the class held in MemoryBank[i], and causing both MemoryBank[i] and MemoryBank[j] to "point" to the same instance of a CUserMem class. If you then alter the content of the instance via either reference [i] or [j] you will appear to alter both instances, because they are the same. This is difficult to describe without diagrams, but if you single step the example above through the debugger, you will see what I mean.
No trees were harmed in the sending of this message; however, a significant number of electrons were slightly inconvenienced.
This message is made of fully recyclable Zeros and Ones
|
|
|
|
|
Griff:
I see exactly what you mean. Knowing that I am dealing with references rather than the actual values is the key, and I would not easily have discovered this as the code "looks correct".
I'll head off to do a bit of reading and Googling for the right way to solve this.
Thanks for the lesson - I bet this will prove to be a valuable piece of information in making the jump from C to C#.
Chuck
|
|
|
|
|
You are welcome!
The transition from C to C# isn't too bad once you realize that all classes are on the heap, and thus all class variables are effectively C pointers to variables without the "->" all over the place.
No trees were harmed in the sending of this message; however, a significant number of electrons were slightly inconvenienced.
This message is made of fully recyclable Zeros and Ones
|
|
|
|
|
Hi,
I want to be able to know what is the fallback mechanism for a language, and do it in code.
for example: i have files that aren't resource files but are different for different cultures.
i want to search manualy for a culture directory according to my culture. and if i don't find it there, i want to search for the fallback culture and so on, till i get to the root directory if the culture isn't found.
My question is: how can i find the "next fallback" culture for a given culture, thru code.
Thanks,
Yanai
[SOLVED]
The CultureInfo class has a "Parent" property just for that
modified on Monday, August 31, 2009 7:28 AM
|
|
|
|
|
I am analysing data which contains several different object types and would like to get them in a single collection but need to keep them in order.
I could use a dictionary and lists of each type but it would be easier (and maybe quicker) if I could have a single collection of the objects as the order the lists are in the original data is important.
Any suggestions on a reasonable method?
Thanks.
Elaine
modified on Sunday, August 30, 2009 12:16 PM
|
|
|
|
|
object[] ? ArrayList ? List<object> ?
|
|
|
|
|
Thanks PB, I'm still learning about collections.
|
|
|
|
|
Collect items of the most specialized common type, Object[] or List<Object> would always work; if you have some intermediate base class, that would be even better. So for a drawing it could be Shape[] or List<Shape> where your shapes inherit from your base or abstract Shape class.
|
|
|
|
|
A good idea, the other method would be something akin to the MFC VARIANT type where the members are the class types I need to put in the list.
I'll try your suggestion first.
Thanks Luc.
|
|
|
|