好的,首先我将从一些背景开始。我正在为一个涉及客户端和服务器的类做一个项目。它们是两个独立的进程,通过我们所称的请求通道相互通信。
客户端收集请求数、请求通道缓冲区大小以及发送请求的工作线程数(分别为-n、-b和-w)的命令行参数。
用户想要多少工作线程就是我必须在客户端和服务器之间创建多少请求通道。
RequestChannel *channel;
int main(int argc, char * argv[])
{
char *n=NULL, *b=NULL, *w=NULL;
int num, buf, workers;
char optchar=0;
while((optchar=getopt(argc,argv,"n:b:w:"))!=-1)
switch(optchar)
{
case 'n':
n=optarg;
break;
case 'b':
b=optarg;
break;
case 'w':
w=optarg;
break;
case '?':
break;
default:
abort();
}
num=atoi(n);
buf=atoi(b);
workers=atoi(w);
channel=malloc(workers*sizeof(RequestChannel));
cout << "CLIENT STARTED:" << endl;
pid_t child_pid;
child_pid = fork();
if(child_pid==0)
{
execv("dataserver", argv);
}
else
{
cout << "Establishing control channel... " << flush;
RequestChannel chan("control", RequestChannel::CLIENT_SIDE);
cout << "done." << endl;
for(int i=0;i<workers;i++)
RequestChannel channel[i](chan.send_request("newthread"), RequestChannel::CLIENT_SIDE);
}
}
我在malloc
行遇到编译错误,我不知道问题出在哪里。我只想能够像访问channel[i]
一样访问每个RequestChannel
。
现在的情况是,我收到一个错误,说
从
void*
到RequestChannel*
的转换无效
当我用sizeof(*RequestChannel)
替换sizeof(RequestChannel)
时,我收到一个错误,说
在")"标记之前应为主表达式。
malloc行是正确的(但请检查它是否返回NULL)。C++编译器(而不是C)会抱怨,因为在C++中您需要一个类型转换:
channel = static_cast<RequestChannel *>malloc(...);
或者,使用C语法:
channel = (RequestChannel*) malloc(...);
除了编译器错误,还有逻辑错误。
例如,您应该为每个对象显式调用构造函数来创建它们。但你只是为他们分配空间,然后就使用它。这会导致非常奇怪的错误。
另外,不要忘记调用析构函数。无论如何,为什么不使用new运算符呢?