multiplicar matrices con pipes

Iniciado por SO, 10 Octubre 2010, 07:18 AM

0 Miembros y 1 Visitante están viendo este tema.

SO

Hola!! Necesito ayuda, mi programa debe multiplicar dos matrices utilizando pipes pero la verdad no tengo idea de como hacerlo , he avanzado un poco pero aun falta mucho por hacer... Espero me puedan ayudar a completar mi codigo...

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>


int m,n,p; /*Variables que contendran las dimensiones de las matrice*/
int **matdfA,**matdfB;
int **matA,**matB,*matresultado;



/*-----------------------Funciones----------------------*/

/*La funcion cerrarpipe permitira como bien dice su nombre
cerrar las entradas no utilizadas*/
void cerrarpipe(int a){  /*el parametro i es la pipe utilizada*/
    int j;
    for(j=0;j<m;j++){
        if(j!=a){
            close(matdfA[j][0]);  /*cerramos tanto la parte de lectura como de escritura de las pipes no utilizadas*/
            close(matdfA[j][1]);
            //close(matdfA[j]);
            close(matdfB[j][0]);
            close(matdfB[j][1]);
            //close(matdfB[j]);
        }

    }
}
void padre_parte_envia_matriz(){

    /* Creacion del buffer*/
    int j,k, *bufr;
    for(j=0;j>m;j++){
        for(k=0;k<n;k++){
            //bufr[k]=matA[j][k];
            bufr[k]=matA[j][k];
        }
        write(matdfA[j][1],bufr,sizeof(bufr));
    }

}
/*Leeremos los datos y asignaremos estos al buffer*/
void hijo_recibe(int i){
    int *bufr,*resultado;
    read(matdfA
  • ,bufr,sizeof(bufr));
        /*Procesamiento del buffer*/
        write(matdfB[1],resultado,sizeof(resultado));
    }
    /*Creacion de las matrices iniciales aleatoriamente e impresion*/
    void crear_matrices(int m, int n, int p){
        int i,j;
        //matA=(int *)malloc(sizeof(int*)*m);
        //for(i=0;i<m;i++){
        //    matA=(int *)malloc(sizeof(int*)*n);
        //}
        for(i=0;i<m;i++){
            for(j=0;j<n;j++){
                matA[j]=rand()%9;
                }
        }
        for(i=0;i<n;i++){
            for(j=0;j<p;j++){
                matB[j]=rand()%9;
                }
        }
        printf("********Matriz A********");
        for(i=0;i<m;i++){
            for(j=0;j<n;j++){
                printf("%d",matA[j]);
            }
            printf("\n");
        }
        printf("********Matriz B********");
        for(i=0;i<n;i++){
            for(j=0;j<p;j++){
                printf("%d",matB[j]);
            }
            printf("\n");
        }

    }
    void padre_obtiene_datos(){
        fd_set fd;
        int mayor;
        int cont,j,i;
        mayor=matdfB[0][0];
        for(i=1;i<m;i++){
            if(mayor<matdfB
    • ){
                  mayor=matdfB
      • ;
                }
            }
            do{
                    FD_ZERO(&fd);
                    for(j=0;j<m;j++){
                    FD_SET(matdfB[j][0],&fd);
                    }
                    if(select(mayor+1,&fd,NULL,NULL,NULL)){
                        perror("Select");
                    }
                    else{
                        for(j=0;j<m;j++){
                                if(FD_ISSET(matdfB[j][0],&fd)){
                                    /* ..........*/
                                }
                                else{
                                read(matdfB[j][0],matresultado,sizeof(matresultado));
                                cont++;
                                }
                        }
                    }
            }while(cont<m);
        }

        int main(){

            int i;
            int j;
            /*Peticion de las dimensiones para la creacion de matrices */
            printf("De el numero de columnas en de la Matriz A: ");
            scanf("%d",&n);
            printf("\n De el numero de filas en de la Matriz A: ");
            scanf("%d",&m);
            printf("\n De el numero de filas en de la Matriz B: ");
            scanf("%d",&p);
                matdfA=(int **)malloc(sizeof(int *)*m);
           
            for(i=0;i<m;i++){
                matdfA=(int *)malloc(sizeof(int)*2);
                matdfB=(int *)malloc(sizeof(int)*2);
                for(j=0;j<m;j++){
                    if(pipe(matdfA[j]<0) || pipe(matdfB[j]<0)){
                        perror("Error creando pipes");
                        exit(0);
                    }
                }
            }
        /* Creacion de los hijos con las caracteriasticas necesarias*/
            for(i=0;i<m;i++){
                if(fork()==0){
                    cerrarpipe(i);
                    hijo_recibe(i);
                    exit(0);
                }
            }
            crear_matrices(m,n,p);
            padre_parte_envia_matriz();
            padre_obtiene_datos();


        }

