0

システムは: Linux/CentOS 6.4

スコープで宣言されていない関数に対してエラーが発生し続けます。別の関数内で関数を呼び出すことは違法ですか? 関数に関する記事を読んで、関数を呼び出すときに関数を void と宣言する必要があるためだと思ったのですが、新しいエラーが発生しました。それらをグローバルに宣言する必要があるかどうかはわかりません。

client.cpp:32: エラー: 'takef' はこのスコープで宣言されていません

client.cpp:33: エラー: 'putf' はこのスコープで宣言されていません

client.cpp: 関数 'void takef(int&)' 内:

client.cpp:44: エラー: 'testa' はこのスコープで宣言されていません

client.cpp: 関数 'void putf(int&)' 内:

client.cpp:70: エラー: 'test' はこのスコープで宣言されていません

実装しようとしているコードのタイプの例

sem_t mutex;
sem_t S;
char buffer[1024];
void error(const char *msg)
{
    perror(msg);
    exit(0);
}
/*void signal_callback_handler()
    {
        close(sockfd);

    }*/


    void father(int &sockfd)
    {
        while(1)
        {
            srand(time(NULL));
            int ms= rand() % 2000 + 5000
            send(sockfd, DATA, strlen(DATA), 0);
            usleep(1000*ms);
            takef(sockfd);
            putf(sockfd);
        }

    }

    void takef(int &sockfd)
    {

    *
    *
    *  *Other code*
    *
    *
    *
        testa(sockfd);

    *  *Other code*
    *
    *
    *
    }


    void testa(int &sockfd)
    {
    *
    *
    *
    *  *Other code*
    *
    *
    *

    }

    void putf(&sockfd)
    {
    *
    *
    *
    *  *Other code*
    *
    *
    *
    test();
    test();
    sem_post(&mutex);

   }

int main(int argc, char *argv[])
{
    *
    *
    *
    *  *Other code*
    *
    *
    *
    father(sockfd);

    return 0;

}
4

2 に答える 2

2

簡単な修正。関数定義を void Father() 関数の上に移動します。

コード内

sem_t mutex;
sem_t S;
char buffer[1024];
void error(const char *msg)
{
 perror(msg);
 exit(0);
}

/*void signal_callback_handler()
{
    close(sockfd);

}*/

   void takef(int &sockfd)
{

*
*
*  *Other code*
*
*
*
    testa(sockfd);

*  *Other code*
*
*
*
}


void testa(int &sockfd)
{
*
*
*
*  *Other code*
*
*
*

}

void putf(&sockfd)
{
*
*
*
*  *Other code*
*
*
*
test();
test();
sem_post(&mutex);

}



void father(int &sockfd)
{
    while(1)
    {
        srand(time(NULL));
        int ms= rand() % 2000 + 5000
        send(sockfd, DATA, strlen(DATA), 0);
        usleep(1000*ms);
        takef(sockfd);
        putf(sockfd);
    }

}


int main(int argc, char *argv[])
{
*
*
*
*  *Other code*
*
*
*
father(sockfd);

return 0;

}

または、以下で説明する別の方法として、関数プロトタイプを作成することもできます。これは、ヘッダー ファイルに関数のプロトタイプを記述し、.cpp ファイルで関数を定義する方法に似ています。関数プロトタイプは本体のない関数であり、関数が存在するがまだ定義されていないことをコンパイラに知らせます。

これはプロトタイピングを使用した例です

sem_t mutex;
sem_t S;
char buffer[1024];
void error(const char *msg)
{
    perror(msg);
    exit(0);
}
/*void signal_callback_handler()
{
    close(sockfd);

}*/

// Prototypes
void takef(int &sockfd);
void testa(int &sockfd);
void putf(&sockfd);

void father(int &sockfd)
{
    while(1)
    {
        srand(time(NULL));
        int ms= rand() % 2000 + 5000
        send(sockfd, DATA, strlen(DATA), 0);
        usleep(1000*ms);
        takef(sockfd);
        putf(sockfd);
    }

}

void takef(int &sockfd)
{

*
*
*  *Other code*
*
*
*
    testa(sockfd);

*  *Other code*
*
*
*
}


void testa(int &sockfd)
{
*
*
*
*  *Other code*
*
*
*

}

void putf(&sockfd)
{
*
*
*
*  *Other code*
*
*
*
test();
test();
sem_post(&mutex);

}

int main(int argc, char *argv[])
{
*
*
*
*  *Other code*
*
*
*
father(sockfd);

return 0;

}
于 2013-08-02T21:48:56.127 に答える