|
I use C++ to make programs for my arduino
Of course, arduino's library collection includes sprintf() in stdio.h
By the way it is a c++ compiler
|
|
|
|
|
ant-damage wrote: I use C++ to make programs for my arduino
ant-damage wrote: By the way it is a c++ compiler
Did you use C++?
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
[My articles]
|
|
|
|
|
of course I do
Which programming language could be better to be used along the arduino? C++
|
|
|
|
|
Given two integers, x & y, is it possible to tell a number Z such that Z = f(x,y) and Z is unique for all x,y?
*Edit : f(x) + f(y) --> f(x,y)
modified on Saturday, May 15, 2010 11:04 AM
|
|
|
|
|
I think you mean: is there a function f(x) such that, for different pairs (x,y), the value of f(x)+f(y) will always be different, where x and y are arbitrary integer numbers (negative or positive, and not restricted to a finite domain). Different pairs here has to be taken independent of order.
If that is what you meant, the answer IMO would be no. I'd want you to confirm my interpretation first though.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
sorry, i did not mean to use f(x) + f(y) but f(x,y). my mistake.
so what I want to know is if it is possible to convert 2 numbers into a single unique number so that instead of storing two numbers, I can store just one number. Then afterwards, while reading the stored data, I read one number and apply the inverse of f to get my two numbers x & y.
say for eg. Z = 17*x^2 + y^2
for (x,y) = (3,4)
Z = 17*9 + 16 = 169
to get x,y from 169, possible values will be x = [1,4,9]; equivalent y will then be = [153, 101, 16]
since 16 is the only perfect square, so i get x=3, y=4.
I was just wondering about this problem. It's not required in any practical application. So, you can assume that x,y belongs to a set of ALL POSITIVE INTEGERS only. or better 0<x<=y<10000
And order in which inputs are given does not matter.
I hope I am clear now.
|
|
|
|
|
the easiest possible answer would be
f(x,y) = a*x + y
where a = Maximum possible value of y + 1
|
|
|
|
|
Yes, but the width of the result will be at least as much as the sum of the widths of the inputs (proof below). Which is why every way to do this will suck in practice.
For example you could interleave the bits of the inputs, spreading x to the even bits of the result and y to the odd bits.
Or you could (but this sucks) take the product of the x-th and y-th prime numbers.
(this is not really a formal proof, but close)
Proof that #f(x,y) >= #z+#y
Let #x denote the size of x in bits.
Assume f(x,y) is unique for every pair x,y and #f(x,y) < #z+#y
Then 2^#f(x,y) < 2^(#z+#y) (where ^ denoted exponentiation)
Since there are less possible outcomes than there are inputs, at least one output must correspond to multiple inputs.
f(x,y) is not unique for at least one pair x,y so the assumption must be false.
Therefore #f(x,y) >= #x+#y
Instead of bits you could use any other base, just replace the 2 later on.
modified on Saturday, May 15, 2010 11:33 AM
|
|
|
|
|
No. Both numbers carry an amount of "information", and you need memory ("bits") to store it; as long as there are no restrictions to the values (one number can have a value in some range, and the other can also have an arbitrary value in some range), you need a number of bits to store that information, no matter what reversible transformations you apply; and turning two numbers in one is just a transformation, not necessarily a reversible one.
Therefore, assuming a domain of [0, max-1] then z = x * max + y is as good as it gets.
BTW: having one or a few examples of something that seems to provide a valid approach, in general is inconclusive.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
But then the answer is yes, right? You can turn two numbers into one in a unique way.. It's just usually useless since you're still using at least as many bits as the input used to be
|
|
|
|
|
right, the answer is "yes; and probably no for all practical purposes"
BTW: I wonder why, this kind of questions pops up a couple of times each year. Often someone convinces himself he can compress two bytes into one, which is unlikely as if that worked well, one could recurse and stuff the world into a single bit.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
yes, sometimes all we want is to avoid using pair or map and use only an array. Why this question is so common is probably that this kind of situation occurs commonly.
For me, it was just that I was solving a common grid problem in which every cell visited has to be marked and I wondered if I can just store a single no. in array to quickly check if that cell is already visited. Just like that as I said before Thanks for your answer btw.
Luc Pattyn wrote: one could recurse and stuff the world into a single bit.
funny. i have no such intentions. for me two 16 bit integers [screensize < 65536] into one 32 bit integer is cool enough.
|
|
|
|
|
That's easy then, just append them
|
|
|
|
|
in graphic or board oriented applications, I often find it useful to use a one-dimensional array rather than a 2D one. That is how a lot of chess games are handled BTW. It saves a lot of code in move generation and the like.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Does that mean that if my range is two 32 bit integers, then I can store them in a 64 bit integer like this
//say +ve integeres only.
unsigned long long l;
unsigned int a = SomeValue;
unsigned int b = SomeValue;
l = a | (b<<32)
and store this l.
Then while retrieving,
a = l & 0xFFFFFFFF
b = (l>>32) & 0xFFFFFFFF
That's cool! thinking in terms of bits and informations helps
|
|
|
|
|
That should not be surprising.
|
|
|
|
|
Windows does that itself, it often stores both x and y coordinates in "lParam", the good old 32-bit parameter in Windows messages.
Two remarks;
1. If your x and y values are within [ -2^15, 2^15), you could do with a 32-bit signed integer, so no need for "long long". Similar for unsigned.
2. If your app is graphics oriented, you may want to use signed variables; you then must be careful about sign propagation effects in right shifts!
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
theCPkid wrote: Then while retrieving,
a = l & 0xFFFFFFFF
b = (l>>32) & 0xFFFFFFFF
I would remove the antiaesthetic & 0xFFFFFFFF stuff.
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
[My articles]
|
|
|
|
|
Oh yes you can. We invented the square root of -1 some time ago just for this...
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
[My articles]
|
|
|
|
|
Pallini, help plz plz plz.. it's urgent urgent urgent.
my program outputs garbage whenever I try to get the sqrt of -1 using squareroot function in Cmath
moreover, plz explain why it's a unique value for every x,y. i feel it's value does not change with change in x & y.
Thanks for your inputs btw.
|
|
|
|
|
lol
Just another way to say: "if you need a pair then use a pair"
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
[My articles]
|
|
|
|
|
In a socket application guess we define a protocol for messages like this:
+----------+----------------------+----------+
| DataSize | Data(Not Fixed size) | Checksum |
+----------+----------------------+----------+
In a socket server I receive an array of bytes and need to:
- Finds frames that match my predefined protocol(e.g above image).
Is there any efficient and clean algorithm/design-pattern for finding(and parsing) matching packets in a byte array? I don't even know which terms/phrases to search.
Thank you so much in advanced.
"I hope you live a life you're proud of. If you find that you're not, I hope you have the strength to start all over again." - I wish I knew who is this quote from
|
|
|
|
|
Hamed Mosavi wrote: matching packets
I see nothing to match; you said the message would start with a size, so the first 1/2/4/? bytes should be aggregated into a size value (maybe BitConverter.ToInt32 comes in handy), then that number of bytes of data are expected, then the next 1/2/4/? bytes should be aggregated into a checksum value, which when it matches the local checksum calculation will make the message acceptable, otherwise unacceptable.
You may apply extra checks, such as upper/lower limits to datasize. When multiple systems (and maybe multiple implementations) are going to be used, you should carefully specify the checksum algorithm used, and the byte order ("endianness") in multi-byte values (probably size and checksum).
If you need syncing capabilities (e.g. because some bytes may get lost underway), you should start with a fixed header, sometimes called an eye catcher, akin to the start bit of RS232C. Then your receiver should check the data starts with a correct header, and ignore anything that does not.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Thank you so much for your very fast reply. It's very kind of you.
Luc Pattyn wrote: If you need syncing capabilities (e.g. because some bytes may get lost underway)
This is the exact reason for what I'm seeking. If byte array I receive contains broken message at the beginning then I need to find next packet and ignore what's before.
Luc Pattyn wrote: you should start with a fixed heade
Is this like a beginning flag(like preamble in Ethernet frames)? If it is, It's not possible for me to use this solution since it's possible that the data field contains those(flag) byte sequence either, so message header shall be big enough to decrease such probability and in most systems that I'm working with, too much overhead is not accepted.
Luc Pattyn wrote: If you need syncing capabilities
This looks like what I need to search. I'll take a closer look at the syncing mechanisms to see if there's any better scape way. Thank you for this help.
"I hope you live a life you're proud of. If you find that you're not, I hope you have the strength to start all over again." - I wish I knew who is this quote from
|
|
|
|
|
Without a fixed header, you'll have a hard time getting bits/bytes in sync, as nothing of your message is cast in stone, the only thing you have is a checksum. So all you can do is assume the message starts at byte index 0, read its length and data, and check the checksum; and when that fails, start again at index 1, etc, until something happens to match. With a header (even if it is only a single byte), you only have to investigate potential messages starting with the right byte value.
Longer headers cause easier syncing at the expense of more overhead (less effective bandwidth); RS232C uses a single bit for syncing, and that too can and obviously will appear in almost every byte transmitted, but all that means is it may take several bytes to get in sync. So there is no real need for a long header, and there sure is no need to forbid the accidental appearance of a header-look-alike inside a message, as headers are only used to find the start of a message; once you (think you) are holding a message, just process the data and check the checksum.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|