Oblivi0n

Seria bueno que metieses el codigo en las etiquetas correspondientes...
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>


int m,n,p; /*Variables que contendran las dimensiones de las matrice*/
int **matdfA,**matdfB;
int **matA,**matB,*matresultado;



/*-----------------------Funciones----------------------*/

/*La funcion cerrarpipe permitira como bien dice su nombre
cerrar las entradas no utilizadas*/
void cerrarpipe(int a){  /*el parametro i es la pipe utilizada*/
    int j;
    for(j=0;j<m;j++){
        if(j!=a){
            close(matdfA[j][0]);  /*cerramos tanto la parte de lectura como de escritura de las pipes no utilizadas*/
            close(matdfA[j][1]);
            //close(matdfA[j]);
            close(matdfB[j][0]);
            close(matdfB[j][1]);
            //close(matdfB[j]);
        }

    }
}
void padre_parte_envia_matriz(){

    /* Creacion del buffer*/
    int j,k, *bufr;
    for(j=0;j>m;j++){
        for(k=0;k<n;k++){
            //bufr[k]=matA[j][k];
            bufr[k]=matA[j][k];
        }
        write(matdfA[j][1],bufr,sizeof(bufr));
    }

}
/*Leeremos los datos y asignaremos estos al buffer*/
void hijo_recibe(int i){
    int *bufr,*resultado;
    read(matdfA
,bufr,sizeof(bufr));
    /*Procesamiento del buffer*/
    write(matdfB[1],resultado,sizeof(resultado));
}
/*Creacion de las matrices iniciales aleatoriamente e impresion*/
void crear_matrices(int m, int n, int p){
    int i,j;
    //matA=(int *)malloc(sizeof(int*)*m);
    //for(i=0;i<m;i++){
    //    matA=(int *)malloc(sizeof(int*)*n);
    //}
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            matA[j]=rand()%9;
            }
    }
    for(i=0;i<n;i++){
        for(j=0;j<p;j++){
            matB[j]=rand()%9;
            }
    }
    printf("********Matriz A********");
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            printf("%d",matA[j]);
        }
        printf("\n");
    }
    printf("********Matriz B********");
    for(i=0;i<n;i++){
        for(j=0;j<p;j++){
            printf("%d",matB[j]);
        }
        printf("\n");
    }

}
void padre_obtiene_datos(){
    fd_set fd;
    int mayor;
    int cont,j,i;
    mayor=matdfB[0][0];
    for(i=1;i<m;i++){
        if(mayor<matdfB
){
            mayor=matdfB
;
        }
    }
    do{
            FD_ZERO(&fd);
            for(j=0;j<m;j++){
            FD_SET(matdfB[j][0],&fd);
            }
            if(select(mayor+1,&fd,NULL,NULL,NULL)){
                perror("Select");
            }
            else{
                for(j=0;j<m;j++){
                        if(FD_ISSET(matdfB[j][0],&fd)){
                            /* ..........*/
                        }
                        else{
                        read(matdfB[j][0],matresultado,sizeof(matresultado));
                        cont++;
                        }
                }
            }
    }while(cont<m);
}

int main(){

    int i;
    int j;
    /*Peticion de las dimensiones para la creacion de matrices */
    printf("De el numero de columnas en de la Matriz A: ");
    scanf("%d",&n);
    printf("\n De el numero de filas en de la Matriz A: ");
    scanf("%d",&m);
    printf("\n De el numero de filas en de la Matriz B: ");
    scanf("%d",&p);
        matdfA=(int **)malloc(sizeof(int *)*m);
   
    for(i=0;i<m;i++){
        matdfA=(int *)malloc(sizeof(int)*2);
        matdfB=(int *)malloc(sizeof(int)*2);
        for(j=0;j<m;j++){
            if(pipe(matdfA[j]<0) || pipe(matdfB[j]<0)){
                perror("Error creando pipes");
                exit(0);
            }
        }
    }
/* Creacion de los hijos con las caracteriasticas necesarias*/
    for(i=0;i<m;i++){
        if(fork()==0){
            cerrarpipe(i);
            hijo_recibe(i);
            exit(0);
        }
    }
    crear_matrices(m,n,p);
    padre_parte_envia_matriz();
    padre_obtiene_datos();


}