| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  04-11-2015, 22:41 | #1 | 
| Junior Member Iscritto dal: May 2013 
					Messaggi: 12
				 | 
				
				[C] Divisione Matrice in blocchi
			 
		Buonasera, devo dividere una matrice di caratteri in blocchi KxN. Mi interessa sapere le coordinate che fanno parte del rettangolo, cioè? A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A se uso blocchi 2x2 dovrei avere le coordinate (0,0) (0,1) (1,0) (1,1); (0,2) (0,3) (1,2) (1,3); ...e così via per tutta la matrice. C'è un modo per rendere la cosa generica dando una matrice qualsiasi e un rettangolo qualsiasi? Lo scopo è cambiare tutte le lettere in B tramite i rettangoli e non scorrendo tutta la matrice | 
|   |   | 
|  05-11-2015, 08:57 | #2 | 
| Junior Member Iscritto dal: May 2013 
					Messaggi: 12
				 | 
		L'esercizio prevede che io con, ad esempio 3 thread devo aggiornare la matrice per blocchi KxN. Spero di essermi spiegato meglio. Mi serve una funzione che divide la matrice in blocchi e li passa ai thread per aggiornarli. Ora provo la tua soluzione e vediamo se riesco Ultima modifica di Scanca : 05-11-2015 alle 09:30. | 
|   |   | 
|  05-11-2015, 11:38 | #3 | 
| Junior Member Iscritto dal: May 2013 
					Messaggi: 12
				 | 
		Ho capito, molto gentile    Ma se volessi creare un thread che crea una lista di task e un thread che accede alla lista dei task per aggiornarli come potrei fare? Ti metto il codice su cui sto lavorando, è una matrice di numeri ma il concetto è lo stesso. Codice: /* File: matrici.c */
/* Lettura e stampa di matrici
   Illustra uso di array multidimensionali in C
*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define RIG 10
#define COL 10
#define K 2
#define N 2
int mat[RIG][COL];
/**struttura coordinata*/
typedef struct coord_t {
  
  int x;
  int y;	
    	
} coord_t;
/**struttura del task*/
typedef struct task_t {
  
  int id;
  struct coord_t* m[K][N];	
  struct task_t* next;
    	
} task_t;
/**struttura lista dei task*/
typedef task_t* lista_t;
lista_t insertList (lista_t l, int id){
	lista_t aux = l;
	task_t* e = NULL;
	coord_t* temp=NULL;
	int i=0,j=0;
	if((e = malloc(sizeof(task_t)))==NULL){
		printf("Errore Malloc\n");
	}
	
	for(i = 0; i < K; i++) {
		for(j = 0; j < N; j++){
			
			if((temp = malloc(sizeof(coord_t)))==NULL){
				printf("Errore Malloc\n");
			}
			e->m[i][j]=temp;
		}
	}
	e->id=id;
	e->next = NULL;
	if(l == NULL){
		l = e;
		return l;	
	}else{
		l = e;
		l->next = aux;
		return l;
	}
}
static void StampaList(lista_t l){
	
	lista_t aux = l;
	int i=0,j=0;
	
	if(l == NULL)
		printf("lista -->\n");
	else
		printf("lista -->");
		while(aux != NULL){
			for(i = 0; i < K; i++) {
				for(j = 0; j < N; j++)
	 				printf("id=%d", aux->id);
			}
			printf(" * ");
			aux = aux->next;
		}
		printf("\n");
}
void stampaM(void){
	int i,j;
	printf("La matrice e':\n");
	for(i = 0; i < RIG; i++) {
		for(j = 0; j < COL; j++)
	 		 printf("%d ", mat[i][j]);
		printf("\n");
	}
}
/** Thread Collector  
 	di aggionamento della matrice che scandisce la lista e aggiorna (mette 1) in base alle coordinate 
 */
static void* worker(void* arg){
	
	
}
/*Funzione che crea la lista dei task già allocata*/
void DividiMatrice(int nBlocchi){
	int i=0,j=0;
	int bc=(COL/N);
	int br=(RIG/K);
	int a=0,b=0;
	int n=1;	
	
	for(i = 0; i < RIG; i++) {
		for(j = 0; j < COL; j++){
	 		
	 		a=i/K;
	 		b=j/N;
			/*Voglio mettere le coordinate giuste nella coda dei task*/
	 		
	 	}		
	}	
}
/** Thread Collector
	crea la lista dei task dalla matrice   
 */
static void* collector(void* arg){
	
	int i=0,j=0;
	lista_t l=NULL;
	lista_t aux=NULL;
  	int n_blocchi=0;
  	
  	n_blocchi=((RIG/2)*(COL/2));
  	printf("n_blocchi=%d\n", n_blocchi);
  	
	while(n_blocchi > 0){
		l=insertList(l,n_blocchi-1);
		n_blocchi--;
	}
	
	DividiMatrice(((RIG/2)*(COL/2)));
	
}
int main(void)
{
		int i, j;
		int k=2,n=2;
		pthread_t w;
		pthread_t c;
		int status;
		/* lettura matrice */
		printf("Lettura matrice %dX%d;\n", RIG, COL);
		for(i = 0; i < RIG; i++)
			for(j = 0; j < COL; j++)
		  		mat[i][j]=0;
		stampaM();
	  
		pthread_create(&w, NULL, &worker, NULL);
		pthread_create(&c, NULL, &collector, NULL);
		pthread_join(c,(void*) &status);
		pthread_join(w,(void*) &status);
				
  return 0;
} | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 16:46.









 
		 
		 
		 
		





 
  
 



 
                        
                        










