|
If you mean that the type of the index value needs to be different, then the only way to achieve this is defining your own subscript operator overloads, and that means you need to define your own array class(es).
Here's an example of how to define and use such overloads to create a 3D array like you describe:
enum EMyColors {
C_RED,
C_GREEN,
C_YELLOW
};
template <class Base, int n_elements>
class CMyArray1 {
std::vector<Base> values;
public:
CMyArray1() : values(n_elements) {} Base& operator[](const wchar_t wc) {
size_t index = wc - L'a'; assert(index < values.size());
return values[index];
}
};
template <class Base, int n_vectors, int n_elements>
class CMyArray2 {
std::vector< CMyArray1<Base, n_elements> > vectors;
public:
CMyArray2() : vectors(n_vectors) {} CMyArray1<Base, n_elements>& operator[](int i) {
size_t index = i - 1; assert(index < vectors.size());
return vectors[index];
}
};
template <class Base, int n_arrays, int n_vectors, int n_elements>
class CMyArray3 {
std::vector< CMyArray2<Base, n_vectors, n_elements> > arrays;
public:
CMyArray3() : arrays(n_arrays) {} CMyArray2<Base, n_vectors, n_elements>& operator[](EMyColors c) {
size_t index;
switch (c) {
case C_RED:
index = 0;
break;
case C_GREEN:
index = 1;
break;
default:
index = 2;
break;
}
return arrays[index];
}
};
int foo() {
CMyArray3<int, 3, 5, 8> my_array;
my_array[C_GREEN][3][L'c'] = 17;
}
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
|
|
|
|
|
An excellent and creative solution!!
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
char *** array; and allocate it.
|
|
|
|
|
Simply define the needed datatypes as UNION and make your array of the union type:
enum MyEnum { X, Y, Z };
union MyUnion {
MyEnum _Enum;
int _Int;
const wchar *_Pwchar;
};
MyUnion ary[3][6][7];
|
|
|
|
|
Hi,
Created software for electric switch (one directional) with UPD protocol. At first I created both sides with c#. Worked well but slow, had to restrain my "Transmitter" for the receiver to collect all relevant data. Now for better performance I program a native receiver. All is going well except the "recv" and the "recvfrom" methods only receive 517 bytes of the package size transmitted: (Maximal UDP)65507. How can I receive maximal upd package with a blocking socket?
|
|
|
|
|
You need to keep receiving until there is no more data. TCP and UDP messages get broken up to send across the wire, so you will not always receive the complete message in one go.
Veni, vidi, abiit domum
|
|
|
|
|
UDP messages will not be broken up. But TCP will mostly (possibly except when Nagle is turned off).
Gisle V.
# rm -vf /bin/laden
/bin/rm: success
|
|
|
|
|
Thanks, you are right of course.
Veni, vidi, abiit domum
|
|
|
|
|
Hi,
This is incorrect if the packet is transmitted over IPv4. All packets are subject to fragmentation over IPv4 and governed by smallest MTU in the route. Note that if the DF bit is set the router will *not* fragment the packet and will instead send back an IMCP response containing the message "fragmentation needed and DF set".
It would be correct to say that routers on an ipv6 network do not fragment and instead the MTU is honored at both receiving end points due to PMTUD.
Best Wishes,
-David Delaune
|
|
|
|
|
This might have something to do that UDP Messages get broken up into different UDP Packets.
For example, the message
"Hi, I am a UDP message and I maybe get transmitted as multiple UDP packets"
might be transmitted as
"Hi, I am a UDP mes"
"sage and I maybe get transmitted as multiple U"
"DP packets"
Due to this you might need to read packets until you KNOW that the message has ended, e.g. by using a fixed message length or a defined control character marking the end of the message.
To answer your question: Your socket will remain blocked until the whole message (= every data packet) is received, but you can avoid a block of your whole program by using a separate thread for your socket.
Veni, vidi, caecus | Everything summarizes to Assembly code
|
|
|
|
|
Thanks, can you give a small code example?
|
|
|
|
|
That depends on which framework you will use.
Are you using .Net? MFC? Native C++? Qt?
Veni, vidi, caecus | Everything summarizes to Assembly code
|
|
|
|
|
You just need to create a loop that repeats the recv call untill there is no more data.
Veni, vidi, abiit domum
|
|
|
|
|
Thanks, I'll give it a shot.....
|
|
|
|
|
Hey there,
I have a bitmap header information in the struct
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO
The total size of this is 1080.
Now i want to convert this into a unsigned char pointer.
unsigned char * pBMPHeaderData;
I already got the raw image data in another unsigned char buffer.
unsigned char* pRawBMPData;
Now i want to make a complete BMP image by adding the header info and raw data into a new unsigned char pointer. For this i need to convert the BITMAPINFO struct into a unsigned char *
So the new buffer will be,
unsigned char * pCompleteBMPIMageData = pBMPHeaderData + pRawBMPData;
Can anyone tell me how to do this?
Thanks in advance.
|
|
|
|
|
|
What do you mean by "i want to convert this into a unsigned char pointer."? A pointer is merely the address of some block of memory, you do not convert things into pointers. Procedurally to combine the two blocks into a new BMP you need to do the following:
PBYTE pCompleteBMPIMageData = new BYTE[size of header plus size of raw data];
memcpy(pCompleteBMPIMageData, reinterpret_cast<PBYTE>(&BITMAPINFO), sizeof BITMAPINFO);
memcpy(pCompleteBMPIMageData + sizeof BITMAPINFO, pRawBMPData, size of raw data);
Veni, vidi, abiit domum
|
|
|
|
|
The reason why i want to get the BITMAP Info structure in a unsigned char pointer is because i want to convert that into a base64 encoded string.
So it's not about converting a structure into a unsigned char pointer. I want the data in the structure to be populated in a unsigned char pointer so that it could be later used to generate a base64 encoded string for the bitmap image.
|
|
|
|
|
Well if you use my suggested code, that is what you will get.
Veni, vidi, abiit domum
|
|
|
|
|
Richard gave you the right suggestion, then. The only trick part is computing the size of the raw data (you may find sample code at MSDN[^]).
Please note, as workaround, you could directly encode the whole BMP file (if you have it) content in Base64 .
Veni, vidi, vici.
|
|
|
|
|
Hello,
I have a C# dll (COM) which contains API which have a parameter like below :
[type: ComVisible(true)]
[Guid("66F046BC-D97C-4CF2-96B5-01E66329FC65")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ICDBrowserServiceMgr
{
[DispId(15)]
void Initialize(SeeSPMPLMClientLib.TSeeSPMPLMClient A_pClient);
...}
Now I need to integrate this dll in MFC application
So I put the import directive
#import "SeeSPMPLMClient.dll"
#import "My_dll.tlb"
after i do
My_Dll_Namespace::ICDBrowserServiceMgrPtr m_pICDBrowser;
SeeSPMPLMClientLib::ISeeSPMPLMClientPtr m_pPLMClientMgr;
m_pICDBrowser->Initialize(m_pPLMClientMgr);
I ahve the error :
error C2664: 'My_Dll::ICDBrowserServiceMgr::Initialize' : cannot convert parameter 1 from 'SeeSPMPLMClientLib::ISeeSPMPLMClientPtr' to 'My_Dll_Namespace::ISeeSPMPLMClient *'
Any idea please ?
modified 10-Jan-14 4:34am.
|
|
|
|
|
khaliloenit wrote: Any idea please ? As the message says, you cannot pass a SeeSPMPLMClientLib::ISeeSPMPLMClientPtr to a method that expects a My_Dll_Namespace::ISeeSPMPLMClient * . Check the documentation and the header files to see exactly what you should be passing across.
Veni, vidi, abiit domum
|
|
|
|
|
as you see above
the API take as parameter the same type which I pass from C++ !!!
|
|
|
|
|
Er, No; otherwise the compiler would not be producing that error message.
Veni, vidi, abiit domum
|
|
|
|
|
this is cant be caused by ambiguity of namespaces ?
i.e : if this type is used in C# dll and after passed from other project which use same type we have ambiguity of Type ?
|
|
|
|