【问题标题】:passing 2D Array to recursion将二维数组传递给递归
【发布时间】:2017-08-05 18:44:53
【问题描述】:

我正在尝试在 C 中使用 fork 进行计算。 我有一个包含成员 {1,2,3,4} 的二维数组,我有一个函数可以为数组中的每个成员获取平方。我将使用子进程调用此函数。 例如对于 3 个子进程输出将是这样的;

1.Child
1 4
9 16
----------
2.Child
1 16
81 256
----------
3.Child
1 256
6561 65536

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int matrix[2][2] = {1, 2, 3 ,4 }  ;

int main(){
forkFork(3);
}

void forkFork(int counter)
{
    pid_t pid;
    if(counter == 0)
    {
        exit(0);
    }
    if(counter > 0)
    {
        if ((pid = fork()) < 0)
        {
            perror("fork error :(");
        }
        else if (pid == 0)
        {
            matrixPower(matrix);
            print(matrix);
        }
        else if(pid > 0)
        {
            forkFork(counter - 1);
        }
    }
}

void matrixPower(int m[2][2])
{
    int i,j,k;
    int result = 0;

    for (i = 0; i < 2; i++)
    {
        for (j = 0; j < 2; j++)
        {
            result =  matrix[i][j]*matrix[i][j];

            m[i][j] = result;
            result = 0;
        }
    }
}

void print(int a[2][2])
{
    int row, col ;
    for(  row = 0; row < 2; row++ )
    {
        for(  col = 0; col < 2 ; col++ )
        {
            printf("%d\t", a[row][col]);
        }
        puts("");
    }

        printf("-------------------------------\n");
}

我找不到将新数组传递给递归函数的方法...

【问题讨论】:

  • 将数组作为参数通过forkFork 函数有什么问题?
  • 它没有传递新值;例如,在第一次调用 forkFork 时,矩阵数组更改为 {1,4,9,16} 在第二次进程调用(使用递归)中,我试图将 {1,4,9,16} 传递给 forkFork 函数,但它的使用旧值 {1,2,3,4}
  • 我发现了问题并在下面提供了解决方案。
  • 你是否故意让你的程序尽可能低效?如果没有,请忘记 fork 并忘记递归。

标签: c recursion multidimensional-array


【解决方案1】:

您的解决方案的问题是所有分叉进程都是由主/父进程创建的。因此,每个分叉的进程只继承父进程的地址空间,其矩阵值总是{1,2,3,4}。解决方案是为每个修改进程创建其子进程。因此,一个新的子进程继承了修改后的矩阵。

请参阅下面的forkFork 函数解决方案,该函数按预期工作。

void forkFork(int counter)
{
    pid_t pid;
    if(counter == 0)
    {
        exit(0);
    }
    if(counter > 0)
    {
        if ((pid = fork()) < 0)
        {
            perror("fork error :(");
        }
        else if (pid == 0)
        {
            matrixPower(matrix);
            print(matrix);
            forkFork(counter - 1);
        }
    }
}

【讨论】:

  • 顺便说一句,使用管道将矩阵从父级传递给子级是否合适?
  • kln 我不明白你为什么要为这个小例子生成进程。如果你是为了学习而做的,我认为尝试管道是一个很好的练习。这里有一个很好的起点:stackoverflow.com/q/16133464/1952879
猜你喜欢
  • 2021-01-07
  • 2020-11-01
相关资源
最近更新 更多