06/09/18 9:14
comtel
Buongiorno ragazzi, so che sto inondando il forum di richieste riguardanti il C, ma scrivendo un piccolo codice per il prodotto riga per colonna tra due matrici utilizzando gli interi generati pseudocasualmente come elementi della matrice mi sono imbattuto in questo tipo di errore logico, ossia che la matrice risultante non è quella che ci si aspettava che sia. Il problema poteva stare proprio nell'elaborazione della funzione, ma l'esercizio è una versione successiva ad un altro esercizio uguale utilizzando i float come elementi pseudocasuali delle due matrici, ed in questo caso funziona perfettamente. Non so il perchè, ho anche provato ad utilizzare la calloc piuttosto che la malloc.
Inoltre vorrei sapere cosa si intende per allocazione della matrice per colonne.. Cioè, ho inteso come si visualizza una matrice per colonne, ma per allocarla non bisogna comunque utilizzare la malloc o la calloc specificando la lunghezza della porzione di memoria, ossia M*N*sizeof(tipo) indifferentemente dal tipo di allocazione della matrice ?!
#include <stdio.h> #include <stdlib.h> #include <time.h> int * row_allocation(int *, int *, int, int, int, int); int main(int argc, char *argv[]) { int row1 = atoi(argv[1]), col1 = atoi(argv[2]), row2 = atoi(argv[3]), col2 = atoi(argv[4]); int *mat1 = (int *)malloc(row1*col1*sizeof(int)); int *mat2 = (int *)malloc(row2*col2*sizeof(int)); int i, j; srand((unsigned int)time(NULL)); printf("\nPrima matrice:\n"); for(i = 0; i < row1; i++) { for(j = 0; j < col1; j++) { *(mat1 + i*row1 + j) = ((int)rand())/((int)RAND_MAX/50); printf("%d\t", *(mat1 + i*row1 + j)); } printf("\n"); } printf("\nSeconda matrice:\n"); for(i = 0; i < row2; i++) { for(j = 0; j < col2; j++) { *(mat2 + i*row2 + j) = ((int)rand())/((int)RAND_MAX/50); printf("%d\t", *(mat2 + i*row2 + j)); } printf("\n"); } printf("\nMatrice prodotta per righe:\n"); int *mt3 = row_allocation(mat1, mat2, row1, row2, col1, col2); for(i = 0; i < row1; i++) { for(j = 0; j < col2; j++) { printf("%d\t", *(mt3 + i*row1 + j)); } printf("\n"); } free(mat1); free(mat2); free(mt3); } int * row_allocation(int *mat1, int *mat2, int row1, int row2, int col1, int col2) { int *mat3 = (int *)malloc(row1*col2*sizeof(int)), i, j, z; for(i = 0; i < row1; i++) { for(j = 0; j < col2; j++) { for(z = 0; z < row2; z++) { *(mat3 + i*row1 + j) += (*(mat1 + i*row2 + z)) * (*(mat2 + z*col2 + j)); } printf("%d\t", *(mat3 + i*row1 + j)); } printf("\n"); } printf("\n\n"); return mat3; }
Inoltre vorrei sapere cosa si intende per allocazione della matrice per colonne.. Cioè, ho inteso come si visualizza una matrice per colonne, ma per allocarla non bisogna comunque utilizzare la malloc o la calloc specificando la lunghezza della porzione di memoria, ossia M*N*sizeof(tipo) indifferentemente dal tipo di allocazione della matrice ?!
Ultima modifica effettuata da comtel 06/09/18 9:23
aaa