与checksum的发送方和接收方有问题。在这里,我使用结构来定义要写入管道的变量。
struct ANSWER { int arr[BUFFER]; int counter; int ans; }a;
用于checksum的机制是:
int chck(int value[],int count) { int i,sum=0,checksum; for ( i=0; i<count; i++) { sum+=value[i]; } printf("SUM IS :%d \n",sum); checksum=checksum^sum; printf("CHECKSUM IS : %d",checksum); return checksum; }
主要问题是在管道中写入
write(pipe,a,sizeof(a));
这将使用struct写入所有包含。
在接收端检索特定值时出现问题
当我检索接收端的值时,会在count和ans变量中得到错误的值。
read(pipe,a,sizeof(a)); printf("COUNT : \n ",a.counter);
结果发现这些值是乱七八糟的。
主要区域:
void main(int argc, char * argv[]) { int pipe,i; pipe = open("devil",O_WRONLY); if ( pipe == -1 ) { printf("ERROR NO PIPE FOUND \n"); } printf("ENTER NUMBER OF ELEMENT : "); scanf("%d",a.counter); for ( i=0; i<a.counter; i++) { printf("ENTER NUMBER :"); scanf("%d",&a.arr[i]); } a.ans=chck(a.arr,a.counter); printf("CHECKSUM IS : %d \n",a.ans); write(pipe,&a,sizeof(a)); }
最佳答案
我建议您将错误检查添加到所有系统和标准库调用(打印到stdout/stderr除外,这比几乎任何应用程序都要复杂),比如:
int main(int argc, char * argv[]) { int pipe, i; pipe = open("devil",O_WRONLY); if ( pipe == -1 ) { perror("open pipe"); return EXIT_FAILURE; } printf("ENTER NUMBER OF ELEMENT : "); if (scanf("%d",&a.counter) != 1) { fprintf(stderr, "scanf count IO or parse error, or EOF\n"); return EXIT_FAILURE; } for ( i=0; i<a.counter; i++) { printf("ENTER NUMBER :"); if (scanf("%d",&a.arr[i]) != 1) { fprintf(stderr, "scanf number IO or parse error, or EOF\n"); return EXIT_FAILURE; } } a.ans=chck(a.arr,a.counter); printf("CHECKSUM IS : %d \n",a.ans); i = write(pipe,&a,sizeof(a)); if (i == -1) { perror("write to pipe"); return EXIT_FAILURE; } else if (i != sizeof(a)) { fprintf(stderr, "write to pipe, partial write!\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
注意:对于迂腐的代码,write实际上返回类型ssize_t。根据标准的要求,我将main的返回类型更改为int。请阅读perror的手册页/文档,了解它的功能和如何打印实际错误消息。EXIT_FAILURE和是两个标准定义的返回值或退出代码的常量,通常分别为1和0。在一个更大的程序中,您可能会编写用于错误处理的帮助函数或宏,并将整个主函数拆分为多个函数,以使代码看起来不那么混乱。
另外,在EXIT_SUCCESS函数中使用未初始化的checksum变量。您可能应该将其初始化为0,如下所示:
int chck(int value[],int count) { int i = 0, sum = 0, checksum = 0; ....
一般来说,您应该避免使用未初始化的变量,在第一次使用它们时很容易忘记,如这里所示。。。另外,打开编译器警告,这样,如果仍然意外地这样做,通常会收到警告。
还有一个错误:第一次扫描丢失了chck以获取指向&的指针(需要a.counter才能实际修改原始变量)。一个好的编译器也可能足够聪明,能够警告将可疑参数传递给scanf。