Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - SO

#1
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();


        }