Oppure

Loading
21/10/12 13:23
tullio1995
#include <stdio.h>
int main() {
	int rpm,cpm,rsm,csm;
	printf("Inserisci le righe della prima matrice\n");
	scanf("%d",&rpm);
    printf("Inserisci le colonne della prima matrice\n");
	scanf("%d",&cpm);
	printf("Inserisci le righe della secondamatrice\n");
	scanf("%d",&rsm);
	printf("Inserisci le colonne della seconda matrice\n");
	scanf("%d",&csm);
	if (cpm!=rsm){
		printf("Il prodotto non si può fare!\n");
	} else{
	double pm[rpm][cpm],sm[rsm][csm];
	int i,j;
	for (i=0;i<rpm;i++){ //carica prima matrice
		for(j=0;j<cpm;j++){
		printf("(Prima matrice)Inserisci il valore della pos. %d,%d ",i+1,j+1);
		scanf("%lf",&pm[i][j]);
		} //next i
	} //next j
	for (i=0;i<rsm;i++){ //carica seconda matrice
		for(j=0;j<csm;j++){
		printf("(Seconda matrice)Inserisci il valore della pos. %d,%d ",i+1,j+1);
		scanf("%lf",&sm[i][j]);
		} //next i
	} //next j
	double mr[rpm][csm],mp[cpm],p;
	int x,c;
	x=0;
	for (i=0;i<rpm;i++){
		p=0;
		for (j=0;j<csm;i++){
		mp[j]=pm[i][j]*sm[j][i];
		}
		for (c=0;i<cpm;c++){
			p=p+mp[c];
		}
		mr[i][x]=p;
		x++;
	}
	for (i=0;i<rpm;i++){
		for(j=0;j<csm;j++){
		printf("%lf ",mr[i][j]);
	}
	printf("\n");
}
	}  //else
	return 0;
}

questo codice "dovrebbe" calcolare il prodotto di due matrici, ma dopo la carica delle matrici, il programma esce con l'errore di segmention fault. come risolverlo?
aaa
21/10/12 14:10
dmr
Non l'ho compilato però l'ho letto molto velocemente e ho visto che nella riga 34 c'è un ciclo infinito perchè non incrementi j.
Ultima modifica effettuata da dmr 21/10/12 14:39
aaa
21/10/12 17:12
carlduke
per prima cosa non puoi dichiarare le matrici in questo modo:

double pm[rpm][cpm],sm[rsm][csm];


poiche le dimensioni rpm,cpm,rsm,csm non sono note al momento della compilazione, ma solo durante l'esecuzione percio' devi dichiararle dinamicamente

double *pm = (double*)malloc(sizeof(double)*rpm*cpm);
double *sm = (double*)malloc(sizeof(double)*rsm*csm);


se non ti e' chiaro cosa fa questo codice, semplicemente allora uno spazio in memoria per ogni matrice abbastanza grande da contenere n-elementi (dove n e' il prodotto rpm*cpm quindi il numero di elementi della matrice, moltiplicato per il numero di byte che occupa in memoria un double: sizeof(double) )

percui il tuo codice diventa cosi:

#include <stdio.h>

