|
Okay so I changed those and it cleared up some of the mess. But the old errors came back. In the errors below, CABLE is what I've been referring to as Class A and TABLE is Class F, the bottom tier one.
error LNK2019: unresolved external symbol "public: __thiscall CABLE::~CABLE(void)" (??1CABLE@@QAE@XZ) referenced in function "public: __thiscall TABLE::TABLE(int)" (??0TABLE@@QAE@H@Z)
error LNK2019: unresolved external symbol "public: __thiscall CABLE::~CABLE(void)" (??1CABLE@@QAE@XZ) referenced in function __unwindfunclet$??0CARD@@QAE@XZ$0
Looks like it doens't know where to go for CABLE function calls. Any ideas?
________________________________________________________________________
The question "Do computers think?" is the same as "Can submarines swim?"
Signature Red Studios
Jeryth
|
|
|
|
|
Jeryth wrote:
Looks like it doens't know where to go for CABLE function calls
No, it looks like it doesn't know where to go for CABLE::~CABLE(void), i.e. the destructor of your CABLE class. Did you perhaps by any chance forgot to define it? It looks as it's declared in the class allright but not defined in a cpp file.
I wonder why you're calling CABLE::~CABLE in TABLE's constructor, looks to me as inefficient member variabel initialization
Cheers
Steen.
"To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"
|
|
|
|
|
Yeah, saw the destructor reference and that was the first thing I checked before I posted. If only it would have been so easy. I'm not explicitly calling for any CABLEs to be made in the TABLE constructor. I'm creating some other objects that have CABLEs in them, but I'm pretty sure none of them are getting destroyed. I've got one implicit cast where I grab a line from cout and pass that into a function that's looking for a CABLE, so the VS is just doing that on its own. Don't know where the problem might be coming from.
________________________________________________________________________
The question "Do computers think?" is the same as "Can submarines swim?"
Signature Red Studios
Jeryth
|
|
|
|
|
Of course I didn't mean to imply that you would make such an elementary error , but there's no question (at least in my mind ) that the linker can't find the implementation of CABLE::~CABLE, so something's gotta be wrong. You could try to put {} after the declaration in header file to make ~CABLE inline, that way you're sure it's defined:
<br />
class CABLE<br />
{<br />
public:<br />
virtual ~CABLE() {};<br />
}<br />
If that gets rid of the linker error then recheck the definition of ~CABLE in your code.
Regarding calling of the constructor, it's called when temporary CABLE objects are constructed and destructed, for example during an assignment. Furthermore, the second linker error indicates that the destructor is called from a structured exception handler (the "_unwindfunclet" part sounds like stack unwinding to me)
Perhaps you could post some code to show the declaration and implemenations, or is it too large chunks?
cheers
Steen (from my home computer)
|
|
|
|
|
No, no, I've been known to make basic mistakes. Nearly tore all my hair out after typing 50 pages of code and couldn't get it to compile. Then found a missing semicolon about 20 lines up from where the compiler had flagged the error.
No, found out the problem. I had CABLE files in a different directory ( I wanted to keep them in a generic use folder ) and had added that directory to the project include folders, but had not added the files themselves to the project. Now compiling and linking is fine, but I've got yet ANOTHER problem.
I run the program in the debugger and after I get through a few menus, I get this:
DAMAGE: before Normal block ( #92 ) at ( 0x00323798 )
In stepping back through the debugger, it hilights the CABLE destructor. In particular, the line
<br />
delete [] cable;<br />
The cable var is a char * array so I don't know why it wouldn't be able to delete it. Any ideas here?
________________________________________________________________________
The question "Do computers think?" is the same as "Can submarines swim?"
Signature Red Studios
Jeryth
|
|
|
|
|
I think you made a memory overwrite somewhere in your code. MFC new puts guard bytes around your allocated block and checks if something has screwed up your block everytime you call new or delete - that's why you get the message in the destructor, as that's probably the first time after the error occurred that new or delete gets called. Alas, it has nothing to do with the destructor or the delete[] call as such. See this[^] MSDN article for more info.
Recheck your code for places where you use strcpy or similar function without checking the length of the arguments, especially your cable variable. Use strncpy instead.
Cheers
Steen
|
|
|
|
|
Hmm, I didn't make this an MFC project per se, just started with an empty solution but I guess some MFC is still being put it automatically.
That link was rather helpful, shows the same error message I'm getting so that should be the right track. I'm not using strcpy or strncpy anywhere. I use my own loops to copy element by element in CABLE. In fact the only string function I think I'm using is strlen . Here's the CABLE class in it's entirty. It's pretty simplistic, I'm pretty much just doing it for practice with plans to add on to it as I learn more.
#include <CABLE.h>
CABLE::CABLE()
{
cable = new char[1];
cable[0] = '\0';
length = 0;
}
CABLE::CABLE( int newLength )
{
cable = new char[newLength+1];
length = newLength;
for( int i = 0; i <= length; ++i )
{
cable[i] = '\0';
}
}
CABLE::CABLE( const char * const newCable )
{
length = strlen( newCable );
cable = new char [length+1];
for( int i = 0; i <= length; ++i )
{
cable[i] = newCable[i];
}
cable[length] = '\0';
}
CABLE::CABLE( const CABLE & rhs )
{
length = rhs.GetLength();
cable = new char[length+1];
for( int i = 0; i <= length; ++i )
{
cable[i] = rhs[i];
}
cable[length] = '\0';
}
CABLE::~CABLE()
{
delete cable;
cable = NULL;
length = 0;
}
CABLE & CABLE::operator=( const CABLE & rhs )
{
if ( this != &rhs )
{
delete [] cable;
length = rhs.GetLength();
cable = new char[length+1];
for( int i = 0; i <= length; ++i )
{
cable[i] = rhs[i];
}
cable[length] = '\0';
}
return *this;
}
char & CABLE::operator[]( int offset )
{
if ( offset > length )
{
return cable[length-1];
}
else
{
return cable[offset];
}
}
char CABLE::operator[]( int offset ) const
{
if ( offset > length )
{
return cable[length-1];
}
else
{
return cable[offset];
}
}
CABLE CABLE::operator+( const CABLE & rhs )
{
int totalLength = length + rhs.GetLength();
CABLE temp( totalLength );
for( int i = 0; i < length; ++i )
{
temp[i] = cable[i];
}
for( int j = 0; j < rhs.GetLength(); ++j, ++i )
{
temp[i] = rhs[j];
}
temp[totalLength] = '\0';
return temp;
}
void CABLE::operator+=( const CABLE & rhs )
{
int totalLength = length + rhs.GetLength();
CABLE temp( totalLength );
for( int i = 0; i < length; ++i )
{
temp[i] = cable[i];
}
for( int j = 0; j < rhs.GetLength(); ++j, ++i )
{
temp[i] = rhs[j];
}
temp[totalLength] = '\0';
*this = temp;
}
bool CABLE::operator==( const CABLE & rhs ) const
{
if ( length != rhs.length )
return false;
for( int i = 0; i < length; ++i )
{
if ( cable[i] != rhs.cable[i] )
return false;
}
return true;
}
const char * CABLE::GetCable() const
{
return cable;
}
int CABLE::GetLength() const
{
return length;
}
So as it is, I'm barely using the string class at all. It'd almost be worth it to swap out the strlen for a sizeof() call / size of a char .
________________________________________________________________________
The question "Do computers think?" is the same as "Can submarines swim?"
Signature Red Studios
Jeryth
|
|
|
|
|
If it's not an MFC App Wizard generated project you shouldn't have any MFC.
The only thing I can see in your code is that you use delete cable instead of delete[] cable in the destructor, but from your previous post I guess that's a typo (you said earlier that the debugger highlighted delete[] cable in the destructor).
How is CABLE used in your code? Which methods are called? That may give some clues.
Cheers
Steen
|
|
|
|
|
Jeryth wrote:
I'll say I'm 95% sure that's the cause. All the linking errors mentioned Class A name in the error field.
Multilple includes will give compiler errors(error C2011: 'CClassA' : 'class' type redefinition), not linking errors!
Cheers
Steen.
"To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"
|
|
|
|
|
You're right, I mis-labeled my problem. All classes compiled fine, they just wouldn't link. It was complaining about resolving an exxternal link error or somthing along those lines.
________________________________________________________________________
The question "Do computers think?" is the same as "Can submarines swim?"
Signature Red Studios
Jeryth
|
|
|
|
|
Im using win32 c++ compiler, but now i want to run/execute my program using command line arguments. How do i go about it?
oam
|
|
|
|
|
Are you wanting to do so from within the IDE?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Im using DOS, but now im used to execute it in the application
oam
|
|
|
|
|
From a command prompt (not DOS), type the name of your program followed by any command-line parameters that it supports.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
But then it just opens the program even though i supplied parameters
oam
|
|
|
|
|
Which means you aren't doing anything with them. Look at:
GetCommandLine()
__argc/__argv
CWinApp::m_lpCmdLine (MFC)
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
I've been having network problems!
Anyway i'm able to run it from Debug folder
like F:\Debug>filename file1 file2
can you run this code from the command line
<br />
#include <windows.h><br />
#include <stdio.h><br />
<br />
void main( VOID )<br />
{<br />
STARTUPINFO si;<br />
PROCESS_INFORMATION pi;<br />
<br />
ZeroMemory( &si, sizeof(si) );<br />
si.cb = sizeof(si);<br />
ZeroMemory( &pi, sizeof(pi) );<br />
<br />
if( !CreateProcess( NULL,
TEXT("MyChildProcess"),
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi )
) <br />
{<br />
printf( "CreateProcess failed (%d).\n", GetLastError() );<br />
return;<br />
}<br />
<br />
WaitForSingleObject( pi.hProcess, INFINITE );<br />
<br />
CloseHandle( pi.hProcess );<br />
CloseHandle( pi.hThread );<br />
}<br />
|
|
|
|
|
mpapeo wrote:
can you run this code from the command line
Yes, why?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Well im having problems with the below code in the bold and italic line, because i don't want to hardcode the process which i want to create (mychildprocess). I want it to be one of the commandline arguments.
[code]
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line).
TEXT("MyChildProcess"), // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
[/code]
So what can i replace TEXT with?
oam
|
|
|
|
|
mpapeo wrote:
Well im having problems...
Meaning what?
mpapeo wrote:
if( !CreateProcess( NULL, // No module name (use command line).
TEXT("MyChildProcess"), // Command line.
Per MSDN:
The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space-delimited token in the lpCommandLine string.
You've not specified a valid module name for the lpCommandLine parameter.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
I dont understand that, if i specify the MyChildProcess as the commandline argument it execute correctly, but then if another process which has not been specified there it doesn't execute it but instead it still execute the hardcoded one.
And what should i specify for the lpCommandLine parameter?
oam
|
|
|
|
|
Ive solve it by putting argv[]
oam
|
|
|
|
|
hello,
I have created an application that works fine for WIndows I want to port this application to MAC how can I do this
|
|
|
|
|
hello,
I have created an application that works fine on Windows .How can I port this application for MAC
|
|
|
|
|
To answer the topic question, no I don't believe Visual Studio can compile for Mac execution. It may be a hidden feature but not one I'm aware of. Given MS dislike for Apple I don't imagine they'd make software that can support Apple hardware.
For a little side note lesson, one which you may already know, the main reason program execution can't be directly taken from one machine to another ( Intel -> Apple, Apple -> Alpha, etc ) is because of the CPU architechture. The CPU internals just work differently which is why code needs to be ported rather than just copied over.
If you're using ANSI standard C++ ( nothing unique to .NET, Windows environment, DirectX, etc ) all you need to do is copy the the source code and build it on a Mac with a C++ development suite. I'm not familiar with Mac development so I can't recommend a good Mac IDE. Being as .cpp and .h files are just strict ASCII text files they're universally recognizable so you should be able to just copy them straight across.
If you are using Windows unique code, DirectX, or anything like that, you'll have to replace those sections with Mac compliant code. As far as I know there's no way around this.
The question "Do computers think?" is the same as "Can submarines swim?"
Signature Red Studios
Jeryth
|
|
|
|