Re: [Newbie] Problems compiling ascii pfiles

From: Patrick Dughi (dughi@imaxx.net)
Date: 05/19/00


On Fri, 19 May 2000, Zednanreh Solo wrote:

> I'm having a problem with ascii pfiles that hasn't been brought up yet. I
> fixed up diskio.c with no problems. I'm usinv MSVC++6 with Oasis 2.x and bpl
> 17. Heres the only error:
>
> db.c
> c:\circle30bpl17\src\db.c(2202) : error C2106: '=' : left operand must be
> l-value
>
>       case 'N':
>         if(!strcmp(tag, "Name"))
> //              GET_NAME(ch) == line;
> //              strcpy(GET_NAME(ch), line);
>                 GET_NAME(ch) = str_dup(line);  // <------------
>         break;

        The line you point to is fine. However, this code demonstrates a
fundamental misunderstanding of c programming, aside from memory usage and
others.
        As a learning experience, lets go though it step by step.

1       case 'N':
2         if(!strcmp(tag, "Name"))
3               GET_NAME(ch) == line;
4               strcpy(GET_NAME(ch), line);
5               GET_NAME(ch) = str_dup(line);
6         break;


        1.  This line is fine; it's correctly closed @ line 6.
        2.  This line is also correct, strcmp returns 0 if the match is
equal - so checking for !strcmp() means it will show up as true if it
matches "Name" - but lets look at the rest of this; you've used indenting
as if it is what delimits an 'if' block.

        lines 3-5, you have indented them - now.. what really happens
instead of having those in your one brace, what you have is:

        if(!strcmp(tag,"Name")) {
          GET_NAME(ch) == line;
        }
        strcpy(GET_NAME(ch),line);
        GET_NAME(ch)=str_dup(line);

        Those bottom two lines will be executed for EVERY match to the 'N'
case - ie, every field that has the first letter of 'N'.  Bad move chum.

        Now, lets take that first line - 3 - the one that actually is in
the 'if' block.  It's "GET_NAME(ch) == line;".  That's it.  This line
doesn't do anything.  It will most likely evaluate to 0.  You just
performed an eval; this is a test.. 1 or 0.  Usually, these are used in
'if' statments.  Yours is not. It does nothing.

        Okay, now, lets take line 4.  It actually could be correct.  Of
course, it isn't.  See, strcpy copies a string from a source to a
destination.  It does not however (like str_dup/strdup), allocate memory.
So, this will give you odd errors as you follow the dangling pointer and
write into never-neverland.  No one could really say what it does exactly.
But it's probably bad if you didn't intend it to deliberately mess up
things.

        Good news. Line 5 is kosher. It should probably be the one (and
only) thing within the if braces.  It's also what you want.

                                                PjD


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     |  http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html  |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 04/10/01 PDT