Page 1 of 1

Irritating Error...

Posted: Sun May 10, 2009 8:10 pm
by cheesecake
I created a function that draws a title box out of characters and tested it and it worked fine. Then, I put it into the latest version of the OSDev series demo, but every time I try to compile, I get an error from the linker! However, the code works fine if I just stick it in run().

It only generates an error if it is a function...
Here is the code:

Code: Select all

void Title(char* ch)
{
////////////////////////////////////////////////////////////////////////////////
////These are for thick, thin, and medium blocks////////////////////////////////
    int ithin   = 176; char thin   = ithin;
    int imed    = 177; char med    = imed;
    int ithick  = 178; char thick  = ithick;
     // I only knew what the block characters were as integers
     // so I just converted them :)
    int i       = 0;//for all the loops
    int offset  = 0;//to centre the string
    char string[81];//umm... the string...
////////////////////////////////////////////////////////////////////////////////
//Set up the string/////////////////////////////////////////////////////////////
    string[0]=thin; string[1]=med; string[2]=thick;
    for (int t=3; t < 77; t++)
        string[t]=' ';
    string[77]=thick; string[78]=med; string[79]=thin; string[80]='\0';
////////////////////////////////////////////////////////////////////////////////
    for (i=0; i<80; i++)
        DebugPutc(thin);
////////////////////////////////////////////////////////////////////////////////
    DebugPutc(thin);
    for (i=0; i<78; i++)
        DebugPutc(med);
    DebugPutc(thin);
////////////////////////////////////////////////////////////////////////////////
    DebugPutc(thin); DebugPutc(med);
    for (i=0; i<76; i++)
        DebugPutc(thick);
    DebugPutc(med); DebugPutc(thin);
////////////////////////////////////////////////////////////////////////////////
    offset = (74 - strlen(ch)) / 2;
    DebugPutc(thin); DebugPutc(med); DebugPutc(thick);
    for(i=0; i<74; i++)
        DebugPutc(' '); 
    DebugPutc(thick); DebugPutc(med); DebugPutc(thin);
////////////////////////////////////////////////////////////////////////////////
 !!!THIS IS THE PART CAUSING THE PROBLEM!!!
    for(int n=3; n<strlen(ch)+3; n++)
        string[offset+n] = ch[n-3];
    for(i=0; i<80; i++)
		DebugPutc(string[i]);
////////////////////////////////////////////////////////////////////////////////
    DebugPutc(thin); DebugPutc(med); DebugPutc(thick);
    for(i=0; i<74; i++)
        DebugPutc(' '); 
    DebugPutc(thick); DebugPutc(med); DebugPutc(thin);
////////////////////////////////////////////////////////////////////////////////
    DebugPutc(thin); DebugPutc(med);
    for (i=0; i<76; i++)
        DebugPutc(thick);
    DebugPutc(med); DebugPutc(thin);
////////////////////////////////////////////////////////////////////////////////
    DebugPutc(thin);
    for (i=0; i<78; i++)
        DebugPutc(med);
    DebugPutc(thin);
////////////////////////////////////////////////////////////////////////////////
    for (i=0; i<80; i++)
        DebugPutc(thin);
    return; 
}

Re: Irritating Error...

Posted: Sun May 10, 2009 8:23 pm
by Andyhhp
can you paste the linker error please - its much more informative than code on its own

~Andrew

Re: Irritating Error...

Posted: Sun May 10, 2009 8:31 pm
by cheesecake
error LNK2019: unresolved external symbol _memset referenced in function "void __cdecl Title(char *)" (?Title@@YAXPAD@Z)
A:\KRNL32.EXE : fatal error LNK1120: 1 unresolved externals

Re: Irritating Error...

Posted: Sun May 10, 2009 8:44 pm
by Andyhhp
Ahh that makes more sence

What that is doing is the compiler is trying to be cleaver and optimise your code. To do this, its internally calling memset, which you have removed because you are not using the standard C runtime libraries.

What you have to do is turn optimisations off in that area like this:

Code: Select all

#pragma optimize( "", off )
//Some code, in this case your function
#pragma optimize( "", on ) 
That will stop the compiler embedding calls to non-existent functions


I do have a few questions about your code though:

Code: Select all

////These are for thick, thin, and medium blocks////////////////////////////////
    int ithin   = 176; char thin   = ithin;
    int imed    = 177; char med    = imed;
    int ithick  = 178; char thick  = ithick;
What are these doing here? You never use the i_ variables again.

Code: Select all

char string[81];//umm... the string...
Why is this 81 characters long and not 80?

Finally, try and explain whats happens if I call this title funtion with a string of lenght 75 characters

~Andrew

Re: Irritating Error...

Posted: Sun May 10, 2009 8:59 pm
by cheesecake
The _i variables were there because I know what the block (filled square) characters are as an integer (176, 177, 178) but I don't know how to initialize a char to a value that will result in the block being displayed. So, basically, the _i's are just there to be converted into chars...

Re: Irritating Error...

Posted: Sun May 10, 2009 9:05 pm
by Andyhhp
ints, longs, shorts and chars are all integers

the different names just reflect how big the integer is:

Typically they are:
char - 1 byte
short - 2 bytes
int - 4 bytes
long - 4 bytes

therefore, you can simply do

Code: Select all

////These are for thick, thin, and medium blocks////////////////////////////////
    char thin   = 176;
    char med   = 177;
    char thick  = 178;
That will work in exacly the same way, except you have saved 12 bytes of space on your stack!

~Andrew

Re: Irritating Error...

Posted: Sun May 10, 2009 9:11 pm
by cheesecake
Ya, just figured that out. It didn't work the first time I did that because I mistakenly put thin = '176'; med = '177'; thick = '178'; which of course just printed a bunch of 6's, 7's, and 8's :P. Just a bit of a brain fart.

As for your question about strings over 75 chars, it causes Bochs to triple fault... I'll have to fix that...

Re: Irritating Error...

Posted: Sun May 10, 2009 9:20 pm
by Andyhhp
fair enough

Re: Irritating Error...

Posted: Sun May 10, 2009 9:23 pm
by cheesecake
Wow good thing I posted that here... My computer just froze and the source file got corrupted :x . I'd hate to write that whole thing out again... It definitely isn't easy on the eyes.

Re: Irritating Error...

Posted: Sun May 10, 2009 9:48 pm
by cheesecake
Image

The working product! Thanks for the help! :D

Re: Irritating Error...

Posted: Sun May 10, 2009 10:43 pm
by Andyhhp
Hehe - No problem

May I plug the importance of keeping backups?

~Andrew

Re: Irritating Error...

Posted: Wed Dec 15, 2010 11:31 pm
by Hoozim
You need to back up your code after every coding session. I have my OS backed up in several different locations so it is safe.
The routine looks nice, good job. It would be great for a start-up screen. For a great effect, try having it put out block letters for a title.