Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > scoping issue

Reply
Thread Tools

scoping issue

 
 
Frederick Grim
Guest
Posts: n/a
 
      09-12-2003
okay so the code in question looks like:

namespace util {
template<typename C> inline void mmapw(C *& ptr, size_t length, int prot,
int flags, int fd, off_t offset) {

if((ptr = (C*)mmap(NULL,length,prot,flags,fd,offset)) == NULL) {
err_mesg("mmap failed");
exit(EXIT_FAILURE);
}
return;
}
// more wrappers

}

namespace Parser {

// lot of stuff

class XMLRobot : public ost::XMLStream {

private:
// Data types and private functions for parsing

// tons of decs

unsigned char *xml_string;

public:

// Constructors

XMLRobot(void);
// XMLRobot can either be instantiated with a file or a string of XML data
// However the constructors need to be very different as we need an explicit length
// For the time when a string is passed;

XMLRobot(const char *);
XMLRobot(unsigned char*, int);
XMLRobot(const XMLRobot&);

XMLRobot& operator=(const XMLRobot& b) {
this->name2movementmap = b.name2movementmap;
this->addlist = b.addlist;
this->is_file = b.is_file;
}

bool got_state_req(void) const { return get_state; }
void Close(void);
int Read(unsigned char*, int);
// tons more code
};

XMLRobot::XMLRobot(const char *filen):is_file(true),get_state(false),b_read(0){


int fd = util:penw(filen, O_RDONLY);
struct stat fs;

util::fstatw(fd, &fs);
util::mmapw<unsigned char>(this->xml_string, fs.st_size, PROT_READ,MAP_SHARED, fd, 0);
this->t_bytes = fs.st_size;
this->xml_file = filen;

init_perf_hash();
util::closew(fd);

}

int XMLRobot::Read(unsigned char* buf, int len) {

if(this->b_read + len > this->t_bytes) {
int amt = this->t_bytes - this->b_read;
unsigned char *ptr = this->xml_string + this->b_read;

for(int i = 0; i < amt; i++, ptr++, buf++) { *buf = *ptr; }

this->b_read = this->t_bytes;
return amt;

} else {
std::cout << (const char*)this->xml_string << "\n";
unsigned char *ptr = this->xml_string;
ptr += this->b_read;
for(int i = 0; i < len; i++, ptr++, buf++) { *buf = *ptr; }

this->b_read += len;
return len;
}
}

so the seg fault is in the std::cout line directly above. I hope this makes the problem a bit more clear
as this is slowly driving me nuts. Thanks for the time

Fred

--
Politics is the art of looking for trouble, finding it,
misdiagnosing it, and then misapplying the wrong remedies.
Groucho Marx
 
Reply With Quote
 
 
 
 
Ron Natalie
Guest
Posts: n/a
 
      09-12-2003

"Frederick Grim" <(E-Mail Removed)> wrote in message news:jUm8b.3$(E-Mail Removed)...
> okay so the code in question looks like:
>


I don't know wh at scoping has to do with this problem.


> std::cout << (const char*)this->xml_string << "\n";


If I understand what the rest of your code does, xml_string points to a memory
mapped piece of file. What makes you think that you will encounter a null before
you run off the end of the end of the mapping.

You're going to have to use cout.write or something similar to write exactly the
number of characters that you know are there (either len which you never check
for validity or fs.st_size you used in the constructor).


 
Reply With Quote
 
 
 
 
Gianni Mariani
Guest
Posts: n/a
 
