0

わかりました、まず背景から始めます。クライアントとサーバーを含むクラスのプロジェクトに取り組んでいます。これらは、リクエスト チャネルと呼ばれるものを介して相互に通信する 2 つの別個のプロセスです。

クライアントは、要求の数、要求チャネルのバッファーのサイズ、および要求を送信するワーカー スレッドの数 (それぞれ -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)、次のエラーが表示されます

')' トークンの前にプライマリ式が必要です。

4

2 に答える 2

0

malloc行は正しいです(ただし、NULLが返されるかどうかを確認してください)。C ++ではキャストが必要なため、C ++コンパイラ(Cではない)は文句を言います。

channel = static_cast<RequestChannel *>malloc(...);

または、C構文の場合:

channel = (RequestChannel*) malloc(...);
于 2012-07-22T00:32:43.567 に答える
0

コンパイラエラーの他に、論理エラーもあります。

たとえば、オブジェクトを作成するには、すべてのオブジェクトに対してコンストラクターを明示的に呼び出す必要があります。しかし、あなたは彼らのためにスペースを割り当てて、それを使うだけです。非常に奇妙なエラーが発生します。

また、デストラクタを呼び出すことを忘れないでください。とにかく、新しい演算子を使ってみませんか?

于 2012-07-22T00:38:26.463 に答える