int main() 
{
        int rpm,cpm,rsm,csm;

        printf("Inserisci le righe della prima matrice\n");
        scanf("%d",&rpm);
        printf("Inserisci le colonne della prima matrice\n");
        scanf("%d",&cpm);


        printf("Inserisci le righe della seconda matrice\n");
        scanf("%d",&rsm);
        printf("Inserisci le colonne della seconda matrice\n");
        scanf("%d",&csm);

        if (cpm != rsm)
        {
                 printf("Il prodotto non si può fare!\n");
        }
        else
       {
        double *pm = (double*)malloc(sizeof(double)*rpm*cpm);
        double *sm = (double*)malloc(sizeof(double)*rsm*csm);
        
        int i,j;

        for (i=0;i<rpm;i++)
        { //carica prima matrice
             for(j=0;j<cpm;j++)
             {
                printf("(Prima matrice)Inserisci il valore della pos. %d,%d ",i+1,j+1);
                scanf("%lf",&pm[i][j]);
              } //next i
        } //next j

        for (i=0;i<rsm;i++)
        { //carica seconda matrice
              for(j=0;j<csm;j++)
             {
                printf("(Seconda matrice)Inserisci il valore della pos. %d,%d ",i+1,j+1);
                scanf("%lf",&sm[i][j]);
              } //next i
        } //next j

        double *mr = (double*)malloc(sizeof(double)*rpm*csm);
        double *mp = (double*)malloc(sizeof(double)*cpm);
        double p;

        int x,c;
        x=0;
        for (i=0;i<rpm;i++)
       {
                p=0;
                for (j=0;j<csm;j++)
               {
                 mp[j]=pm[i][j]*sm[j][i];
               }
                for (c=0;c<cpm;c++)
               {
                        p=p+mp[c];
                }
                mr[i][x]=p;
                x++;
        }

        for (i=0;i<rpm;i++)
       {
                for(j=0;j<csm;j++)
               {
                  printf("%lf ",mr[i][j]);
               }
        printf("\n");
       }

        free(pm); //Libero la memoria allocata precedentemente
        free(sm);
        free(mr);
        free(mp);
        }  //else
        return 0;
}



non ho controllato l'algoritmo di moltiplicazione delle matrici, mi sono solo limitato a correggere gli errori che ti ho detto (inoltre la riga 34 e la riga 37 erano sbagliate perche' creavano dei cicli infiniti)
per lo meno ora non dovrebbe piu' andare in segmentation fault :k:
aaa
21/10/12 18:09
pierotofy
Postato originariamente da carlduke:

per prima cosa non puoi dichiarare le matrici in questo modo:

double pm[rpm][cpm],sm[rsm][csm];


poiche le dimensioni rpm,cpm,rsm,csm non sono note al momento della compilazione, ma solo durante l'esecuzione percio' devi dichiararle dinamicamente


Per essere precisi questo dipende dal compilatore... nello standard C99 gli array di lunghezza variabile sono possibili.

gcc.gnu.org/onlinedocs/gcc/…
Il mio blog: piero.dev
21/10/12 18:10
tullio1995
Carl ora da una marea di errori : "error: subscripted value is neither array nor pointer nor vector"
Ecco i pnti dove da errore : (32,35) (41,35) (56,29) (56,38) (62,21) (70,28) e poi ci sono alcuni warning quando uso gli scanf
aaa
21/10/12 18:13
tullio1995
Io uso geany su ubuntu per scrivere e compilare, credo faccia una specie di debug
aaa
21/10/12 18:13
pierotofy
Poi qui:

int mp[cpm];
//....

for (j=0;j<csm;i++){
    mp[j]=pm[i][j]*sm[j][i];
}


mp ha lunghezza cpm, ma poi iteri per csm... e incrementi i invece di j. :nono:
Il mio blog: piero.dev
21/10/12 18:20
carlduke
Postato originariamente da tullio1995:

Carl ora da una marea di errori : "error: subscripted value is neither array nor pointer nor vector"
Ecco i pnti dove da errore : (32,35) (41,35) (56,29) (56,38) (62,21) (70,28) e poi ci sono alcuni warning quando uso gli scanf


beh si perche' dichiarando le matrici in quella maniera non hai piu' un vettore bidimensionale [righe][colonne], ma solamente un array [righe*colonne],
quindi o dichiari come vettore bidimensionale (ti consiglio sempre dinamicamente cosi' il tuo codice e' portabile su tutti i compilatori senza modifiche) oppure quando devi prelevare un elemento riga-colonna dalla matrice, vai a prelevare l'elemento corrispondente sull'array che e' dato da riga*numero_totale_righe + colonna;
aaa