      09-12-2003
Frederick Grim wrote:
> okay so the code in question looks like:
>
> namespace util {


..... code that does not compile ... snipped


> }
>
> so the seg fault is in the std::cout line directly above. I hope this makes the problem a bit more clear
> as this is slowly driving me nuts. Thanks for the time
>


The code below compiles and runs. The problem you're looking for is not
here, like I said in my last post. Your object is getting corrupted.

From this point on, this is OT for this group.

Strong suggestion, next time you post a snippet of code, take the time
to debug it and compile it yourself.

Here is the code, all compilable and runs just fine. I had to take a
few guesses as to what missing members were and they're not initialized
and I'm sure it's wrong, but the part of the code that you seem to be
concerned about is working fine (without close inspection - since it
seems to work fine !).

I used gcc 3.3.1 and Linux 2.4.20-epoll (patched with epoll support).

I suggest you try running the code you have with efence or valgrind
(preferably valgrind). You might (likely) get lucky and get a few
choice error messages that will show you how the object is getting
corrupted.

(I feel like I should be charging for consulting services here). You
have other problems - there are some better practices. You should try
to hide low level functionality behind classes. It's a bit of a
mish-mash of code - XML parsing and mmapping need not be mixed at the
same time, mmap is far too low level. What do you think this util
library does for you ? OK OK. I'm not trying to pick on you. Just
giving some hints on making your life easier.


G


#include <unistd.h>
#include <sys/mman.h>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


namespace util {
template<typename C> inline void mmapw(C *& ptr, size_t length, int prot,
int flags, int fd, off_t offset) {

if((ptr = (C*)mmap(NULL,length,prot,flags,fd,offset)) == NULL) {
perror("mmap failed");
exit(EXIT_FAILURE);
}
return;
}
// more wrappers

}


namespace ost
{


class XMLStream
{
public:

};

}

namespace Parser {

// lot of stuff

class XMLRobot : public ost::XMLStream {

private:
// Data types and private functions for parsing

// tons of decs
char * name2movementmap;
char * addlist;
bool is_file;
bool get_state;
int b_read;

int t_bytes;
const char * xml_file;
unsigned char *xml_string;

public:

// Constructors

XMLRobot(void);
// XMLRobot can either be instantiated with a file or a string
of XML data
// However the constructors need to be very different as we
need an explicit length
// For the time when a string is passed;

XMLRobot(const char *);
XMLRobot(unsigned char*, int);
XMLRobot(const XMLRobot&);

XMLRobot& operator=(const XMLRobot& b) {
this->name2movementmap = b.name2movementmap;
this->addlist = b.addlist;
this->is_file = b.is_file;

return * this;
}

bool got_state_req(void) const { return get_state; }
void Close(void);
int Read(unsigned char*, int);
// tons more code
};

XMLRobot::XMLRobot(const char
*filen):is_file(true),get_state(false),b_read(0){


int fd = open(filen, O_RDONLY);
struct stat fs;

if ( fd < 0 )
{
perror( "can't open file" );
throw( "Can't open" );
}

fstat(fd, &fs);
util::mmapw<unsigned char>(this->xml_string, fs.st_size,
PROT_READ,MAP_SHARED, fd, 0);
this->t_bytes = fs.st_size;
this->xml_file = filen;

// init_perf_hash();
close(fd);

}

int XMLRobot::Read(unsigned char* buf, int len) {

if(this->b_read + len > this->t_bytes) {
int amt = this->t_bytes - this->b_read;
unsigned char *ptr = this->xml_string + this->b_read;

for(int i = 0; i < amt; i++, ptr++, buf++) { *buf = *ptr; }

this->b_read = this->t_bytes;
return amt;

} else {
std::cout << (const char*)this->xml_string << "\n";
unsigned char *ptr = this->xml_string;
ptr += this->b_read;
for(int i = 0; i < len; i++, ptr++, buf++) { *buf = *ptr; }

this->b_read += len;
return len;
}
}

} // end namespace



int main()
{

Parser::XMLRobot a( "jnk" );

unsigned char buf[10];

a.Read( buf, sizeof( buf ) );

std::cout << std::string( buf, buf+10 ) << "\n";

}

 
Reply With Quote
 
Frederick Grim
Guest
Posts: n/a
 
