2015-12-20 42 views
1

我想編寫一個程序來爲每個變量使用管道乘以兩個矩陣,但是我的代碼無法正常工作。使用管道將兩個矩陣相乘

它有什麼問題?

孩子和父母不一樣;既不是他們的列和行也不是他們的變量。

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

int first[10][10], second[10][10], m[10][10]; 
int r1,r2,c1,c2; 

struct mat 
{ 
int i,j,r; 
}; 

int writer(int fd[],struct mat l) 
{ 
    usleep(300000); 
    close(fd[0]); 
    int y; 
    for(y=0;y<c1;y++) 
    { 
     l.r+=first[l.i][y]*second[y][l.j]; 
    } 
    write(fd[1], &l,sizeof(l)); 
    printf("child [%d][%d] write %d \n " ,l.i,l.j, l.r); 
} 

void reader(int fd[]) 
{ 
    struct mat p; 
    close(fd[1]); 
    read(fd[0],&p,sizeof(p)); 
    printf(" Parent [%d][%d] reads %d \n ",p.i,p.j, p.r); 
    m[p.i][p.j]=p.r; 
    usleep(3000000); 
} 

main功能是:

int main() 
{ 

int a,b,j,i; 
int fd[2]; 
pid_t cp; 
pipe(fd); 
\\read two matrices 

    for(i=0;i<r1;i++) 
    { 
     for(j=0;j<c2;j++) 
     { 
       cp=fork();  
       if(cp==0) 
       { 
        printf("k\n"); 
        struct mat m; 
        m.r=0; 
        m.i=i; 
        m.j=j; 
        writer(fd,m); 
       } 
       if(cp!=0) 
       { 
        sleep(2); 
        reader(fd); 
       }  
     } 
     return 0; 
     sleep(100); 
    } 
} 

回答

1

在功能writer()您的for循環for(y=0;y<c1;y++)讀取c1c1從未初始化。這導致不確定的行爲

3

你的程序遇到的第一個問題是這樣的:在主迴路不運行(嘗試把下面的第一個printf("Entering For Loop") for循環

for(i=0;i<r1;i++) 

這是因爲。 index變量正在與未初始化的r1進行比較,理論上這是一個「垃圾」值,但實際上,因爲這是第一次使用該地址,所以它是0,因此for循環中的代碼永遠不會執行。確保你所有的循環遵循這個規則。