|
There is actually a subtle bug in your code. If, on the last pass of your outer loop, one "digit" is == Base - 1 and you carry into it, you never get to carry out of it. If you write your inner loop backwards (or reverse your array), it all comes out in the wash... The point is that multiprecision add/subtract should be done "right to left" so multiplace carry propagation can occur naturally.
A small point, but still important. The one time it bit me, the code was in ROM inside tamper-proof enclosures. A real PITA to fix...
Cheers,
Peter
Software rusts. Simon Stephenson, ca 1994. So does this signature. me, 2012
|
|
|
|
|
You are quite right, sorry for having mislead you.
This is the kind of "off by one" trap I too easily fall into. When I wrote this code I was indeed unsure in what way to go, and I just satisfied myself when I saw successful tests.
There is indeed no carry propagation here and this could have been avoided by careful proofreading: when the carry is made, it applies to digit Position-1 , showing that propagation needs to be done by decreasing indexes.
Mea culpa.
How did you discover the flaw ?
|
|
|
|
|
YvesDaoust wrote: How did you discover the flaw ? In my case, we were doing 32 bit arithmetic on an 8-bit processor. The little machine was attached to the memory system of its larger host, reading messages from there, processing them (cryptographically) and writing the results back. A nasty combination of buffer size and alignment meant that occasionally a block would be read from the wrong place, or, worse, written to the wrong place. Three of us spent a good week staring at code, running simulations and generally not seeing what was under our noses. In the 30-odd years since, I have been sensitised to that kind of bug.
Cheers,
Peter
Software rusts. Simon Stephenson, ca 1994. So does this signature. me, 2012
|
|
|
|
|
Interesting. Given that you work with an 8 bits processor, base 100 could have been an option too.
But now I am getting quite puzzled as I believe that multiple carries are not possible: when you double a digit, this can cause a carry-out; in all cases you get an even digit, at most Base-2; for the same digit, the carry-in cannot cause an extra carry-out. Said differently, the doubling of digits generates all the carries-out it needs to, and my original algorithm is correct. On the opposite, merely reversing the traversal direction causes all carries-out to be unduly doubled.
|
|
|
|
|
The reason why I processed left to right is that the carry needs to be done after the doubling of the digit to the left.
modified 3-Dec-12 6:27am.
|
|
|
|
|
Hi All,
Lets see if this helps. I am reading back data from a device into a rich text box this is all working fine I can save out as a file fine, the data may contain multiple units so I need to check the first 8 bits to see if they are the same I can split them up fine it is how to store them. I don't really want to use separate text boxes so I was thinking of strings would this be a dumb idea as I don't want to cripple performance?
Glenn
|
|
|
|
|
Could you give some more info? Such as, what do those first 8 bits mean? What is splitting and why is it necessary? Why are text boxes involved?
|
|
|
|
|
The first 8 bits are a serial number of the read unit. The data is records, read as strings out of the unit. I am a the moment not splitting them just saving them as one file, this is where the spec is a little flaky and I am trying to have an answer ready if needed. If I use the method I was using the String.split method, I need to check the first 8 bits against a stored list, I was thinking of using rich text boxes to store the split reading in for a test and then using strings for the actual program. Firstly I need to declare an array of strings which in theory could be 1024 in size.
new string[] Serial_Numbers ={};
This I'm guessing from the green underlining is wrong but....
Glenn
|
|
|
|
|
string[] Serial_Numbers = something;
Ok, I still have absolutely no idea what the problem is or how to solve it, though
|
|
|
|
|
You would normally declare something like this as
string[] serial_numbers = new string[] {}; Note, however, that you've just declared a zero length array, so you would have to resize it (which isn't the most efficient operation) whenever you want to use it. There are many more efficient ways to save the data - and which one you choose depends on what you want to do with it. You could use a List<string> or a Dictionary of strings and readings - which one you choose depends on what the ultimate purpose is of the readings.
|
|
|
|
|
Hmmm, the evil gods Malloc() & Calloc(), but I have already discovered that. The ultimate goal is to split the readings into separate files from the text property of a text box ie the box has output from the hand held in one rtb I was looking for a way to split the contents up. If the readings are say 12345678|AAA|BBBB|CCCCCC the next reading is 23456781|AAA|BBBB|CCCC at the moment the file is created with all the readings in one place. What I'm trying to is split up the data to separate files as the spec does say to do it that way but I can see problems with it if don't have a method, if I create the string array with the total number of records read from the unit that would get around that problem. If I use substring() as below:
foreach (string subString in rtbTestBox.Text.Split('\n'))
{
foreach (string subStringSerNo in subString.Split('|'))
{
if (subStringSerNo.Length == 7)
{
Serial_Numbers[serialNumberIndex] = subString;
MessageBox.Show(subString);
MessageBox.Show("Yaowwwser!!!", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
serialNumberIndex++;
}
}
and it should give me an array of readings which I can the search for differences in the serial number. If I then have the array of strings, the serial number is different I can place it in a different string if it's the same just append it.
Am I making any sense in my caffeine addled state!
Glenn
|
|
|
|
|
I see a few issues with this design.
First of all, you are using the RTB as the datasource - you really should use a proper structure for the data - you can add the data from this to your UI if you need, but you should start off with the idea that the data is the important thing (this also simplifies you saving out the data).
Secondly - if you need to display the data, you will find it easier to display it in a ListBox. Adding items into a ListBox takes a lot less time than adding data at the end of a large RTB.
I would be tempted to have a structure that represented a single reading, and then create a Dictionary using the serial number as the key, and a List of these readings as the value. That way, you can iterate over the Dictionary and save out the values to separate files.
|
|
|
|
|
Good advice.
When using a list box he may store the numerical serial number as item data.
|
|
|
|
|
Sorry didn't see your reply, I was messing with a test app. The issue I have knocked up I have some test data in a list box.
|
|
|
|
|
No need to say sorry. It's not a chat here.
If you already have a list box, you may use my suggestion. Then you can identify the device strings by querying the item data (e.g. write all strings for a specific device to a file).
|
|
|
|
|
After a bit of fiddling, I have a list box I can add the data to
1111111|16:11:52|08-10-12|0|0|00a8
now this is a sample returned from the unit, The serial number of what I am trying to sort are
11111111 I would like to get an opinion on whether or not using an array of strings the size of the total number of records on the unit is a good idea bearing in mind I have no idea what PC it is going to be run on. Here's hoping what I sent is good enough (one file)! (before you say it I know full well Hope & Pray are not viable options! )
Glenn
|
|
|
|
|
If you add such strings to a list box you already have an array of strings. You can use the Find() method to find strings that begin with a specific serial numbers. You can implement a sort function to sort by the serial numbers.
I'm using C++ and did not have experience with .NET. Using MFC or Windows API functions, each item of a list box can be assigned a user data value. When setting this item data to the serial number, the list can be searched and sorted by these values which is much faster than searching/sorting using the strings (item text).
Performance depends on the max. number of items. You may raise a new question about this. May be someone else has experience with large list boxes. I think a few thousand items should be no problem.
|
|
|
|
|
Thanks, in the actual application I am updating the actual RTB on the fly which doesn't seem to be causing any problems yet I will look at changing to a list box. The issue I am having at the moment is how to split the data up if I need to (I wish I could call the guy testing it and ask him, several problems involving time zones, company politics, project ownership, pointy haired business practice , etc.) Really I just need to read the first 8(ish, in spec, 7 on dev. board)
bytes and if they are different from ones already read create a separate store for them.
After some though (& coffee)
Step 1 use total number of readings to create a string array.
2 read the RTB string split using substring for a \n
3 read the first 8 (or 7 bytes) if its new place in a list. if not add to list
4 repeat 2 & 3 until total number string read in 1 are reached.
5 Save out each of the populated strings and free up resources. Sorry about this reply got grabbed to something else in the office!
Glenn
|
|
|
|
|
I like the ability to downvote, I do it myself on occasion. Then again, these are valid questions to ask, one would actually assume that information to be part of the question.
The reason I'm making a point of it, is because you're not a respectable downvoter. You're a two-voter! The easy way of coloring someone gray, without losing a point yerself.
Grow a spine, and tell the man why you think his answer sucks
Bastard Programmer from Hell
if you can't read my code, try converting it here[^]
|
|
|
|
|
hi guys . i ask my qustion very fast . i just need to help me . ty for any help.
my qustion is that , i have made a bfs solver class that solve the puzzle 8 with bfs algorithm .
what im doing its like this .
1 - node class >> contain some info
2- bfs solver class
2-1 : Qeue Neede .
2-2 : enqeue the first node (initial state) << its parent .
2-3 : check if its the Goal Or not (if its not go to next )
2-4 : find the empty tile and see if you can exchange any tile with it .
2-5 : any change w'll make a child node . of that parent
2-6 : deqeue the parent node.
2-6 : check if the child node of the parent is in the qeue (if is not then enqeue the child node and put a parent label on it). jump to the (2-3)
is that algorithm working well , i have test it and it really work fine , the problem its here that it dosnt work if i played too much with the tile and chaneged them around . it works fine in small problem like {1,2,3,5,4,6,0,7,8} or sth like this .
and it gave me an error stackoverflow in big problems like {8,0,4,2,3,1,6,7,5} i dont know what should i do to prevent this error but i just know that my codes work fine .
im writing my code with c#.net . using a node class and bfs solver class.
i can put some parts of my code if you neede to see what im doing .
i'll appriciate any help .
modified 26-Sep-12 4:58am.
|
|
|
|
|
The problem is that breadth-first search (bfs) tries ALL sequences of length N before it tries any of length N+1. And it stores all these intermediate attempts, resulting in your stack overflow for a deep solution.
An approach more specific to the problem would give better results, e.g.
for (int tile = 0; tile <= 8; ++tile)
placeTileInCorrectPosition (tile, board);
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
|
|
|
|
|
im sorry but what should i do with this peace of code , i didnt get it . can you explain more ?
this is iteration that go 8 time throw the board and place the tile in correct position i didnt get it honestly .
|
|
|
|
|
The function will generate the sequence of moves to place tile n in the correct position without disturbing the tiles < n, which have already been correctly placed.
This is more focused than blindly trying one solution after another, and will work faster and without a stack overflow.
Unfortunately writing this function takes a little more work than bfs. But it's doable.
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
|
|
|
|
|
this is good soluation .
you mean with tile < n , that if i had a puzzle with this tiles
{{1,2,4}
{3,5,0}
{6,8,7})
its change the 4 with 3 and 8 with 7 and 0 with 8 , is that what you meaning .
and can you light me up with a source or website that has already done this thing . ty for ans my stupid qustion .
|
|
|
|
|
The function would generate the sequence of moves that would place 3 in the position 4 is in, while leaving 1 and 2 in their correct positions. This is because 3 is the next tile to be placed in its correct position.
I don't have source code, but it would be a good exercise for you to write it. Googling "9 puzzle solution" gets lots of hits, and one of them probably has some source code. Similar results can be obtained searching for "15 puzzle solution", which is another common form of this puzzle type.
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
|
|
|
|
|