Προς το περιεχόμενο
  • 0

Ασκηση Προγραμματισμου...


GamatosN12

Ερώτηση

Επειδη δεν τα παω και πολυ καλα με τον προγραμματισμο θα ηθελα απο καποιον να με βοηθησει οσο μπορει με μια ασκηση που εχω...

 

Η εκφωνηση

 

Θα πρέπει να γράψετε ένα πρόγραμμα C το οποίο θα εκτελεί πολλαπλασιασμό πινάκων με χρήση διεργασιών που θα επικοινωνούν μεταξύ τους με pipes. Αρχικά το πρόγραμμα θα αποτελείται από 1 διεργασία από την οποία θα δημιουργηθούν τόσες θυγατρικές διεργασίες (child processes) όσες είναι οι γραμμές του πρώτου πίνακα που θα δώσει ο χρήστης. Οι θυγατρικές διεργασίες θα δημιουργηθούν με την βοήθεια του system call fork. Κάθε μια από τις θυγατρικές διεργασίες θα υπολογίζει και μία ολόκληρη γραμμή για τον πίνακα. Από κάθε pipe που ανοίγει μεταξύ 2 διεργασιών η πατρική διεργασία στέλνει τα δεδομένα των γραμμών και των στηλών που απαιτούνται, ενώ περιμένει να λάβει και τη γραμμή που αποτελεί την απάντηση για το νέο πίνακα γινόμενο.

 

 

 

Ο Κωδικας μου...

 

 

 

#include <stdio.h>

#include <unistd.h>

#define MAXBUFF 1024

#include <stdlib.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <string.h>

 

main()

{

int n;

int childpid, pipe1[2], pipe2[2];

int array1[2][3], array2[3][2], arrayResult[2][2]= {};

 

const size_t ARRAY1_LINES= sizeof(array1)/ sizeof(*array1);

const size_t ARRAY1_COLUMNS= sizeof(*array1)/ sizeof(**array1);

 

 

const size_t ARRAY_RESULT_LINES= sizeof(arrayResult)/ sizeof(*arrayResult);

const size_t ARRAY_RESULT_COLUMNS= sizeof(*arrayResult)/ sizeof(**arrayResult);

 

 

unsigned long i, j, k;

 

if (pipe(pipe1) < 0 || pipe(pipe2) < 0)

printf("can't create pipes\n");

 

if ((childpid = fork()) < 0)

{

printf("can't fork\n");

}

else if (childpid > 0)

{ /* parent */

close(pipe2[1]);

close(pipe1[0]);

for(i= 0; i< ARRAY1_LINES; ++i){

for (j= 0; j< ARRAY1_COLUMNS; ++j)

{

printf("array1[%lu][%lu]: ", i+ 1, j+ 1);

 

scanf("%d", &array1[j]);

}

}

printf("\n\nDose ta stoixeia tou pinaka array2[%lu][%lu]\n\n",

(unsigned long) ARRAY1_COLUMNS, (unsigned long) ARRAY1_LINES);

 

 

for(i= 0; i< ARRAY1_COLUMNS; ++i)

for (j= 0; j< ARRAY1_LINES; ++j)

{

printf("array2[%lu][%lu]: ", i+ 1, j+ 1);

 

scanf("%d", &array2[j]);

}

write(pipe1[1],array1[j],strlen(array1[j]);

wait(0);

write(pipe1[1],array2[j],strlen(array2[j]);

wait(0);

for(k=1;k<=n-1;k++){

if ((childpid = fork()) < 0)

{

printf("can't fork\n");

}

else if (childpid > 0)

{ /* parent */

close(pipe2[1]);

close(pipe1[0]);

 

}

}

}else{

close;

for(i= 0; i< ARRAY_RESULT_LINES; ++i)

for(j= 0; j< ARRAY_RESULT_COLUMNS; ++j)

for(k= 0; k< ARRAY1_COLUMNS; ++k)

arrayResult[j]+= array1[k]* array2[k][j];

 

 

printf("\n\nO telikos pinakas arrayResult[%lu][%lu] einai:\n\n",

(unsigned long)ARRAY_RESULT_LINES, (unsigned long)ARRAY_RESULT_COLUMNS);

 

for(i= 0; i< ARRAY_RESULT_LINES; ++i)

for(j= 0; j< ARRAY_RESULT_COLUMNS; ++j)

printf("arrayResult[%lu][%lu]= %d\n", i+ 1, j+ 1, arrayResult[j]);

 

puts("");

}

 

system("PAUSE");

 

}

 

Δεν εχω Linux και τον εχω γραψει σε Windows αλλα σιγουρα δεν ειναι σωστη και θελω βοηθεια... Ευχαριστω!!!

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

2 απαντήσεις σε αυτή την ερώτηση

Προτεινόμενες αναρτήσεις

  • 0

Για να προγραμματίσεις με pipes χρειάζεσαι Linux. Δε το γλυτώνεις. Συμβουλή μου, στήσε ένα virtual machine (πχ με virtual box), βαλε μια "ευκολη" διανομή λινουξ (πχ Mint), εγακτεστησε gcc, ίσως και κανένα γραφικό IDE αν και δε το χρειάζεσαι για τόσο απλή εργασια, και κάνε παιχνίδι εκεί.

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.