|
Did you write past the end of the array (heap)?
|
|
|
|
|
That error is no long happening, it now occurs prior to that block of code when I do:
int K = 1000
Ey_x= new Complex [K];
Ey_z_C=new Complex [K];
Ey_z_L=new Complex [K];
z_prime=new Complex [K];
It occurs at "Ey_z_L=new Complex [K];" but if I rearrange them is will still always occur in the 3rd spot.
Any Ideas??
Thanks
|
|
|
|
|
Sorry I didn't see those messages post before I posted my last one. I am using visual studio 2005, and I do not believe that I am writing outside of the heap. I don't think I can e-mail u the whole code as it is for a program that is IP of the school I am working at but this is the part that is causing me all the problems.
int K=1000;
Complex *Ey_z_C,*Ey_z_L,*Ey_x,*z_prime;
Ey_x= new Complex [K];
Ey_z_C=new Complex [K];
Ey_z_L=new Complex [K];
z_prime=new Complex [K];
double *x_prime;
x_prime=new double [K];
Complex dz;
double n_eff_C = z_dir(dz,z_prime,Ey_z_C,K,N,n0_C,z);
double n_eff_L = z_dir(dz,z_prime,Ey_z_L,K,N,n0_L,z);
double dx;
double n_eff_x=x_dir(dx,x_prime,K,Ey_x,n_eff_C,n_eff_L,w);
Complex **Ey = (Complex**)malloc(sizeof(Complex*)*K);
for ( i =0; i < K; i++){
Ey[i] = (Complex*) malloc(sizeof(Complex)*K);
}
double **I = (double**)malloc(sizeof(double*)*K);
j = 0;
while (j<K){
I[j] = (double*) malloc(sizeof(double)*K);
j++;
}
|
|
|
|
|
I give the following advice about once a month (recently every few days); it often helps me track down the nastier heap errors:
Try enabling the page heap[^] for your process. Follow these steps:
1. Download and install WinDBG[^].
2. Select “Start”->“All Programs”->“Debugging Tools for Windows”->“Global Flags”.
3. Select the “Image File” tab.
4. In the “Image: (TAB to refresh)” edit control enter the name of your app then press TAB. Just the name with the extension; not the full path.
5. Tick the following:
- “Enable page heap”
- “Enable heap tail checking”
- “Enable heap free checking”
- “Enable heap parameter checking”
- “Enable heap validation on call”
- “Create user mode stack trace database”
6. Press “Apply”.
7. Debug your application. Any debugger will do but with WinDBG you have access to the stack traces of allocations via the !heap –p –a command, for example. When a heap problem is detected a breakpoint will be generated.
8. When done un-tick all the options you ticked, press “Apply” then dismiss GFlags. This step is important as if it’s skipped all applications named as entered in step 4 will run with the page heap enabled.
Note that when using the page heap your application will run much slower than normal and consume way more memory. It’s good to have a beefy machine to do such tests; and such tests should be ran regularly on all applications you develop as part of regular testing activities. If I find a part of my application that’s too slow with the page heap enabled I optimize the memory allocation in that region.
Steve
|
|
|
|
|
I have found the problem, I had a loop that was writing to much data to the allocated space. It was much earlier in the code and that was why it was so hard to track down this bug.
Thanks for all the help everyone!
|
|
|
|
|
I'm trying to implement a "MFC CList look-alike" wrapper on top of the STL list using MS Visual C++ 2005 Express.
The implementation of the iteration methods begin-next-prev-end requires a storage of the position in the class like this:
<br />
#include <list><br />
template< class TYPE> <br />
class CList<br />
{<br />
protected:<br />
std::list< TYPE >::iterator pos;<br />
...<br />
But it doesn't work... I get these compiler errors:
warning C4346: 'std::list< TYPE >::iterator' : dependent name is not a type
error C2146: syntax error : missing ';' before identifier 'pos'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
I don't quite understand the errors. Using the same declaration (std::list< TYPE >::iterator p) in a member function, I don't get any errors at all from the compiler.
Why am I not allowed to declare this iterator (pos) as a member in the class? Hope someone can help?
-- modified at 11:45 Tuesday 5th June, 2007
-- modified at 11:46 Tuesday 5th June, 2007
Anton112
|
|
|
|
|
Interesting, as your code snippet compiles fine with VS6.
template<class T>
class CList
{
protected:
std::list<T>::iterator pos;
}; I'd guess that it has to do with VS2005 being more C++ compliant. See here.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Well, I have to admit that I don't know anything about compilers in that sense. Hence, I don't know anything about differences between specific compilers. In fact, years agy I tried to be a Windows developer, but it is years ago...
Anton112
|
|
|
|
|
iterator cannot be deduced as a type by the compiler. To make it (compiler) think so, put typename in front of its declaration;
template<class T>
class CList{
protected:
typename std::list<T>::iterator pos;
};
--
=====
Arman
|
|
|
|
|
Thanks, Arman
You gave me my answer...
Anton112
|
|
|
|
|
Hello I do not know if this messageboard is the good one !
I have a problem with fonction recev
the code under MFC VS2005
Before I get a connection with accept(...)
rVal = recv(m_acceptSocket,messageStream,BUFFER_SIZE,0);
if ( rVal == 0 || rVal == WSAECONNRESET || rVal==SOCKET_ERROR) {
m_clientConnected=false;
if (rVal==SOCKET_ERROR)
{
int errorCode = 0;
string errorMsg ="error calling recv():\n";
//void detectErrorRecv(int* errCode,string& errMsg)
//{
//*errCode = WSAGetLastError();
//if ( *errCode == WSANOTINITIALISED )
//else if ...
}
detectErrorRecv(&errorCode,errorMsg);
}
}...
My problem is that the error do not match with any error possible for the fonction recev (WSANOTINITIALISED ,WSAEADDRINUSE ,......)
I do not undestand how it his possible.
Thank you for help me !
AutreChien
|
|
|
|
|
NorGUI wrote: My problem is that the error do not match with any error possible for the fonction recev (WSANOTINITIALISED ,WSAEADDRINUSE ,......)
Do you know ALL of the error codes that recv() could return? There are 2000 socket-related codes. What is the value or rVal ?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
recv() doesn't return an error code.
rVal = recv(m_acceptSocket,messageStream,BUFFER_SIZE,0);
if (rVal == SOCKET_ERROR)
{
int nWSAErr = WSAGetLastError();
if (nWSAErr == WSAECONNRESET)
{
}
else if (nWSAErr == ...)
{
}
}
else if (rVal == 0)
{
... the connection has been closed
}
else
{
... bytes were received
}
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
Hi. I´m trying to run my app after creating the setup and installing it on a clean computer, I mean, with the OS recently installed to avoid finding "extra" dll around.
After installing the app with no errors, when I run I see nothing. No error, no program, nothing. In the task manager I hace checked that it starts and finishes in about a second. In my computer, it works fine, but I want to check how would it work on the costumer´s computer.
I have used a program (Dll Show by Design) to know whick dll and other files does the program use, and here is the list:
advapi32.dll
clbcatq.dll
comctl32.dll
comctl32.ocx
comdlg32.dll
conres.dll
dnsapi.dll
fm20.dll
fm20esn.dll
gdi32.dll
hnetcfg.dll
kernel32.dll
mfc42.dll
mfc42loc.dll
mscomm32.ocx
msctf.dll
msflxgrd.ocx
msvcrt.dll
mswsock.dll
netapi32.dll
ntdll.dll
ntwdblib.dll
ole32.dll
aleaut32.dll
olepro32.dll
riched20.dll
rpcrt4.dll
secur32.dll
shell32.dll
shlwapi.dll
sxs.dll
tmb.exe
user32.dll
uxtheme.dll
version.dll
winrnr.dll
wldap32.dll
ws2_32.dll
ws2help.dll
wshtcpip.dll
My question is:
I know that the exe must be included on the setup.exe (of course), and if I include all this files it could be risky that there are some files like kernel32.dll that are unique in each computer so, do you see any file in the list that you think could be necessary in the setup? Should I include the ocx like msflxgrd.ocx os mscomm.ocx?
Thanks!
Time to come clean...
Vive y deja vivir / Live and let live
Javier
|
|
|
|
|
garfield185 wrote: In the task manager I hace checked that it starts and finishes in about a second.
Sounds like an ActiveX control has not been registered.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I have checked that, and all the controls are registered. I use a .bat file to use RegSvr32 and register the ocx, and all the dll that I put on system32 folder. Any other idea?
I have tried many times and different ways, but I just can´t...
Time to come clean...
Vive y deja vivir / Live and let live
Javier
|
|
|
|
|
How do u pass a Cstring into a function that accepts LPSTR?
|
|
|
|
|
tom groezer wrote: How do u pass a Cstring into a function that accepts LPSTR?
If you have _UNICODE defined then you have to use W2A macro
#include <atlconv.h>
USES_CONVERSION;
CString csSomeString = _T( "Nibu" );
LPSTR lpsz = W2A( csSomeString );
else if _UNICODE not defined then
CString csSomeStr = _T( "Nibu" );
LPSTR lpsz = csSomeStr.GetBuffer( 0 );
csSomeStr.ReleaseBuffer();
|
|
|
|
|
|
CString cstring;
LPSTR str = cstring.GetBuffer();
//access str
cstring.ReleaseBuffer();
With some Windows API, which take a LPSTR but do not write to it and would only need a LPCTSTR, I am sloppy and use the (LPSTR)(LPCTSTR) casting hack.
Disclaimer:
Don't try this at home kids, we are trained professionals.
Neither me or my company endorse this coding style implicitly or explicitly.
Failure is not an option - it's built right in.
|
|
|
|
|
Thr trite answer is, that depends on what the function wants to do with the LPSTR.
You can call mycstring.GetBuffer(0); to get a pointer to the internal text buffer in the CString object. If you're working in ASCII and not UNICODE then that pointer should match up with LPSTR. If the function you're calling expects the string to be of at least a minimum length then use mycstring.GetBuffer(nMinLength); to get a buffer of at least nMinLength characters. If doing this actually makes your CString longer you can call <code>mycstring.ReleaseBuffer(); afterwards to let the buffer shrink to only what's needed.
If the function that takes a LPSTR wants to write into the string you have to be very careful to pass a big enough buffer and validate it afterwards. mycstring.GetBufferSetLength(nLength); can sometimes be useful for this sort of thing. CStrings are useful but slippery customers
Nothing is exactly what it seems but everything with seems can be unpicked.
|
|
|
|
|
tom groezer wrote: How do u pass a Cstring into a function that accepts LPSTR?
Usually the above is NOT a good idea, unless yoou know that the function doesn't change the passed buffer. Typically there are the following scenarios:
(1) The function doesn't change the buffer.
(2) The function changes the buffer and it accepts the size of the buffer as parameter
The better way to handle point (1) is rewriting the function prototype in order to accept a LPCSTR argument instead of a LPSTR one, then passing to the function directly the CString object (CString implements a LPCSTR cast operator). If you cannot change the function prototype, but ARE SURE that function doesn't change the buffer, then use the CString::GetBuffer method).
To handle scenario (2), use CString::GetBuffer in a consistent way, for instance:
void fillBuffer(LPSTR lpszBuffer, INT nBufferSize);
void myFunction()
{
const int nSize = 10;
CString myString;
fillBuffer( myString.GetBuffer(nSize), nSize);
myString.ReleaseBuffer();
}
If you hve any doubts, see GetBuffer documentation here [^].
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.
|
|
|
|
|
Please look at CString::operator LPCTSTR
CString strTemp;
(LPCTSTR)strTemp;
Regards,
Paresh.
|
|
|
|
|
Paresh Chitte wrote: Please look at CString::operator LPCTSTR
Did you miss the "that accepts LPSTR" part?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
As I didn't know thist GetBuffer ()... I made my own text transformation. I write it down:
char m_cName [20];
LPTSTR CMyClass::TransformTextFormat (const CString szString)
{ for (int i = 0; i < 20; i++)
m_cName[i] = NULL;
for (int j = 0; j < szString.GetLength (); j++)
m_cName[j] = szString[j];
return &m_cName[0];
}
I know is not the most "pretty" way... but it works
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
|
|
|
|