gpt4 book ai didi

计算 N 次幂之和

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:56 24 4
gpt4 key购买 nike

这个程序应该计算 2^1+2^2 + ... + 2^10 的值:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <math.h>

#define N 10

// sommatoria per i che va da 1 a N di 2^i, ogni processo calcola un singolo valore

int main(int argc, char** argv)
{
pid_t figli[N];
unsigned int i;
int status;
int fd[N][2];
int msg1=0,msg2;
int risultato=0;
bool padre=true;
for(i=0;i<N && padre;i++)
{
pipe(fd[i]);
figli[i]=fork();
if(figli[i]<0)
{
fprintf(stderr,"Una fork ha fallito\n");
}
else if(figli[i]==0)
{
padre=false;
}
else
{
msg1=i+1;
write(fd[i][1],&msg1,sizeof(int));
}
}
if(!padre)
{
read(fd[i][0],&msg2,sizeof(int));
msg2=pow(2.0,msg2);
write(fd[i][1],&msg2,sizeof(int));
exit(0);
}
else
{
for(i=0;i<N;i++)
{
read(fd[i][0],&msg2,sizeof(int));
risultato+=msg2;
}
}
if(padre)
fprintf(stderr,"%d\n",risultato);
return 0;
}

但是当ie执行程序时,父进程打印55。为什么?

最佳答案

有趣的是,55 是从 1 到 10 的所有数字的总和:这应该会给您一个即时线索:

pipe() creates a pipe, a unidirectional data channel that can be used for interprocess communication. The array pipefd is used to return two file descriptors referring to the ends of the pipe. pipefd[0] refers to the read end of the pipe. pipefd[1] refers to the write end of the pipe.

请注意:单向。换句话说,padre 正在读回它写入的相同值(因此是 55)。

您通常为双向流量设置两个管道,每个方向一个。所以我将管道的数量增加了一倍,使用偶数的管道用于父子关系,使用奇数的管道用于另一个方向。

此外,您的 child 继续 padre 循环,而他们应该立即退出该循环,这样他们的值 i是正确的。您确实有基于 padre 的循环导出但这发生在之后 i已经改变。您可以在设置的位置中断 padre错误或简单地 i--if(!padre)位恢复 i到这个 child 的正确值。我做了后者。

以下代码(带有显示更改内容的标记)工作正常:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <math.h>

#define N 10

int main(int argc, char** argv)
{
pid_t figli[N];
unsigned int i;
int status;
int fd[N*2][2]; // CHANGED: two unidirectional pipes
int msg1=0,msg2;
int risultato=0;
bool padre=true;
for(i=0;i<N && padre;i++)
{
pipe(fd[i*2]);
pipe(fd[i*2+1]); // ADDED: create second pipe
figli[i]=fork();
if(figli[i]<0)
{
fprintf(stderr,"Una fork ha fallito\n");
}
else if(figli[i]==0)
{
padre=false;
}
else
{
msg1=i+1;
write(fd[i*2][1],&msg1,sizeof(int)); // CHANGED: pipe number
}
}
if(!padre)
{
i--; // ADDED: to restore i for the child
read(fd[i*2][0],&msg2,sizeof(int)); // CHANGED: pipe number
msg2=pow(2.0,msg2);
write(fd[i*2+1][1],&msg2,sizeof(int)); // CHANGED: pipe number
exit(0);
}
else
{
for(i=0;i<N;i++)
{
read(fd[i*2+1][0],&msg2,sizeof(int)); // CHANGED: pipe number
risultato+=msg2;
}
}
if(padre)
fprintf(stderr,"%d\n",risultato);
return 0;
}

这会生成 2046 的正确答案,因为 2<sup>0</sup> + 2<sup>1</sup> + ... 2<sup>10</sup> = 2<sup>11</sup> - 1并且,由于您遗漏了二到零项(等于 1):2<sup>1</sup> + 2<sup>2</sup> + ... 2<sup>10</sup> is 2<sup>11</sup> - 2 (2<sup>11</sup> = 2048) .

关于计算 N 次幂之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com