View Full Version : [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
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
Ho capito, molto gentile :D
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.
/* 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;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.