【问题标题】:Odd result using loop inside child method in C在C中使用子方法内部循环的奇怪结果
【发布时间】:2014-12-12 06:36:45
【问题描述】:

我正在尝试根据用户想要的数量打印出 Fobonacci 序列。 IE。如果用户输入 5,则输出将为 1,1,2,3,5。所以我在一个普通的 C 程序中设置了一个循环来做到这一点:

for(int m=1; m<=a;m++)
   {
     i = (pow(c, m)-(pow(v, m)))/b;
     printf("%d\n",(int)round(i));
   }

这个 for 循环给了我想要的输出。但是,当我将它放入 fork 方法的子进程时,输出会发生变化。 IE。如果用户输入 5,则输出将为 1,0,2,2,5。为什么是这样?有没有办法解决它?这是我的代码:

#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <math.h>

int var_glb; /* A global variable*/

int main(void)
{
    pid_t childPID;
    double a;
    double c = 1.6180339;
    double v = -0.6190339;
    double b = 2.236067977;
    int i;


    childPID = fork();

    if(childPID >= 0) // fork was successful
    {
        if(childPID == 0) // child process
        {
            printf("\nEnter the first value:");
            scanf("%lf", &a);
            for(int m=1; m<=a;m++)
            {
                i = (pow(c, m)-(pow(v, m)))/b;
                printf("%d\n",(int)round(i));
            }
        }
        else //Parent process
        {
            wait(NULL);

            printf("\nThis is the parent process running");
            return 0;
        }
    }
    else // fork failed
    {
        printf("\n Fork failed, quitting!!!!!!\n");
        return 1;
    }

    return 0;
}

【问题讨论】:

  • 这不是计算斐波那契数的好方法。事实上,你几乎不应该使用浮点算术来计算可以用纯整数算术表示的东西,无论是正确性还是性能。试试double fib = (pow(c, m) - pow(v, m)) / b; printf("%f\n", fib); 看看发生了什么。

标签: c for-loop fork parent-child fibonacci


【解决方案1】:

我会先修正你的括号:i = (pow(c, m)-pow(v, m))/b; 另外你不能指望iint...i 应该是floatdouble

【讨论】:

  • 这就是问题所在:当将该表达式分配给变量i 时,结果将被截断为整数。它需要被四舍五入。
【解决方案2】:

您的问题与分叉无关。如果所有的分叉都被注释掉,程序会产生完全相同的结果,并且一切都在父进程中运行。显然该算法在某些方面是不正确的。

【讨论】:

    【解决方案3】:

    所以我发现问题在于我将变量 i 声明为 int 而不是 double,就像我在另一个应用程序中所做的那样,不过感谢您的帮助,我一定会使用您的所有建议来加强我的代码.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-18
      • 2017-05-19
      • 2016-05-26
      • 1970-01-01
      • 2020-04-21
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多