M
Mad Ant
Hello all.
I have to convert a program from C to C++. The original code used
drivers that were available in C, and now are only available in C++.
Thus, I have the "honour" of converting the code.
There are a couple of areas that are blocking me. I've already taken
care of the rest.
I have a structure that is initialized as soon as it is declared in a
variable :
<<
const struct driver_t beirlistener_driver = {
.name = "beirlistener_driver",
.cfg_ctl = {
.cfg_new = &beirlistener_cfg_new,
.cfg_parse = &beirlistener_cfg_parse,
.cfg_del = &beirlistener_cfg_del,
.cfg_parse_ended = &beirlistener_cfg_parse_end
},
.ctx_ctl = {
.ctx_new = &beirlistener_ctx_new,
.ctx_del = &beirlistener_ctx_del
},
.thread_ctl = {
.run = &beirlistener_run,
.queue_clean = NULL,
.stop = &thread_request_stop_intr
}
};name is, of course, a 'char *'.
cfg_ctl, ctx_ctl and thread_ctl are structures containing pointers to
functions.
The structure contains the necessary functions called to initialize,
un, and destroy/delete a thread. It is used in several different
files, depending on the thread it has to start.
Of course, it would be folly to suppose that it would be accepted as
is in C++. It's not.
The only real solution I could find was to declare a constructor for
the struct (not really elegant, I know), which would receive the
addresses of the functions that are called. So the variable
declaration would be something along the lines of :
<<
const struct driver_t beirlistener_driver = {"beirlistener_driver",
&beirlistener_cfg_new, &beirlistener_cfg_parse, ...};However, I tried declaring it as such ... :
<<
struct driver_t {
char * name;
struct config_ctl_t cfg_ctl;
struct context_ctl_t ctx_ctl;
struct thread_ctl_t thread_ctl;
driver_t(char * cname, int (*fcn)(void **)) {
name = cname;
cfg_ctl.cfg_new = fcn;
}
};... along with the variable declaration as mentioned just above, but
it doesn't work. It doesn't seem to recognize the pointer to a
function in the constructor, since it gives me the following message :
<<
/home/anton/Projects/splusserver3/src/beirlistener.c:90: error: scalar
object ‘beirlistener_driver’ requires one element in initializer
I've done research, but I con't find a solution to this.
Any help anyone can give me to resolve this is very much appreciated.
Thanks all.
Anton
I have to convert a program from C to C++. The original code used
drivers that were available in C, and now are only available in C++.
Thus, I have the "honour" of converting the code.
There are a couple of areas that are blocking me. I've already taken
care of the rest.
I have a structure that is initialized as soon as it is declared in a
variable :
<<
const struct driver_t beirlistener_driver = {
.name = "beirlistener_driver",
.cfg_ctl = {
.cfg_new = &beirlistener_cfg_new,
.cfg_parse = &beirlistener_cfg_parse,
.cfg_del = &beirlistener_cfg_del,
.cfg_parse_ended = &beirlistener_cfg_parse_end
},
.ctx_ctl = {
.ctx_new = &beirlistener_ctx_new,
.ctx_del = &beirlistener_ctx_del
},
.thread_ctl = {
.run = &beirlistener_run,
.queue_clean = NULL,
.stop = &thread_request_stop_intr
}
};name is, of course, a 'char *'.
cfg_ctl, ctx_ctl and thread_ctl are structures containing pointers to
functions.
The structure contains the necessary functions called to initialize,
un, and destroy/delete a thread. It is used in several different
files, depending on the thread it has to start.
Of course, it would be folly to suppose that it would be accepted as
is in C++. It's not.
The only real solution I could find was to declare a constructor for
the struct (not really elegant, I know), which would receive the
addresses of the functions that are called. So the variable
declaration would be something along the lines of :
<<
const struct driver_t beirlistener_driver = {"beirlistener_driver",
&beirlistener_cfg_new, &beirlistener_cfg_parse, ...};However, I tried declaring it as such ... :
<<
struct driver_t {
char * name;
struct config_ctl_t cfg_ctl;
struct context_ctl_t ctx_ctl;
struct thread_ctl_t thread_ctl;
driver_t(char * cname, int (*fcn)(void **)) {
name = cname;
cfg_ctl.cfg_new = fcn;
}
};... along with the variable declaration as mentioned just above, but
it doesn't work. It doesn't seem to recognize the pointer to a
function in the constructor, since it gives me the following message :
<<
/home/anton/Projects/splusserver3/src/beirlistener.c:90: error: scalar
object ‘beirlistener_driver’ requires one element in initializer
I've done research, but I con't find a solution to this.
Any help anyone can give me to resolve this is very much appreciated.
Thanks all.
Anton