|
Hi all, i was curious to know how would i program a function to create a file into any directory. For example. Most windows dirs begin with c:\
But what if they have a custom dir? Like E:\ or H:\ ?
I would just like to know if i can make a function that will add a file in the folder no matter what the directory begins with. Thanx in advance!
|
|
|
|
|
You want to do this in managed C++, or are you in the wrong forum ?
You'd generally let the user choose the directory they wanted to create into, or you'd use the path to your executable as a starting point, if you wanted to create it locally.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
Hi all,
well allthough I'm new to C++ I've done my share of development in more user friendly environments, mainly C#.
Anyhow I want to learn C++ as mainly personal interest as my professional life will be focused primarly in .NET development whenever it is needed.
To learn the basics of the language I'm starting with a real easy Math class that will initially implement a Matrix (no templates). Nothing fancy but an easy place to start to at least start learning Object Oriented programming in C++ like any other.
Well the thing is that I'm completely stumped with an error I'm getting. I've created a simple Win32 console app that links my FastMath.dll and uses the FMatrix class defined inside. Test app code is as simple as it can get, it only instantiates one FMatrix and then deletes it, and something that simple is giving me a runtime error. Here's the code in the tesp app:
#include "stdafx.h"
#include "FMatrix.h"
#include <iostream>
using namespace FastMath;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
FMatrix *a=new FMatrix(5);
cout << "A is a [" << a->GetRowCount() << "x" << a->GetColumnCount() << "] matrix." << endl;
delete a;
return 0;
}
Ok the error I'm getting is when executing "delete a":
Windows has triggered a breakpoint in Tester.exe.
This may be due to a corruption of the heap, and indicates a bug in Tester.exe or any of the DLLs it has loaded.
The output window may have more diagnostic information
If I try to continue I get the same error once and then succesive Assertion Failed error messages: "Expression: _CrtIsValidHeapPointer(pUserData)" and if I ignore that I get a HEAP CORRUPTION DETECTED error message "CRT detected that the application wrote to memory after end of heap buffer."
I really do not understand what I'm doing wrong in my FMatrix file. I'm including header and source files below:
FMatrix.h
#ifdef FASTMATH_EXPORTS
#define FASTMATH_API __declspec(dllexport)
#else
#define FASTMATH_API __declspec(dllimport)
#endif
#pragma once
#include "StdAfx.h"
namespace FastMath
{
class FASTMATH_API FMatrix
{
private:
int rw,cl;
double *val;
FMatrix(void);
FMatrix(unsigned int,bool);
FMatrix(unsigned int,unsigned int,bool);
void initMatrix(unsigned int,unsigned int,bool);
void destroy(void);
public:
FMatrix(const FMatrix&);
FMatrix(unsigned int);
FMatrix(unsigned int,unsigned int);
FMatrix(unsigned int,unsigned int,double**);
~FMatrix(void);
static FMatrix* CreateIdentity(unsigned int);
static FMatrix* CreateFull(unsigned int,unsigned int,double);
static FMatrix* CreateRandomIntMatrix(unsigned int,unsigned int,int,int);
static FMatrix* CreateRandomDblMatrix(unsigned int,unsigned int,double,double);
double GetItem(unsigned int,unsigned int) const;
void SetItem(unsigned int,unsigned int,double);
int GetRowCount() const;
int GetColumnCount() const;
static bool AreSameSize(const FMatrix&,const FMatrix&);
FMatrix& operator =(const FMatrix&);
FMatrix& operator -() const;
FMatrix& operator +(const FMatrix&) const;
FMatrix& operator -(const FMatrix&) const;
FMatrix& operator *(double) const;
FMatrix& operator *(const FMatrix&) const;
FMatrix& operator !() const;
bool operator ==(const FMatrix&) const;
bool operator !=(const FMatrix&) const;
};
}
FMatrix.cpp
#include "StdAfx.h"
#include "FMatrix.h"
#include "time.h"
#include <cstdlib>
#include <iostream>
using namespace FastMath;
using namespace std;
void FMatrix::initMatrix(unsigned int r,unsigned int c, bool initValues)
{
rw=r;
cl=c;
val=new double[rw*cl];
#ifdef _DEBUG
cout <<"++ Matrix created." << endl;
#endif
if (initValues)
{
for (int i=0;i<rw;i++)
{
for (int j=0;j<cl;j++)
*(val+i*cl+j)=0;
}
}
}
FMatrix::FMatrix()
{
}
FMatrix::FMatrix(unsigned int dim,bool initValues)
{
initMatrix(dim,dim,initValues);
}
FMatrix::FMatrix(unsigned int rows,unsigned int columns,bool initValues)
{
initMatrix(rows,columns,initValues);
}
FMatrix::FMatrix(unsigned int dim)
{
initMatrix(dim,dim,true);
}
FMatrix::FMatrix(unsigned int rows, unsigned int columns)
{
initMatrix(rows,columns,true);
}
FMatrix::FMatrix(const FMatrix &m)
{
initMatrix(m.rw,m.cl,false);
for (int i=0;i<rw;i++)
{
for (int j=0;j<cl;j++)
*(val+i*cl+j)=*(m.val+i*cl+j);
}
}
FMatrix::~FMatrix()
{
destroy();
}
void FMatrix::destroy()
{
delete[] val;
#ifdef _DEBUG
cout << "-- Matrix destroyed." << endl;
#endif
}
FMatrix* FMatrix::CreateIdentity(unsigned int dim)
{
FMatrix *t=new FMatrix(dim,false);
double* pTval=t->val;
int c=t->cl;
for (register int i=0;i<t->rw;i++)
{
for (register int j=0;j<c;j++)
{
if (j==i)
*(pTval+i*c+j)=1;
else
*(pTval+i*c+j)=0;
}
}
pTval=NULL;
return t;
}
FMatrix* FMatrix::CreateFull(unsigned int rows, unsigned int columns, double value)
{
FMatrix *t=new FMatrix(rows,columns,false);
double* pTval=t->val;
int c=t->cl;
for (register int i=0;i<t->rw;i++)
{
for (register int j=0;j<c;j++)
{
*(pTval+i*c+j)=value;
}
}
pTval=NULL;
return t;
}
FMatrix* FMatrix::CreateRandomIntMatrix(unsigned int rows, unsigned int columns, int lowest, int highest)
{
FMatrix *t=new FMatrix(rows,columns,false);
double* pTval=t->val;
int c=t->cl;
SYSTEMTIME lp;
GetSystemTime(&lp);
srand(rand()*(unsigned int)lp.wMilliseconds);
for (register int i=0;i<t->rw;i++)
{
for (register int j=0;j<c;j++)
{
*(pTval+i*c+j)=int(lowest+double(rand())/RAND_MAX*(highest-lowest)+.5);
}
}
pTval=NULL;
return t;
}
FMatrix* FMatrix::CreateRandomDblMatrix(unsigned int rows, unsigned int columns, double lowest, double highest)
{
FMatrix *t=new FMatrix(rows,columns,false);
double* pTval=t->val;
int c=t->cl;
SYSTEMTIME lp;
GetSystemTime(&lp);
srand((unsigned int)lp.wMilliseconds);
for (register int i=0;i<t->rw;i++)
{
for (register int j=0;j<c;j++)
{
*(pTval+i*c+j)=lowest+double(rand())/RAND_MAX*(highest-lowest);
}
}
pTval=NULL;
return t;
}
FMatrix& FMatrix::operator =(const FMatrix &m)
{
if (this!=&m)
{
double* pMval=m.val;
rw=m.rw;
cl=m.cl;
destroy();
initMatrix(rw,cl,false);
for (register int i=0;i<rw;i++)
{
for (register int j=0;j<cl;j++)
{
*(val+i*cl+j)=*(pMval+i*cl+j);
}
}
pMval=NULL;
}
return *this;
}
FMatrix& FMatrix::operator -() const
{
FMatrix *t=new FMatrix(rw,cl,false);
double* pTval=t->val;
for (register int i=0;i<rw;i++)
{
for (register int j=0;j<cl;j++)
{
*(pTval+i*cl+j)=-*(val+i*cl+j);
}
}
pTval=NULL;
return *t;
}
FMatrix& FMatrix::operator +(const FMatrix &m) const
{
if (!AreSameSize(*this,m))
{
throw exception("Matrix can not be added. Dimensions do not match.");
}
FMatrix *t=new FMatrix(rw,cl,false);
double* pTval=t->val;
double* pMval=m.val;
for (register int i=0;i<rw;i++)
{
for (register int j=0;j<cl;j++)
{
*(pTval+i*cl+j)=*(val+i*cl+j)+*(pMval+i*cl+j);
}
}
pTval=NULL;
pMval=NULL;
return *t;
}
FMatrix& FMatrix::operator -(const FMatrix &m) const
{
if (!AreSameSize(*this,m))
throw invalid_argument("Matrix can not be added. Dimensions do not match.");
FMatrix *t=new FMatrix(rw,cl,false);
double* pTval=t->val;
double* pMval=m.val;
for (register int i=0;i<rw;i++)
{
for (register int j=0;j<cl;j++)
{
*(pTval+i*cl+j)=*(val+i*cl+j)-*(pMval+i*cl+j);
}
}
pTval=NULL;
pMval=NULL;
return *t;
}
FMatrix& FMatrix::operator *(double d) const
{
FMatrix *t=new FMatrix(rw,cl,false);
double* pTval=t->val;
for (register int i=0;i<rw;i++)
{
for (register int j=0;j<cl;j++)
{
*(pTval+i*cl+j)=*(val+i*cl+j)*d;
}
}
pTval=NULL;
return *t;
}
FMatrix& FMatrix::operator !() const
{
FMatrix *t=new FMatrix(cl,rw,false);
double* pTval=t->val;
for (register int i=0;i<rw;i++)
{
for (register int j=0;j<cl;j++)
{
*(pTval+j*rw+i)=*(val+i*cl+j);
}
}
pTval=NULL;
return *t;
}
bool FMatrix::operator ==(const FMatrix &m) const
{
if (!AreSameSize(*this,m))
return false;
double *pMval=m.val;
for (register int i=0;i<rw;i++)
{
for (register int j=0;j<cl;j++)
{
if (*(pMval+i*cl+j)!=*(val+i*cl+j))
return false;
}
}
pMval=NULL;
return true;
}
bool FMatrix::operator !=(const FMatrix &m) const
{
return !(*this==m);
}
double FMatrix::GetItem(unsigned int r, unsigned int c) const
{
return *(val+r*cl+c);
}
void FMatrix::SetItem(unsigned int r, unsigned int c, double value)
{
*(val+r*cl+c)=value;
}
int FMatrix::GetRowCount() const
{
return rw;
}
int FMatrix::GetColumnCount() const
{
return cl;
}
bool FMatrix::AreSameSize(const FMatrix &m1, const FMatrix &m2)
{
return (m1.rw==m2.rw)&&(m1.cl==m2.cl);
}
I'm really confused because I dont know what I'm doing wrong. The thing is if I use in the App test the static constructors (CreateRandomIntMatrix for example) and I dont have to manually delete them from the app test everything works greate and the destructor of my two matrixes is called all by itself. But when I explecitly instantiate with the new operator in my app test and thus have to delete them myself in that same app I get the errors described above.
Any help plz?
P.D. Sorry about the long post.
|
|
|
|
|
gumi_r@msn.com wrote: well allthough I'm new to C++ I've done my share of development in more user friendly environments, mainly C#.
This is the C++/CLI forum. IF you want to learn C++, you need the visual C++ forum. C++/CLI is .NET C++.
<br />
FMatrix *a=new FMatrix(5); <br />
cout << "A is a [" << a->GetRowCount() << "x" << a->GetColumnCount() << "] matrix." << endl; <br />
delete a;<br />
Why create it as a pointer at all ?
Your destructor is obviously causing the error. Set a breakpoint and step through to see what it is. I can't see the initMatrix method, but for a starter, any constructor should set all pointers to NULL. A pointer that was not set by initMatrix and was not set to NULL is a very likely cause of this error.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
The only pointer in my class is double* val that is a double array that stores all my matrix items.
Destructor only executes delete [] val and sets the pointer to NULL on exit.
No other pointers are set during the constructor.
The thing is that I'm not getting an error anywhere that i can see when I step through with the debugger. Everything executes perfectly if I put a breakpoint on the exit bracket of my destroy() method (Destructor calls this method, I implemented this way so I can log every call to my destroy method even if called from inside the class like in the assign operator where I have to delete *val before reassigning.) Once I hit the breakpoint and I press continue and the only thing it should do is step out of the Destroy() method and return to the the Test app I get the error. I dont know what's going on at all.
1. Only pointer in my class is private member double *val;
2. Only pointer used in constructor is *val that is set with a new double[whatever];
3. Destructor calls private method destroy() where I delete [] val and log to the console that the destructor was called.
You can see the initMatrix method in my first post, but just for clarification, I'll show the involved methods here:
<rep>
<br />
void FMatrix::initMatrix(unsigned int r,unsigned int c, bool initValues)<br />
{<br />
rw=r;<br />
cl=c;<br />
val=new double[rw*cl];<br />
<br />
#ifdef _DEBUG<br />
cout <<"++ Matrix created." << endl;<br />
#endif<br />
<br />
if (initValues)<br />
{<br />
for (int i=0;i<rw;i++)<br />
{<br />
for (int j=0;j<cl;j++)<br />
*(val+i*cl+j)=0;<br />
}<br />
}<br />
}<br />
<br />
FMatrix::FMatrix(unsigned int dim)<br />
{<br />
initMatrix(dim,dim,true);<br />
}<br />
<br />
FMatrix::~FMatrix()<br />
{<br />
destroy();<br />
}<br />
<br />
void FMatrix::destroy()<br />
{<br />
delete[] val;<br />
val=NULL;<br />
#ifdef _DEBUG<br />
cout << "-- Matrix destroyed." << endl;<br />
#endif<br />
}<br />
|
|
|
|
|
Are r and c both > 0 when this is called ?
Christian Graus - C++ MVP
'Why don't we jump on a fad that hasn't already been widely discredited ?' - Dilbert
|
|
|
|
|
Yes, I'm calling
FMatrix::FMatrix(5);
I should add that every once in while when I build for debugging, I get a message warning me that: "The project is out of date. FastMath - Debug Win 32". Could the problems I'm having be something other that a coding problem? Something that goes wrong when building or something?
|
|
|
|
|
OK, yeah, if this is in a dll, it's possible you're not building the dll, or the one that your main program is seeing, is out of date.
Step into the code. Watch what the constructor and destructor do, assuming hte other methdos called are not changing state.
Christian Graus - C++ MVP
'Why don't we jump on a fad that hasn't already been widely discredited ?' - Dilbert
|
|
|
|
|
No I suspected it could have something to do with me not linking well the two projects so I even built it all in one same project...included header and source files of my FMatrix class in the Test app and removed any linking to the dlls...just compiled it as one console app. I still got the same error and I still couldn't catch it with the debugger step by step.
I'm giving up, at least today. Thanks for all the help.
|
|
|
|
|
If you email me the project (christian dot graus at gmail dot com ), I'll look at it for you.
But, next time ask in the right forum
Christian Graus - C++ MVP
'Why don't we jump on a fad that hasn't already been widely discredited ?' - Dilbert
|
|
|
|
|
Thanks! I really apreciate it.
About the wrong sorry, yeah :s sorry about that. Didnt see the Visual C++ formun
|
|
|
|
|
Ok Christian, thanks for all the help but I managed to track down the error. Must of had some other bug I fixed before when I tried to compile everything under the same project because otherwise it should have worked.
The thing is that in the FMatrix.h header file included in the Test project I wasn't including the private definitions. I thought that the header acted more like an interface than anything else and thus private members were not needed.
Once I included the private definitios in the FMatrix.h header file inside the Test app the problem disappeared.
Thanks for your help!
|
|
|
|
|
No worries, glad to help ( and glad that people are still learning C++ )
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
hi all ,
i have a problem when i am trying to connect to the data base via Network or via Web.
this is my connection string :
static private string GetConnectionString()
{
return "Data Source=10.0.0.25\\SQLEXPRESS\\Databases\\FWR.MDF;Integrated Security=True;User Instance=True";
}
and i recive this error exption :
(An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified).
i want to know how to solve this error.
Best Regards
Ahmed EL Gendy
|
|
|
|
|
|
Dear all,
I want to use the DataSet component for my Multiclient application.
I want to use data sets in my wrapper class coded in managed C++ which provids an interface to my main application.
But I experienced some problem here. I want my DataSets will be act as a global one , through which all my functions in that class can access it.
How can I set it to be a global one ?
I can declare it in a function ...like :
A.cpp
-------------
void A::fun1()
{
Dataset^ ds;
ds = gcnew DataSet();
}
But when I am trying to set it in ".h " for public access ..like..
A.h
--------------
class A {
public :
Dataset^ ds;
};
I got some "mixing unmanaged and managed code " error...
I am a beginner in C++/CLI , but I need to port my existing VC 6 application
to VS 2005 and also I need to use DataSets for DB access .
So I use "#pragma managed " and "#pragma unmanaged " while compiling my application with /CLR option. Now I want to use the above said wrapper to replace my existing VC 6 wrapper class .
So pls help me...
Regards,
vinsankar
|
|
|
|
|
#include <vcclr.h>
...
class A {
public:
gcroot<Dataset^> ds;
};
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Hello George.L.Jackson,
Your suggestion is good .... thank you...
Can u pls give me some links or some good books to refer C++/CLI...?
Regards
vinsankar
|
|
|
|
|
|
Another data type conversion question:
Is it possible to pass a c# stream to a C++/CLI wrapper method which in turn converts it to VARIANT type and passes it to an unmanaged C++ method?
Here are the two pieces of code that I would like to see working together:
<code>
Stream csStream = ...
managed.ManagedMethod( csStreamVar );
UnmanagedClass::UnmanagedMethod( VARIANT unmanStream )
{
...
}
</code>
Can someone help me fill the following C++/CLI wrapper method that converts the stream to VARIANT?
<code>
ManagedClass::ManagedMethod( Stream^ manStream )
{
... How to convert? ...
unmanaged.UnmanagedMethod( ...???... );
}
</code>
Thanks,
-----------------
Genaro
|
|
|
|
|
picazo wrote: Is it possible
Yes but you have to know what is in the stream to know how to configure the VARIANT, unless of course you have some Magic++ library that does that for you.
led mike
|
|
|
|
|
Can you give me an example of how you would do this if the stream is to contain well-formatted xml.
-----------------
Genaro
|
|
|
|
|
picazo wrote: Can you give me an example of how you would do this if the stream is to contain well-formatted xml
No, I will show an example of how things work, I will not do your work for you by providing you an example of how I "would" do it.
System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
System::IO::StringReader^ stream = gcnew System::IO::StringReader("<halp><halpme value=\"22\"/></halpme>");
doc->Load(stream);
System::String^ managedStr = doc->DocumentElement->Name;
System::String^ sval =
((System::Xml::XmlElement^)doc->DocumentElement->FirstChild)->GetAttribute("value");
int nval = System::Convert::ToInt32( sval);
_variant_t variant(nval);
std::cout << nval << std::endl;
std::cout << (int)variant << std::endl;
led mike
|
|
|
|
|
Hello,
I have the following unmanaged method:
<code>
BSTR UnmanagedClass::UnmanagedMethod( BSTR x, VARIANT y, BSTR z )
{
...
}
</code>
I am wrapping that method with the following C++/CLI method:
<code>
String^ ManagedClass::ManagedMethod( String^ x, String^ y, String^ z )
{
CComBSTR bstrX, bstrZ;
bstrX.Attach( ( BSTR )( void * )Marshal::StringToBSTR( x ) );
bstrZ.Attach( ( BSTR )( void * )Marshal::StringToBSTR( z ) );
????
return gcnew String( unmanaged->UnmanagedMethod( bstrX, ???, bstrZ ) );
}
</code>
The C++/CLI wrapper method will be accessed from C# as follows:
<code>
string x="some value", y="another value", z="a third value";
managed.ManagedMethod( x, y, z );
</code>
The problem I am having is converting the managed string handle (String^ y) to an unmanaged VARIANT parameter. I would like to be able to solve this problem without having to modify the unmanaged C++ code. Does anyone have any suggestions or ideas on how to do this?
Thanks in advance,
-----------------
Genaro
|
|
|
|
|
picazo wrote: Marshal::StringToBSTR
Returns an IntPtr. You can't just cast that to a BSTR you have to use a method like ToInt32().
led mike
|
|
|
|
|