|
Could you not remove 'used' items from the combobox? That would eliminate an erroneous input from the user if I understand you correctly.
|
|
|
|
|
If you insist on having the items in the combo box even after they were used you could try using their itemdata to indicate if they have been used or not.
-By default itemdatas are zero
-When your user hits the button, check the itemdata (CComboBox::GetItemData[^]) of the currently selected item, if any, if it is not zero, warn the user and don't continue, if it is zero, then use the item
-when using the item, set its itemdata (CComboBoxSetItemData[^] to 1 for example
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Computers don't kill programs, users kill programs <
> "It doesn't work, fix it" does not qualify as a bug report. <
|
|
|
|
|
Hi,
I want to draw rect in view class and i want to load bitmap in that rectangle.
So my code is
StRect.left=5;
StRect.right =25;
StRect.top = 300;
StRect.bottom = 320;
pDC->Rectangle(StRect);
CBitmap bmp;
bmp.LoadBitmap(IDB_PVHIGH);
CBrush brush(&bmp);
pDC->FillRect(StRect,&brush);
Bitmap dimension is Height=20,Width=20.
But it does not draw correctly.the centre of bitmap is shown in one corner of rect and it looks like it shows three same bitmap image is showing in that.
How can i get that correct display.
Anu
|
|
|
|
|
I add this line before FillRect
pDC->SetBrushOrg(StRect.left,StRect.top);
Its working.
Anu
|
|
|
|
|
|
I have a TCP/IP (socket) client/server program.
I want to transfer data directly between 2 or more clients without accessing server to reduce server's transferring tasks.
One of interesting samples is bt download tools, I guess bt tools transfer data directly among clients.
But how to do it? what techs should be used (such as socket)?
Thanks for any ideas and links in details - not limited to bt methods.
|
|
|
|
|
Hi,
If u r willing to use UDP, u can transfer data from one client to another client with user defined comm protocol.
|
|
|
|
|
You have to elaborate a bit better what you're going to achieve. In the term you spoke, the question is a nonsense.
In a "socket" world there must always be someone who connect to someone else who "listen". the first is a client , the second is a server.
Also "transfer between two or more" is a mis-concept.
That's not only a matter of grammar: networks are graphs, and graphs are made by nodes and arcs, and arcs are between two nodes. There cannot be segments with "two or more" ends.
What you're searching is not a "strange programming technic" but is an architecture made by client and server components placed on all the computers (the peers) that -after opening some sockets between some pair of them- exchanges some messages to let them understand what data is on what computer and let them transfer the "missing" data so that -after a number of iterations- all data are on all machines.
All this, is a "protocol" you have to design.
It's not a matter of TCP or UDP (they are just transport protocols) but of Checkpoints, Representation and Messages. In other ward "application level protocols".
The coding of the sockets is the last thing to be done, not the first.
2 bugs found.
> recompile ...
65534 bugs found.
|
|
|
|
|
|
what do I need as an overload= for the array type
I have a vector template that needs an overload
http://www.contract-developer.tk
|
|
|
|
|
Perhaps this well set you on the right path:
#include "stdafx.h"
#include <tchar.h>
#include <iostream>
using namespace std;
class MyVector
{
public:
template <typename T, size_t N>
MyVector& operator=(const T(&a)[N])
{
for (size_t i=0; i<N; ++i)
{
cout << a[i] << " ";
}
cout << endl;
return *this;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MyVector vec;
int n[] = {1, 2, 3, 4};
const char* s[] = {"One", "Two", "Three", "Four"};
vec = n;
vec = s;
cout << endl;
}
Output:
1 2 3 4
One Two Three Four
NOTE: Visual Studio 6 can't handle it.
Steve
|
|
|
|
|
For some reason VS 2010 does not like that.
Do I need more assignment overloading?
vector operator= (vector &that) {
for (int i=0; i < that.data.size(); i++)<br />
this->data[i] = that.data[i];<br />
return *this;<br />
}<br />
vector operator= (base* that) {
for (int i=0; i < sizeof(that); i++)<br />
this->data[i] = that[i];<br />
return *this;<br />
}<br />
http://www.contract-developer.tk
|
|
|
|
|
It looks like you need something like this instead of the second overload:
template <std::size_t N>
vector& operator=(const base(&that)[N])
{
for (int i=0; i<N; ++i)
data[i] = that[i];
return *this;
}
sizeof(that) is wrong for may reasons. It's the size of a single base type in bytes. Also, read up on array to pointer decay.
NOTE: Both overload should return vector& , not vector .
PS: No animals where harmed while posting this code.
Steve
|
|
|
|
|
This variable N, is that second needed?
My goal...
matrix a;
matrix[0] = {0, 1, 4, 1, 9};
matrix[1] = {....};
and so on, so I am trying to get the vector base template working better
http://www.contract-developer.tk
modified on Thursday, June 17, 2010 8:38 PM
|
|
|
|
|
I don't think this kind of thing can be done unless you've got some brand spanking new C++0x[^] compliant compiler. Specifically the C++0x "Initializer lists" feature.
Steve
|
|
|
|
|
Guess I am waiting for Visual Studio 2010 SP1
http://www.contract-developer.tk
|
|
|
|
|
|
I have looked the std::array and I will see what I can do about casting that to my vector template.
#include <array>
http://www.contract-developer.tk
|
|
|
|
|
That was another waste of time.
Sure seems VC 2010 is hostile to data processing.
http://www.contract-developer.tk
|
|
|
|
|
If you want to do something with an array and not a pointer to a lump of data then declare the function as:
template <std::size_t N> my_class &operator=(T (&t)[N])
where T is the type you're templating on. Usually what you do is have a copy constructor that takes the same parameters and then you implement operator= in terms of it (which can improve exception saftety as well if you do it right):
template <std::size_t N> my_class &operator=( T (&t)[N] )
{
my_class temp( t );
std::swap( temp. *this );
return *this;
}
The important thing is getting the size of the array into the function.
Another way of doing this, which is common in the STL, is to specify a range of interators, in this case you could use a range of T pointers:
my_class &operator=( const T *begin, const T * const end )
I'd strongly recommend you grab a copy of "Exceptional C++" by Herb Sutter - it's got loads of guidance on how to write assignment operators.
Cheers,
Ash
|
|
|
|
|
a while ago I wrote a vector template to assist in a project, it works OK.
I was considering the effect inheriting the std::vector and make all of the functionality available and simply attach my new functionality on top of that.
Is this practical? Here is the vector as it stands today.
template <class base> class vector {<br />
public:<br />
std::vector<base> data;<br />
friend class matrix<base>;<br />
vector operator+(const vector &that) {
vector ret;<br />
assert(this->data.size() == that.data.size());<br />
ret.resize(this->data.size());<br />
#pragma omp parallel for<br />
for (int i = 0; i < this->data.size(); i++)<br />
ret.data[i] = this->data[i] + that.data[i];<br />
return ret;<br />
}<br />
vector operator-(vector that) {
vector ret;<br />
assert(this->data.size() == that.data.size());<br />
ret.resize(this->data.size());<br />
#pragma omp parallel for<br />
for (int i = 0; i < this->data.size(); i++)<br />
ret.data[i] = this->data[i] - that.data[i];<br />
return ret;<br />
}<br />
vector operator* (base &that) {
vector ret;<br />
ret.resize(this->data.size());<br />
#pragma omp parallel for<br />
for (int i = 0; i < this->data.size(); i++)<br />
ret.data[i] = this->data[i] * that;<br />
return ret;<br />
}<br />
double operator* (vector &that) {
double ret;<br />
#pragma omp parallel for<br />
for (int i = 0; i < this->data.size(); i++) <br />
ret += this->data[i] * that.data[i];
return ret;<br />
}<br />
vector operator/ (base &that) {
vector ret;<br />
ret.resize(this->data.size());<br />
#pragma omp parallel for<br />
for (int i = 0; i < this->data.size(); i++)<br />
ret.data[i] = this->data[i] / that;<br />
return ret;<br />
}<br />
vector operator= (vector &that) {
for (int i=0; i < that.data.size(); i++)<br />
this->data[i] = that.data[i];<br />
return *this;<br />
}<br />
base& operator[] (size_t index) { <br />
return this->data[index];<br />
}<br />
bool operator== (vector &that) { <br />
bool temp = true;<br />
for (int i=0; i < that.data.size(); i++)<br />
if (this->data[i] != that.data[i]) temp = false;<br />
return temp;<br />
}<br />
base norm(void) { <br />
base result = (base)0.0;<br />
#pragma omp parallel for<br />
for (int i = 0; i < this->data.size(); i++) {<br />
result += this->data[i] * this->data[i];
}<br />
return sqrt(result);<br />
}<br />
size_t size(void) {<br />
return data.size();<br />
}<br />
vector resize(size_t newsize) {<br />
data.resize(newsize);<br />
return *this;<br />
}<br />
vector clear(void) {<br />
data.clear();<br />
return *this;<br />
}<br />
};<br />
http://www.contract-developer.tk
|
|
|
|
|
The general concensus is don't inherit from an STL collection - they're not designed for it.
The two ways I'd recommend going about extending an STL collection is either bundle it up in another class (which you've done) OR just write free functions to do the extended functionality. From your example it looks like you want a geometric vector and not a collection of doodads that might or might not have some geometric relationship.
Incidentally if you want to continue using containment the way you have make the std::vector private. You really don't want a class exposing data through it's public interface, it's really hard to test and some idiot will maul it for you - even if that idiot turns out to be you several months down the line when you've forgotten what you did.
Cheers,
Ash
|
|
|
|
|
I guess I will need to add more accessors then to make it resemble the std::vector
My goal is to resemble the std::vector and bolt on some linear algebra
http://www.contract-developer.tk
|
|
|
|
|
|
I find that adding:
template <class base> class vector : std::vector<base>
does not seem to provide a great deal of change? So what impact if any does inheriting the object get me?
http://www.contract-developer.tk
|
|
|
|