Strano comportamento programma prodotto matrici

di il
2 risposte

Strano comportamento programma prodotto matrici

Cercavo di implementare una funzione per il prodotto tra matrici e l'algoritmo credo di averlo trovato, il programma non dà errori nè warning il problema è che sembra stampare a video gli indirizzi dei vari elementi della matrice prodotto e non gli elementi (la matrice prodotto viene comunque con le dimensioni giuste). Credetemi, ho provato a controllare bene che eventuali & fossero messi nel posto giusto ma non ne vengo a capo. Se qualcuno riuscisse a darmi una mano gliene sarei veramente grato... Ho usato Code::Blocks.
Ecco il programma:
#include <stdio.h>
#include <stdlib.h>

typedef struct{  //struttura usata per contenere le dimensioni di una matrice
  int r;          //numero righe
  int c;          //numero colonne
} dim;



int **ProdMat(int **, int **, dim, dim);


int **ProdMat(int **M1, int **M2, dim m1, dim m2)
{
    int i,h,k;
    int **ris;
    dim dimris;
    if(m1.c!=m2.r){printf("Impossibile svolgere il prodotto"); exit(-1);}
    dimris.r=m1.r;
    dimris.c=m2.c;
    if ((ris=(int**)malloc(dimris.r*sizeof(int*)))==NULL)
        {printf("Impossibile allocare righe della matrice prodotto"); exit(-1);}
    for (i=0; i<dimris.r; i++){
        if((ris[i]=(int*)malloc(dimris.c*sizeof(int)))==NULL)
           {printf("Impossibile allocare le colonne della matrice prodotto"); exit(-1);}
    }
    for(h=0; h<dimris.r; h++){
        for(k=0; k<dimris.c; k++){
             for(i=0; i<m1.c; i++){
                 ris[h][k]+=M1[h][i]*M2[i][k];
             }
        }

    }
    return(ris);
}


int main()
{
    int** A1, **A2, **MatRis;
    int i,j;
    dim a1, a2, dimris;
    printf("Inserisci il numero di righe della prima matrice\n");
    scanf("%d",&a1.r);
    printf("Inserisci il numero di colonne della prima matrice\n");
    scanf("%d",&a1.c);
    printf("Inserisci il numero di righe della seconda matrice\n");
    scanf("%d",&a2.r);
    printf("Inserisci il numero di colonne della seconda matrice\n");
    scanf("%d",&a2.c);
    if ((A1=(int**)malloc(a1.r*sizeof(int*)))==NULL)
        {printf("Impossibile allocare righe prima matrice"); return(-1);}
    for (i=0; i<a1.r; i++){
        if((A1[i]=(int*)malloc(a1.c*sizeof(int)))==NULL)
           {printf("Impossibile allocare le colonne della prima matrice"); return(-1);}
    }
    if ((A2=(int**)malloc(a2.r*sizeof(int*)))==NULL)
        {printf("Impossibile allocare righe seconda matrice"); return(-1);}
    for (i=0; i<a2.r; i++){
        if((A2[i]=(int*)malloc(a2.c*sizeof(int)))==NULL)
           {printf("Impossibile allocare le colonne della seconda matrice"); return(-1);}
    }
    dimris.r=a1.r;
    dimris.c=a2.c;
    for (i=0; i<a1.r; i++){
        for(j=0; j<a1.c; j++){
            printf("Inserisci A1[%d][%d]\n",i,j);
            scanf("%d", &A1[i][j] );
        }
    }
    for (i=0; i<a2.r; i++){
        for(j=0; j<a2.c; j++){
            printf("Inserisci A2[%d][%d]\n",i,j);
            scanf("%d", &A2[i][j] );
        }
    }
    MatRis=ProdMat(A1, A2, a1, a2);
    for (i=0; i<dimris.r; i++){
        for(j=0; j<dimris.c; j++){
            printf("  %d  ",MatRis[i][j] );
        }
        printf("\n\n");
    }
    for(i=0; i<a1.r; i++) free(A1[i]);
    free(A1);
    for(i=0; i<a2.r; i++) free(A2[i]);
    free(A2);
    for(i=0; i<dimris.r; i++) free(MatRis[i]);
    free(MatRis);
    system("pause");
    return 0;
}

2 Risposte

  • Re: Strano comportamento programma prodotto matrici

    Dimentichi di azzerare gli elementi della matrice di destinazione prima di usarli
    
        for(h=0; h<dimris.r; h++){
            for(k=0; k<dimris.c; k++)
    		{
    			ris[h][k]=0;  // Necessario se lo usi per fare una somma ...
             for(i=0; i<m1.c; i++)
    			{
                ris[h][k]+=M1[h][i]*M2[i][k];
             }
            }
        }
    
  • Re: Strano comportamento programma prodotto matrici

    E' vero, me la sono proprio dormita, e mi ero fissato pensando che fossero indirizzi -.- ora sembra che funzioni, vengono numeri credibili, testerò un minimo l'algoritmo ma quello mi convinceva, grazie mille oregon
Devi accedere o registrarti per scrivere nel forum
2 risposte