      09-13-2003
Gianni Mariani <(E-Mail Removed)> wrote:
> Frederick Grim wrote:
>> okay so the code in question looks like:
>>
>> namespace util {


> .... code that does not compile ... snipped
>


>> }
>>
>> so the seg fault is in the std::cout line directly above. I hope this makes the problem a bit more clear
>> as this is slowly driving me nuts. Thanks for the time
>>


> The code below compiles and runs. The problem you're looking for is not
> here, like I said in my last post. Your object is getting corrupted.


> From this point on, this is OT for this group.


> Strong suggestion, next time you post a snippet of code, take the time
> to debug it and compile it yourself.


How would I know that it seg faults if I hadn't compilied it and spent some time
with a debugger? Moreover as the post should have made clear I left *alot* of
code out. I am not going to ask questions until after I have spent alot of time
trying to figure the problem out for myself. And I only saw fit to bother the
gurus (please do not take this as sarcasm it is not at all) of comp.lang.c++
once I felt as though I had genuinely misunderstood cpp
scoping rules.

> Here is the code, all compilable and runs just fine.


I left out alot of code that
was important to the design of the thing (what there is of a design anyhow)

I had to take a
> few guesses as to what missing members were and they're not initialized
> and I'm sure it's wrong, but the part of the code that you seem to be
> concerned about is working fine (without close inspection - since it
> seems to work fine !).


good enough. I though it looked okay (as in working okay)

> I used gcc 3.3.1 and Linux 2.4.20-epoll (patched with epoll support).


> I suggest you try running the code you have with efence or valgrind
> (preferably valgrind). You might (likely) get lucky and get a few
> choice error messages that will show you how the object is getting
> corrupted.


Good suggestion. Thanks

> (I feel like I should be charging for consulting services here).


Now this is a little insulting don't you think?

You
> have other problems - there are some better practices.


I am aware of that.

You should try
> to hide low level functionality behind classes. It's a bit of a
> mish-mash of code - XML parsing and mmapping need not be mixed at the
> same time, mmap is far too low level.


You know after the consulting services comment I can't imagine as this advice
will really stick with me.

What do you think this util
> library does for you ?


check return values.

OK OK. I'm not trying to pick on you.

sure as hell feels like it.

Just
> giving some hints on making your life easier.


I have never been quite put off by such a post before. I am
not trying to start a flame or start tit-for-tat insulting but I have
participated in any number of technical discussions and I almost never get or
give this sort of patronizing tone from/to others. I know you are taking time
out to help and I deeply appreciate that however if this is the sort of response you
want to give then just ignore my post or cat freds_post > /dev/null. But come
on.

Fred


> G



> #include <unistd.h>
> #include <sys/mman.h>
> #include <iostream>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>



> namespace util {
> template<typename C> inline void mmapw(C *& ptr, size_t length, int prot,
> int flags, int fd, off_t offset) {


> if((ptr = (C*)mmap(NULL,length,prot,flags,fd,offset)) == NULL) {
> perror("mmap failed");
> exit(EXIT_FAILURE);
> }
> return;
> }
> // more wrappers


> }



> namespace ost
> {



> class XMLStream
> {
> public:


> };


> }


> namespace Parser {


> // lot of stuff


> class XMLRobot : public ost::XMLStream {


> private:
> // Data types and private functions for parsing


> // tons of decs
> char * name2movementmap;
> char * addlist;
> bool is_file;
> bool get_state;
> int b_read;


> int t_bytes;
> const char * xml_file;
> unsigned char *xml_string;


> public:


> // Constructors


> XMLRobot(void);
> // XMLRobot can either be instantiated with a file or a string
> of XML data
> // However the constructors need to be very different as we
> need an explicit length
> // For the time when a string is passed;


> XMLRobot(const char *);
> XMLRobot(unsigned char*, int);
> XMLRobot(const XMLRobot&);


> XMLRobot& operator=(const XMLRobot& b) {
> this->name2movementmap = b.name2movementmap;
> this->addlist = b.addlist;
> this->is_file = b.is_file;


> return * this;
> }


> bool got_state_req(void) const { return get_state; }
> void Close(void);
> int Read(unsigned char*, int);
> // tons more code
> };


> XMLRobot::XMLRobot(const char
> *filen):is_file(true),get_state(false),b_read(0){



> int fd = open(filen, O_RDONLY);
> struct stat fs;


> if ( fd < 0 )
> {
> perror( "can't open file" );
> throw( "Can't open" );
> }


> fstat(fd, &fs);
> util::mmapw<unsigned char>(this->xml_string, fs.st_size,
> PROT_READ,MAP_SHARED, fd, 0);
> this->t_bytes = fs.st_size;
> this->xml_file = filen;


> // init_perf_hash();
> close(fd);


> }


> int XMLRobot::Read(unsigned char* buf, int len) {


> if(this->b_read + len > this->t_bytes) {
> int amt = this->t_bytes - this->b_read;
> unsigned char *ptr = this->xml_string + this->b_read;


> for(int i = 0; i < amt; i++, ptr++, buf++) { *buf = *ptr; }


> this->b_read = this->t_bytes;
> return amt;


> } else {
> std::cout << (const char*)this->xml_string << "\n";
> unsigned char *ptr = this->xml_string;
> ptr += this->b_read;
> for(int i = 0; i < len; i++, ptr++, buf++) { *buf = *ptr; }


> this->b_read += len;
> return len;
> }
> }


> } // end namespace




> int main()
> {


> Parser::XMLRobot a( "jnk" );


> unsigned char buf[10];


> a.Read( buf, sizeof( buf ) );


> std::cout << std::string( buf, buf+10 ) << "\n";


> }



--
Politics is the art of looking for trouble, finding it,
misdiagnosing it, and then misapplying the wrong remedies.
Groucho Marx
 
Reply With Quote
 
Gianni Mariani
Guest
Posts: n/a
 
      09-14-2003
Frederick Grim wrote:
> Gianni Mariani <(E-Mail Removed)> wrote:
>


>
> I have never been quite put off by such a post before. I am
> not trying to start a flame or start tit-for-tat insulting but I have
> participated in any number of technical discussions and I almost never get or
> give this sort of patronizing tone from/to others. I know you are taking time
> out to help and I deeply appreciate that however if this is the sort of response you
> want to give then just ignore my post or cat freds_post > /dev/null. But come
> on.
>


What did you find so insulting ?

A) You post a pile of code that does not work.

B) When someone spends the time to make it work, it does not show the
problem you describe.

C) Suggestions are made as to "percieved" problems of the design - in an
effort to give you a better alternative. (In my opinion really is a
problem waiting to happen given that one snippet.)

D) You become put-off ?

Dude. Chill a little. No-one is insulting you - yet (and it won't be
me). Go re-read my post and imagine I had a smile on my face.

Peace
G

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Class-level variables - a scoping issue John Nagle Python 22 10-15-2010 11:50 PM
Setter scoping issue James Golick Ruby 3 10-13-2007 10:47 PM
STL Map Scoping Issue sfncook@gmail.com C++ 12 08-15-2007 11:33 AM
require_gem scoping issue? Pawel Szymczykowski Ruby 1 11-07-2006 05:12 AM
Scoping issue with import James Stroud Python 2 03-01-2005 10:18 AM



Advertisments