This is a discussion on Threads\Process within the C Programming forums, part of the General Programming Boards category; Can somebody help me out? -------------------------------------- Input: Square matrix A of nxn integers, where n is even. Rotate the elements ...

Can somebody help me out?
--------------------------------------
Input: Square matrix A of nxn integers, where n is even.

Rotate the elements of both diagonals in the clock direction.

Input matrix 4x4

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

Matrix 4x4 after rotation:

13 2 3 1
5 10 6 8
9 11 7 12
16 14 15 4

Rotation is executed by 2n threads/processes.
One quarter n/2 of threads/processes can
read data from the upper half of the
main diagonal (e.g. 4,7) and write them
to the lower half of the secondary diagonal (e.g. 11,16).
the lower half of the secondary diagonal (e.g. 11,16) and
write them to the lower half of the main diagonal (e.g. 10,13).
lower half of the main diagonal (e.g. 10,13) and write them to
the upper half of the secondary diagonal (e.g. 1,6). The last
the secondary diagonal (e.g. 1,6) and write them to the upper
half of the main diagonal (e.g. 4,7).

Output: Input and output matrix.

-------------------------------
I've tried to begin the code so just pick out some mistakes and correct so that it can work..Thanks
----------------------------------
Code:
Code:
```#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <math.h>

int Elmnt[10000];
int **tmp;
int m, n, Elmntsize, t, k, kAbs;

/////////////////////////////////////
void Print () {
int i;
for(i=0; i<Elmntsize; i++){
if((i+1)%n == 0 && i != 0) {
printf("%d\n",Elmnt[i]);
}
else
printf("%d ",Elmnt[i]);
}
printf("\n");
}

////////////////////////////////
FILE *f;
int i;
f = fopen(fname, "r");
if (f == NULL) {
fprintf(stderr, "file \"%s\" cannot open.\n", fname);
return -1;
}
fscanf(f,"%d %d",&m, &n);
Elmntsize = m*n;
for (i=0; i < Elmntsize; i++){
fscanf(f,"%d",&Elmnt[i]);
}
fclose(f);
return 0;
}

////////////////////////////////////////////////////////
//       Find the average number of threads  //
int avgCntRwTh(){
if(m == t) return 1;
if(t == 1) return m;
return floor((float)m/t+0.5);
}

/////////////////////////////////////////////////////////////////////////
//   SHift of auxiliary tmp to new position(for right rotation)      //
void tmpShiftRR(int id, int iL){
int i, preID;
if(id == 0) preID = t-1;
else preID = id-1;
for (i=0; i<kAbs; i++){
Elmnt[iL+i]= tmp[preID][kAbs-1-i];
}
}
----------------------------------------
//       right rotation function      //
----------------------------------------
void RotationR(int id, int iL, int iR){
int i;
for (i=0; i<kAbs; i++){
tmp[id][i] = Elmnt[iR-i];
}
for (i=iR-kAbs; i>=iL; i--){
Elmnt[i+kAbs] = Elmnt[i];
}
if(id == t-1) {
tmpShift(id, iL);
}
else {
tmpShiftRR(id, iL);
}
}
---------------------------------------
//       Left rotation function      //
---------------------------------------
void RotationL(int id, int iL, int iR){
int i;
for (i=0; i<kAbs; i++){ tmp[id][i] = Elmnt[iL+i]; }
for (i=iL; i<=iR; i++){ Elmnt[i] = Elmnt[i+kAbs];  }
if(id == t-1) {
tmpShiftRL(id, iR);
}
else {
tmpShiftRL(id, iR);
}
}

--------------------
//  rotate      //
--------------------
int id, cntR, pocR, konR, iL, iR;
printf("The working Thread is number: %d\n", id+1);
cntR = avgCntRwTh();                         // To find out how many rows to be worked on average amount
pocR = (id)*cntR+1;                          // To provide rows where to begin rotation
if(id == t-1) {
cntR = m - (t-1)*cntR;
sleep(1);
}     // For the Last thread of the remaining rows.
konR = pocR+cntR -1;
printf("     - This Threa is working with rows: %d-%d\n", pocR, konR);
//
iL = (pocR-1)*n;           //First element of respective Thread
iR = konR*n -1;            // Last element
//
//
if(k < 0) rotationL(id, iL, iR);              // left
else    rotationR(id, iL, iR);              // right
//
//
return NULL;
}

----------------------------------
//             main            //
-----------------------------------
int main(int argc, char *argv[])
{
char File;
int i, j, kN;

do {
// The reading of data from the file
do {
printf("\nType the name of the file (pro ukonceni programu: -1): ");
scanf("%s", &File);
if(atoi(&File) == -1) exit(0);
}
Print();
// The given number of Thread
do {
printf("Type total number of Threads(1-%d): ", m);
scanf("%d", &t);
if(t == -1) exit(0);
}
while(t < 1 || t > m);

// The number of positions to be rotated
printf("Enter number of positions to be rotated: ");
scanf("%d", &k);
kAbs = abs(k);
if(kAbs > ElmntSize-1 && k >= 0) kAbs = kAbs %ElmntSize;      // oriznuti kroku na velikost pole
if(kAbs > ElmntSize && k < 0) kAbs = kAbs %ElmntSize;
kN = kAbs /n;                                                 // pocet presahu na dalsi radek
kAbs = kAbs %n;                                               // total number of positions during the first pass
// alokovani pomocneho 2d pole pro pomocne presuny
tmp = (int **)malloc(t*sizeof(int*));
for(i=0; i<t; i++)
tmp[i]=(int *)malloc(n*sizeof(int));

for (j=0; j<=kN; j++){
if (kAbs == 0) { kAbs = n; continue; }
for(i=0; i<t; i++) {
printf("ERROR:During pthread_cond_init() - number %d\n)", i); exit(-1);
}
if(pthread_create(&ths[i], NULL, rotate, (void *) i)){
printf("ERROR: During thread_create() - number %d\n)", i); exit(-1);
}
usleep(500000);
}
for(i=0; i<t; i++){
}
kAbs = n;
}
free(tmp);
// Rotated array to be printed
printf("\n\nRotated Array:\n");
Print();
printf("--- --- ---\n\n");
sleep(2);
} while (1);
return 0;
}```

2. Does this differ at all from dwks' last post here?