Autor
|
Tema: multiplicar matrices con pipes (Leído 3,550 veces)
|
SO
Desconectado
Mensajes: 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 /*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();
}
|
|
|
En línea
|
|
|
|
Oblivi0n
Desconectado
Mensajes: 392
Odio las ranas.
|
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++){ } } for(i=0;i<n;i++){ for(j=0;j<p;j++){ } } printf("********Matriz A********"); for(i=0;i<m;i++){ for(j=0;j<n;j++){ } } printf("********Matriz B********"); for(i=0;i<n;i++){ for(j=0;j<p;j++){ } } } 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)){ } 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: "); printf("\n De el numero de filas en de la Matriz A: "); printf("\n De el numero de filas en de la Matriz B: "); 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"); } } } /* Creacion de los hijos con las caracteriasticas necesarias*/ for(i=0;i<m;i++){ if(fork()==0){ cerrarpipe(i); hijo_recibe(i); } } crear_matrices(m,n,p); padre_parte_envia_matriz(); padre_obtiene_datos(); }
|
|
|
En línea
|
|
|
|
|
|