好的,首先我将从一些背景开始。 我正在为涉及客户端和服务器的类开发一个项目。它们是两个独立的进程,通过我们称之为请求通道的方式相互通信。
客户端收集请求数量,请求通道缓冲区大小以及发送请求的工作线程数(分别为-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
行的编译错误,我不知道问题是什么。我只希望能够像RequestChannel
那样访问每个channel[i]
。
现在的方式,我收到错误说
从
的无效转换void*
到RequestChannel*
当我用sizeof(RequestChannel)
替换sizeof(*RequestChannel)
时,收到错误消息
在')'令牌之前预期的主要表达。
答案 0 :(得分:0)
malloc行是正确的(但请检查它是否返回NULL)。 C ++编译器(而不是C)抱怨,因为在C ++中你需要一个强制转换:
channel = static_cast<RequestChannel *>malloc(...);
或者,使用C语法:
channel = (RequestChannel*) malloc(...);
答案 1 :(得分:0)
除编译器错误外,您还有逻辑错误。
例如,您应该为每个对象显式调用构造函数来创建它们。但是你只需为它们分配空间然后再使用它。这将导致非常奇怪的错误。
另外不要忘记调用析构函数。无论如何,为什么不使用 new 运算符?