2

プログラムの開発は、次の問題の1つであるIPCメカニズムを使用して実行されます。方法-「チャネル」。正方行列の行列式の計算を、低次の行列式に展開して実装します。「マスター」プロセスはジョブ「ドリブン」プロセスを送信しますが、後者は決定要因の計算を実行してから、メインプロセスの結果を計算します。つまり、パイプ関数を使用する必要があります。私は動作中のプログラムを持っていますが、IPCメカニズムがありません。パイプの機能とその仕組みについてはわかりません。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int determinant(int n, double mat[n][n])
{
    int i,j,i_count,j_count, count=0;
    double array[n-1][n-1], det=0;
    if(n==1) return mat[0][0];
    if(n==2) return (mat[0][0]*mat[1][1] - mat[0][1]*mat[1][0]);

    for(count=0; count<n; count++)
    {
        i_count=0;
        for(i=1; i<n; i++)
        {
            j_count=0;
            for(j=0; j<n; j++)
            {
                if(j == count) continue;
                array[i_count][j_count] = mat[i][j];
                j_count++;
            }
            i_count++;
        }
        det += pow(-1, count) * mat[0][count] * determinant(n-1,array);
    }
    return det;
}

int main()
{
    int i, j, dim;
    printf("Enter n\n");
    scanf("%d", &dim);
    double matrix[dim][dim];
    printf("Enter matrix:\n");
    for(i = 0; i < dim; i++)
    {
        for(j = 0; j < dim; j++)
        {
            scanf("%lf \n", &matrix[i][j]);
        }
    }
    double x = determinant(dim, matrix);
    printf("Determinant = %g\n", x);
    return 0;
}
4

1 に答える 1

1

いくつかの注意事項:パイプは単方向であり、プロセスは書き込みを行い、プロセスは読み取りを行います。したがって、パイプを開始するときに、プロセスがパイプから読み取る場合は、パイプの書き込み側を閉じる必要があります。そうしないと、データを送信するリスクがあります。代わりに、他のプロセスに送信します。パイプはfork()の前に開始でき、子プロセスはパイプを継承します(pidを除くスタック全体を継承します)。
この例では、親プロセスが入力で行列を要求し、それを子プロセスに送信し、子プロセスが行列式を計算して画面に出力します。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include <unistd.h>

int determinant(int n, double mat[n][n])
{
    int i,j,i_count,j_count, count=0;
    double array[n-1][n-1], det=0;
    if(n==1) return mat[0][0];
    if(n==2) return (mat[0][0]*mat[1][1] - mat[0][1]*mat[1][0]);

    for(count=0; count<n; count++)
    {
        i_count=0;
        for(i=1; i<n; i++)
        {
            j_count=0;
            for(j=0; j<n; j++)
            {
                if(j == count) continue;
                array[i_count][j_count] = mat[i][j];
                j_count++;
            }
            i_count++;
        }
        det += pow(-1, count) * mat[0][count] * determinant(n-1,array);
    }
    return det;
}

int main()
{
    int i, j, dim;
    int fd[2];
    pipe(fd);
    pid_t pid=fork();
    if(pid)
    {
        // Father process
        close(fd[0]); // close the reading side of the pipe
        char buffer[100];
        printf("Enter n\n");
        fgets(buffer,100,stdin);
        dim=atoi(buffer);        // gets a float with atof
        double matrix[dim][dim];
        printf("Enter matrix:\n");
        for(i = 0; i < dim; i++)
        {
            for(j = 0; j < dim; j++)
            {
                fgets(buffer,100,stdin);
                matrix[i][j]=atof(buffer);
            }
        }
        write(fd[1],&dim,sizeof(double));  // write the size of the matrix
        write(fd[1], matrix, dim*dim*sizeof(double));  // write the matrix
        close(fd[1]);
    }
    else
    {
        // Child process
        close(fd[1]);  // close the writing side of the pipe
        int dim;
        read(fd[0], &dim, sizeof(double)); // read the dimension
        double matrix[dim][dim];  // read the matrix
        read(fd[0], matrix, dim*dim*sizeof(double));
        printf("%d",determinant(dim, matrix));
        close(fd[0]);
    }
    return 0;
}

重要:サイズが負の場合は、セグメンテーション違反などが発生している可能性があるため、dimが許容値であることもテストしてください。

例では、scanfが好きではないため、fgetsを使用しました。これにより、バッファーのクリアに問題が発生します。残念ながら、バッファーをクリアする方法はシステムによっても異なりますが、fflush(stdin)はWindowsでうまく機能しますが、Linuxでは訴える必要があります。別の方法。入力バッファをクリーンアップできる場合は、scanfを自由に使用できます。

于 2012-11-05T13:06:07.460 に答える